Autor Wątek: Problem z macierzą VIEW  (Przeczytany 567 razy)

Offline HiddenNick

  • Użytkownik

# Czerwiec 23, 2009, 14:35:43
Nie mogę dojść do tego co jest źle... Próbowałem już na kilka sposobów zrobić ruchomą kamerę, ale efekt jest zawsze inny od zamierzonego:

void SphericalToCartesian(Vector *Out, float Yaw, float Pitch, float R)
{
   float sy = sinf(Yaw), cy = cosf(Yaw);
   float sp = sinf(Pitch), cp = cosf(Pitch);

   Out->x = R * cp * cy;
   Out->y = R * sp;
   Out->z = - R * cp * sy;
}

void CFreeCamera::Update(void)
{
   float time_delta = (float)g_pEngineTimer.GetTimeDelta();

   float mouse_x = (float)g_pPMIterface.GetMouseXMove();
   float mouse_y = (float)g_pPMIterface.GetMouseYMove();

   m_fAngleX += mouse_y * m_fRotateSpeed;
   m_fAngleY += mouse_x * m_fRotateSpeed;

   SphericalToCartesian(&m_vForwardDir, GetAngleY() - MATH_PI, -GetAngleX(), 1.f);

   m_vForwardDir.normalise();

   Vector vRight(0.f,0.f,-1.f);

   vRight = m_vUpDir.cross(m_vForwardDir);
   vRight.normalise();

   if(g_pPMIterface.GetAction(kAction_Forward))
      m_vEyePos += m_vForwardDir * m_fFlySpeed * time_delta;

   if(g_pPMIterface.GetAction(kAction_Backward))
      m_vEyePos -= m_vForwardDir * m_fFlySpeed * time_delta;

   if(g_pPMIterface.GetAction(kAction_Left))
      m_vEyePos -= vRight * m_fFlySpeed * time_delta;

   if(g_pPMIterface.GetAction(kAction_Right))
      m_vEyePos += vRight * m_fFlySpeed * time_delta;
}

D3DXMATRIX d3dmat;
D3DXVECTOR3 eye(pCamera->GetEyePos().x, pCamera->GetEyePos().y, pCamera->GetEyePos().z);
D3DXVECTOR3 at(pCamera->GetForwardDir().x, pCamera->GetForwardDir().y, pCamera->GetForwardDir().z);
D3DXVECTOR3 up(0.f, 1.f, 0.f);

D3DXMatrixLookAtLH(&d3dmat, &eye, &at, &up);

W ten sposób obliczam macierz VIEW. Efekt jest taki, że kamera obraca się wokół środka układu współrzędnych!

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline K'Aviash

  • Użytkownik

# Czerwiec 23, 2009, 14:39:09
Nie mogę dojść do tego co jest źle... Próbowałem już na kilka sposobów zrobić ruchomą kamerę, ale efekt jest zawsze inny od zamierzonego:

void SphericalToCartesian(Vector *Out, float Yaw, float Pitch, float R)
{
   float sy = sinf(Yaw), cy = cosf(Yaw);
   float sp = sinf(Pitch), cp = cosf(Pitch);

   Out->x = R * cp * cy;
   Out->y = R * sp;
   Out->z = - R * cp * sy;
}

void CFreeCamera::Update(void)
{
   float time_delta = (float)g_pEngineTimer.GetTimeDelta();

   float mouse_x = (float)g_pPMIterface.GetMouseXMove();
   float mouse_y = (float)g_pPMIterface.GetMouseYMove();

   m_fAngleX += mouse_y * m_fRotateSpeed;
   m_fAngleY += mouse_x * m_fRotateSpeed;

   SphericalToCartesian(&m_vForwardDir, GetAngleY() - MATH_PI, -GetAngleX(), 1.f);

   m_vForwardDir.normalise();

   Vector vRight(0.f,0.f,-1.f);

   vRight = m_vUpDir.cross(m_vForwardDir);
   vRight.normalise();

   if(g_pPMIterface.GetAction(kAction_Forward))
      m_vEyePos += m_vForwardDir * m_fFlySpeed * time_delta;

   if(g_pPMIterface.GetAction(kAction_Backward))
      m_vEyePos -= m_vForwardDir * m_fFlySpeed * time_delta;

   if(g_pPMIterface.GetAction(kAction_Left))
      m_vEyePos -= vRight * m_fFlySpeed * time_delta;

   if(g_pPMIterface.GetAction(kAction_Right))
      m_vEyePos += vRight * m_fFlySpeed * time_delta;
}

D3DXMATRIX d3dmat;
D3DXVECTOR3 eye(pCamera->GetEyePos().x, pCamera->GetEyePos().y, pCamera->GetEyePos().z);
D3DXVECTOR3 at(pCamera->GetForwardDir().x, pCamera->GetForwardDir().y, pCamera->GetForwardDir().z);
D3DXVECTOR3 up(0.f, 1.f, 0.f);

D3DXMatrixLookAtLH(&d3dmat, &eye, &at, &up);

W ten sposób obliczam macierz VIEW. Efekt jest taki, że kamera obraca się wokół środka układu współrzędnych!

popatrz na to:
http://www.warsztat.gd/articles.php?x=view&id=279

Offline HiddenNick

  • Użytkownik

# Czerwiec 23, 2009, 15:09:59
Ok, nieważne, już sobie poradziłem ;)