Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class CFrustum { private: //Viewing Frutsum Daten D3DXPLANE Plane[6]; //Die 6 Seiten des Viewing Frustums public: //obj erzeugen CFrustum(); //destruktor ~CFrustum(); //erzeugen void UpDate(LPDIRECT3DDEVICE9 lpDevice); //Sichttests BOOL CheckPointIn(D3DXVECTOR3 Point); BOOL CheckCubeIn(D3DXVECTOR3 Center, FLOAT Size); BOOL CheckBoxIn(D3DXVECTOR3 Center,FLOAT SizeX,FLOAT SizeY,FLOAT SizeZ); BOOL CheckSphereIn(D3DXVECTOR3 Center,FLOAT radius); };[cpp] |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
void CFrustum::UpDate(LPDIRECT3DDEVICE9 lpDevice) { D3DXMATRIX mView,mProj,mPlane; //Matrix berechnen lpDevice->GetTransform(D3DTS_VIEW,&mView); lpDevice->GetTransform(D3DTS_PROJECTION,&mProj); D3DXMatrixMultiply(&mPlane,&mView,&mProj); //NEAR-Plane Plane[0].a = mPlane._14 + mPlane._13; Plane[0].b = mPlane._24 + mPlane._23; Plane[0].c = mPlane._34 + mPlane._33; Plane[0].d = mPlane._44 + mPlane._43; D3DXPlaneNormalize(&Plane[0],&Plane[0]); //FAR-Plane Plane[1].a = mPlane._14 - mPlane._13; Plane[1].b = mPlane._24 - mPlane._23; Plane[1].c = mPlane._34 - mPlane._33; Plane[1].d = mPlane._44 - mPlane._43; D3DXPlaneNormalize(&Plane[1],&Plane[1]); //LEFT-Plane Plane[2].a = mPlane._14 + mPlane._11; Plane[2].b = mPlane._24 + mPlane._21; Plane[2].c = mPlane._34 + mPlane._31; Plane[2].d = mPlane._44 + mPlane._41; D3DXPlaneNormalize(&Plane[2],&Plane[2]); //RIGHT-Plane Plane[3].a = mPlane._14 - mPlane._11; Plane[3].b = mPlane._24 - mPlane._21; Plane[3].c = mPlane._34 - mPlane._31; Plane[3].d = mPlane._44 - mPlane._41; D3DXPlaneNormalize(&Plane[3],&Plane[3]); //TOP-Plane Plane[4].a = mPlane._14 - mPlane._12; Plane[4].b = mPlane._24 - mPlane._22; Plane[4].c = mPlane._34 - mPlane._32; Plane[4].d = mPlane._44 - mPlane._42; D3DXPlaneNormalize(&Plane[4],&Plane[4]); //BOTTOM-Plane Plane[5].a = mPlane._14 + mPlane._12; Plane[5].b = mPlane._24 + mPlane._22; Plane[5].c = mPlane._34 + mPlane._32; Plane[5].d = mPlane._44 + mPlane._42; D3DXPlaneNormalize(&Plane[5],&Plane[5]); } BOOL CFrustum::CheckPointIn(D3DXVECTOR3 Point) { for(BYTE i=0;i<6;i++) { if(D3DXPlaneDotCoord(&Plane[i],&Point) < 0.0f) return FALSE; } return TRUE; } BOOL CFrustum::CheckCubeIn(D3DXVECTOR3 Center, FLOAT Size) { if (CheckPointIn(D3DXVECTOR3(Center.x-Size,Center.y-Size,Center.z-Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x+Size,Center.y-Size,Center.z-Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x-Size,Center.y+Size,Center.z-Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x-Size,Center.y-Size,Center.z+Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x+Size,Center.y+Size,Center.z-Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x-Size,Center.y+Size,Center.z+Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x+Size,Center.y-Size,Center.z+Size))) return TRUE; if (CheckPointIn(D3DXVECTOR3(Center.x+Size,Center.y+Size,Center.z+Size))) return TRUE; return FALSE; } BOOL CFrustum::CheckBoxIn(D3DXVECTOR3 Center,FLOAT SizeX,FLOAT SizeY,FLOAT SizeZ) { for(BYTE i=0;i<6;i++) { if (Plane[i].a*(Center.x-SizeX) + Plane[i].b*(Center.y-SizeY) + Plane[i].c*(Center.z-SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x+SizeX) + Plane[i].b*(Center.y-SizeY) + Plane[i].c*(Center.z-SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x-SizeX) + Plane[i].b*(Center.y+SizeY) + Plane[i].c*(Center.z-SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x-SizeX) + Plane[i].b*(Center.y-SizeY) + Plane[i].c*(Center.z+SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x+SizeX) + Plane[i].b*(Center.y+SizeY) + Plane[i].c*(Center.z-SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x-SizeX) + Plane[i].b*(Center.y+SizeY) + Plane[i].c*(Center.z+SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x+SizeX) + Plane[i].b*(Center.y-SizeY) + Plane[i].c*(Center.z+SizeZ) + Plane[i].d >= 0.0f) continue; if (Plane[i].a*(Center.x+SizeX) + Plane[i].b*(Center.y+SizeY) + Plane[i].c*(Center.z+SizeZ) + Plane[i].d >= 0.0f) continue; return FALSE; } return TRUE; } BOOL CFrustum::CheckSphereIn(D3DXVECTOR3 Center,FLOAT radius) { for (BYTE i=0;i<6;i++) { if (Plane[i].a*Center.x + Plane[i].b*Center.y + Plane[i].c*Center.z + Plane[i].d < -radius) return FALSE; } return TRUE; } CFrustum::CFrustum() { } CFrustum::~CFrustum() { } |
C-/C++-Quelltext |
|
1 2 3 4 |
Plane[ 0 ].a = mPlane._13; Plane[ 0 ].b = mPlane._23; Plane[ 0 ].c = mPlane._33; Plane[ 0 ].d = mPlane._43; |
Werbeanzeige