Weil ich dann die Kamera, Octree und Frustum Klasse posten müsste, und das wäre ne schlimme codewurst (ausserdem möchte ich den Code noch niemandem zumuten :mrgreen: )Warum unübersichtlich? ...
Ja, mir ist schon klar wie das Culling funktioniert, und ich habs auch schon mehrfach überprüft, aber es scheint so als würde er das Frustum nicht korrekt erstellen, hier mal ein wenig Code wie das Frustum erstellt wird
Code: Alles auswählen
void Frustum::ConstructFrustum(float screenDepth, D3DXMATRIX matProj, D3DXMATRIX matView)
{
float zMinimum;
float r;
D3DXMATRIX matrix;
//D3DXVECTOR3 vDir = camera.vLookAt - camera.vPosition;
D3DXMatrixLookAtLH( &matView, &camera.vPosition,&camera.vLookAt,&D3DXVECTOR3(0.0f,1.0f,0.0f));
// Calculate the minimum Z distance in the frustrum
zMinimum = -matProj._43 / matProj._33;
r = screenDepth / (screenDepth - zMinimum);
matProj._33 = r;
matProj._43 = -r*zMinimum;
// Create the frustrum matrix from the view matrix and update projection matrix
D3DXMatrixMultiply(&matrix, &matView, &matProj);
// D3DXMatrixInverse(&matrix,NULL,&matrix);
// Calculate near plane of frustrum
this->m_planes[0].a = matrix._14 + matrix._13;
this->m_planes[0].b = matrix._24 + matrix._23;
this->m_planes[0].c = matrix._34 + matrix._33;
this->m_planes[0].d = matrix._44 + matrix._43;
D3DXPlaneNormalize(&this->m_planes[0], &this->m_planes[0]);
// Calculate far plane of frustrum
this->m_planes[1].a = matrix._14 - matrix._13;
this->m_planes[1].b = matrix._24 - matrix._23;
this->m_planes[1].c = matrix._34 - matrix._33;
this->m_planes[1].d = matrix._44 - matrix._43;
D3DXPlaneNormalize(&this->m_planes[1], &this->m_planes[1]);
// Calculate left plane of frustrum
this->m_planes[2].a = matrix._14 + matrix._11;
this->m_planes[2].b = matrix._24 + matrix._21;
this->m_planes[2].c = matrix._34 + matrix._31;
this->m_planes[2].d = matrix._44 + matrix._41;
D3DXPlaneNormalize(&this->m_planes[2], &this->m_planes[2]);
// Calculate right plane of frustrum
this->m_planes[3].a = matrix._14 - matrix._11;
this->m_planes[3].b = matrix._24 - matrix._21;
this->m_planes[3].c = matrix._34 - matrix._31;
this->m_planes[3].d = matrix._44 - matrix._41;
D3DXPlaneNormalize(&this->m_planes[3], &this->m_planes[3]);
// Calculate top plane of frustrum
this->m_planes[4].a = matrix._14 - matrix._12;
this->m_planes[4].b = matrix._24 - matrix._22;
this->m_planes[4].c = matrix._34 - matrix._32;
this->m_planes[4].d = matrix._44 - matrix._42;
D3DXPlaneNormalize(&this->m_planes[4], &this->m_planes[4]);
// Caclualte bottom plane of frustrum
this->m_planes[5].a = matrix._14 + matrix._12;
this->m_planes[5].b = matrix._24 + matrix._22;
this->m_planes[5].c = matrix._34 + matrix._32;
this->m_planes[5].d = matrix._44 + matrix._42;
D3DXPlaneNormalize(&this->m_planes[5], &this->m_planes[5]);
// Calculate Frustum Poins
D3DXVECTOR3 dir,nc,fc,X,Y,Z;
this->ratio = 1920.0f/1080.0f;
this->angle = D3DX_PI/4;
this->nearDistance = 0.5f;
this->farDistance = 200.0f;
// compute width and height of the near and far plane sections
tang = (float)tan(ANG2RAD * angle * 0.5) ;
nearHeight = nearDistance * tang;
nearWidth = nearHeight * ratio;
farHeight = farDistance * tang;
farWidth = farHeight * ratio;
D3DXVECTOR3 vLookAt;
D3DXVec3Normalize(&vLookAt, &camera.vLookAt);
Z = camera.vPosition + vLookAt;
D3DXVec3Normalize(&Z, &Z);
D3DXVec3Cross(&X, &camera.vUp, &Z);
D3DXVec3Normalize(&X, &X);
D3DXVec3Cross(&Y, &Z, &X);
// compute the centers of the near and far planes
nc = camera.vPosition - Z * nearDistance;
fc = camera.vPosition - Z * farDistance;
// compute the 4 corners of the frustum on the near plane
nearTopLeft = nc + Y * nearHeight - X * nearWidth;
nearTopRight = nc + Y * nearHeight + X * nearWidth;
nearBottomLeft = nc - Y * nearHeight - X * nearWidth;
nearBottomRight = nc - Y * nearHeight + X * nearWidth;
// compute the 4 corners of the frustum on the far plane
farTopLeft = fc + Y * farHeight - X * farWidth;
farTopRight = fc + Y * farHeight + X * farWidth;
farBottomLeft = fc - Y * farHeight - X * farWidth;
farBottomRight = fc - Y * farHeight + X * farWidth;
}
Edit:
Und der Octree wird folgendermaßen geprüft:
Code: Alles auswählen
void ChunkOctree::getVisibleData(Chunk **ppData, DWORD &count)
{
if(g_Frustum.CubeInFrustum(*m_MidPt,m_Radius) || g_Frustum.FrustumInCube(*m_MidPt,m_Radius))
{
for(int i=0;i<8;i++)
{
if(this->m_pChilds[i] != NULL)
this->m_pChilds[i]->getVisibleData(ppData, count);
}
if(this->m_pChunkPtr != NULL)
{
ppData[count] = this->m_pChunkPtr;
count++;
}
}
}