投影矩阵推导视锥体的6个面方程式
I've got a camera which is in targeted mode. This camera has a near clip plane distance of 1.0f
and far clip plane distance of 50000.0f
When I look at an object like this, the targeted object is culled, any ideas why?
m_Cam.ChangeTargetView(&D3DXVECTOR3(m_CharObject[5]->GetPos() + D3DXVECTOR3(0, 150, -50)),
&m_CharObject[5]->GetPos());
#include "CCamera.h"
CCamera::CCamera()
{
m_vPos = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vVel = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vLookAt = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vLookAtVel = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vUp = D3DXVECTOR3(0, 1, 0);
m_vTarget = D3DXVECTOR3(0, 0, 0);
D3DXMatrixIdentity(&m_matOrientation);
m_bChangingView = false;
m_fPosS = 0.0f;
m_fLookAtS = 0.0f;
m_fSpeed = 2.0f; // half a second it reaches destination
m_bFreeCamMode = true;
}
void CCamera::Create(float fAspect, float fFar)
{
D3DXMatrixPerspectiveFovLH(&m_matProj,
D3DX_PI/4, fAspect, 1.0f, fFar );
}
void CCamera::Update(float dt, bool bUpdateFrustum)
{
FLOAT fTime;
//dt = 0.01f;
if( dt >= 0.0f )
fTime = dt;
else
fTime = 0.01f;
float fSpeed = 3.0f * fTime;
float fAngularSpeed = 0.1f * fTime;//1.0f*fTime;
// Update the position vector
D3DXVECTOR3 vT = m_vVel * fSpeed;
D3DXVec3TransformNormal( &vT, &vT, &m_matOrientation );
m_vPos += vT;
// Update the yaw-pitch-rotation vector
m_vLookAt += fAngularSpeed * m_vLookAtVel;
if(m_bChangingView)
{
m_fPosS += (m_fSpeed * dt);
m_fLookAtS += (m_fSpeed * dt);
D3DXVec3Lerp(&m_vPos, &m_vStartPos, &m_vEndPos, m_fPosS);
D3DXVec3Lerp(&m_vLookAt, &m_vStartLookAt, &m_vEndLookAt, m_fLookAtS);
if(m_fPosS > 1.0f && m_fLookAtS > 1.0f)
m_bChangingView = false;
}
//m_vPos = m_vStartPos;
//m_vLookAt = m_vStartLookAt;
// Set the view matrix
D3DXQUATERNION qR;
if (m_bFreeCamMode) {
D3DXQuaternionRotationYawPitchRoll(&qR, m_vLookAt.x, m_vLookAt.y, m_vLookAt.z);
D3DXMatrixAffineTransformation(&m_matOrientation, 1.25f, NULL, &qR, &m_vPos);
D3DXMatrixInverse(&m_matView, NULL, &m_matOrientation);
}
else {
//D3DXQuaternionRotationYawPitchRoll(&qR, m_vLookAt.x, m_vLookAt.y, m_vLookAt.z);
//D3DXMatrixAffineTransformation(&m_matOrientation, 1.25f, NULL, &qR, &m_vPos );
D3DXMatrixLookAtLH(&m_matView, &m_vPos, &m_vTarget, &m_vUp);
}
// Decelerate only the camera's position velocity (for smooth motion)
m_vVel *= 0.0f;
m_vLookAtVel *= 0.0f;
// Deceleating the yaw/pitch/roll velocities works great for keyboard control,
// but it gives me motion sickness when used with mouselook, so I commented it out
// and replaced it with multiplication by zero, which disables the velocities.
// Your mileage may vary.
if(bUpdateFrustum)
UpdateFrustum();
}
void CCamera::UpdateFrustum()
{
D3DXMATRIX Matrix;
D3DXMatrixMultiply(&Matrix, &m_matView, &m_matProj);
// Calculate the planes
m_FrustumPlanes[0].a = Matrix._14 + Matrix._13; // Near plane
m_FrustumPlanes[0].b = Matrix._24 + Matrix._23;
m_FrustumPlanes[0].c = Matrix._34 + Matrix._33;
m_FrustumPlanes[0].d = Matrix._44 + Matrix._43;
D3DXPlaneNormalize(&m_FrustumPlanes[0], &m_FrustumPlanes[0]);
m_FrustumPlanes[1].a = Matrix._14 - Matrix._13; // Far plane
m_FrustumPlanes[1].b = Matrix._24 - Matrix._23;
m_FrustumPlanes[1].c = Matrix._34 - Matrix._33;
m_FrustumPlanes[1].d = Matrix._44 - Matrix._43;
D3DXPlaneNormalize(&m_FrustumPlanes[1], &m_FrustumPlanes[1]);
m_FrustumPlanes[2].a = Matrix._14 + Matrix._11; // Left plane
m_FrustumPlanes[2].b = Matrix._24 + Matrix._21;
m_FrustumPlanes[2].c = Matrix._34 + Matrix._31;
m_FrustumPlanes[2].d = Matrix._44 + Matrix._41;
D3DXPlaneNormalize(&m_FrustumPlanes[2], &m_FrustumPlanes[2]);
m_FrustumPlanes[3].a = Matrix._14 - Matrix._11; // Right plane
m_FrustumPlanes[3].b = Matrix._24 - Matrix._21;
m_FrustumPlanes[3].c = Matrix._34 - Matrix._31;
m_FrustumPlanes[3].d = Matrix._44 - Matrix._41;
D3DXPlaneNormalize(&m_FrustumPlanes[3], &m_FrustumPlanes[3]);
m_FrustumPlanes[4].a = Matrix._14 - Matrix._12; // Top plane
m_FrustumPlanes[4].b = Matrix._24 - Matrix._22;
m_FrustumPlanes[4].c = Matrix._34 - Matrix._32;
m_FrustumPlanes[4].d = Matrix._44 - Matrix._42;
D3DXPlaneNormalize(&m_FrustumPlanes[4], &m_FrustumPlanes[4]);
m_FrustumPlanes[5].a = Matrix._14 + Matrix._12; // Bottom plane
m_FrustumPlanes[5].b = Matrix._24 + Matrix._22;
m_FrustumPlanes[5].c = Matrix._34 + Matrix._32;
m_FrustumPlanes[5].d = Matrix._44 + Matrix._42;
D3DXPlaneNormalize(&m_FrustumPlanes[5], &m_FrustumPlanes[5]);
}
void CCamera::SetView(D3DXVECTOR3 *vPos, D3DXVECTOR3 *vAt)
{
m_vPos = *vPos;
m_vLookAt = *vAt;
m_bFreeCamMode = true;
}
void CCamera::SetTargetView(D3DXVECTOR3* vPos, D3DXVECTOR3* vTarget) {
m_vPos = *vPos;
m_vTarget = *vTarget;
m_bFreeCamMode = false;
}
void CCamera::ChangeView(D3DXVECTOR3 *vPos, D3DXVECTOR3 *vAt)
{
m_bChangingView = true;
m_vStartPos = m_vPos;
m_vStartLookAt = m_vLookAt;
m_vEndPos = *vPos;
m_vEndLookAt = *vAt;
m_fPosS = 0.0f;
m_fLookAtS = 0.0f;
m_bFreeCamMode = true;
}
void CCamera::ChangeTargetView(D3DXVECTOR3* vPos, D3DXVECTOR3* vTarget) {
m_bChangingView = true;
m_vStartPos = m_vPos;
m_vStartLookAt = m_vLookAt;
m_vEndPos = *vPos;
m_vTarget = *vTarget;
m_fPosS = 0.0f;
m_fLookAtS = 0.0f;
m_bFreeCamMode = false;
}
bool CCamera::CheckSphere(D3DXVECTOR3 *vCenter, float *fRadius)
{
int i;
for(i = 0; i < 6; i++)
if(D3DXPlaneDotCoord(&m_FrustumPlanes[i], &D3DXVECTOR3(vCenter->x, vCenter->y, vCenter->z)) < -*fRadius)
return false;
return true;
}
posted on 2019-05-17 17:16 guanxi0808 阅读(630) 评论(0) 收藏 举报
浙公网安备 33010602011771号