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 |
//Testet ob ein Quader vollständig vor (return 1;), //vollständig hinter (return -1;) einer Ebene ist, oder diese //schneidet (return 0;) OMEGA_API int ogUtilsClassifyBox(const og3DVector& vBoxMin, const og3DVector& vBoxMax, const ogMatrix& mTransformation, const ogPlane& Plane) { //Ebene mit InvMatrix transformieren und ins Koordsys vom Quader bringen ogPlane TPlane = ogPlaneTransform(Plane, ogMatrixInvert(mTransformation)); //Nächsten und fernsten Punkt berechnen og3DVector vNearest(vBoxMax); og3DVector vFarest(vBoxMin); if(TPlane.a > 0.0f) {vNearest.x = vBoxMin.x; vFarest.x = vBoxMax.x;} if(TPlane.b > 0.0f) {vNearest.y = vBoxMin.y; vFarest.y = vBoxMax.y;} if(TPlane.c > 0.0f) {vNearest.z = vBoxMin.z; vFarest.z = vBoxMax.z;} //Nächsten-Punkt einsetzten if(ogPlaneDotCoords(TPlane, vNearest) > 0.0f) return 1; //Entferntesten-Punkt einsetzten if(ogPlaneDotCoords(TPlane, vFarest) > 0.0f) return 0; //Sonst liegt er vollkommen hinter ihr! return -1; } |
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 |
//Berechnet die Clippingebenen und liefert sie als Array zurück OMEGA_API ogResult ogUtilsCalcClippingPlanes(const ogMatrix& mView, const ogMatrix& mProjection, ogPlane* pPlanes) { //Array vorhanden? if(!pPlanes) OG_ERROR_NULL_POINTER("pPlanes", OG_ERROR); //Gesamtmatrix berechnen ogMatrix mTemp = mView * mProjection; // Linke Clippingebene pPlanes[0].a = -(mTemp.m14 + mTemp.m11); pPlanes[0].b = -(mTemp.m24 + mTemp.m21); pPlanes[0].c = -(mTemp.m34 + mTemp.m31); pPlanes[0].d = -(mTemp.m44 + mTemp.m41); pPlanes[0] = ogPlaneNormalize(pPlanes[0]); // Rechte Clippingebene pPlanes[1].a = -(mTemp.m14 - mTemp.m11); pPlanes[1].b = -(mTemp.m24 - mTemp.m21); pPlanes[1].c = -(mTemp.m34 - mTemp.m31); pPlanes[1].d = -(mTemp.m44 - mTemp.m41); pPlanes[1] = ogPlaneNormalize(pPlanes[1]); // Obere Clippingebene pPlanes[2].a = -(mTemp.m14 - mTemp.m12); pPlanes[2].b = -(mTemp.m24 - mTemp.m22); pPlanes[2].c = -(mTemp.m34 - mTemp.m32); pPlanes[2].d = -(mTemp.m44 - mTemp.m42); pPlanes[2] = ogPlaneNormalize(pPlanes[2]); // Untere Clippingebene pPlanes[3].a = -(mTemp.m14 + mTemp.m12); pPlanes[3].b = -(mTemp.m24 + mTemp.m22); pPlanes[3].c = -(mTemp.m34 + mTemp.m32); pPlanes[3].d = -(mTemp.m44 + mTemp.m42); pPlanes[3] = ogPlaneNormalize(pPlanes[3]); // Nahe Clippingebene pPlanes[4].a = -(mTemp.m14 + mTemp.m13); pPlanes[4].b = -(mTemp.m24 + mTemp.m23); pPlanes[4].c = -(mTemp.m34 + mTemp.m33); pPlanes[4].d = -(mTemp.m44 + mTemp.m43); pPlanes[4] = ogPlaneNormalize(pPlanes[4]); // Ferne Clippingebene pPlanes[5].a = -(mTemp.m14 - mTemp.m13); pPlanes[5].b = -(mTemp.m24 - mTemp.m23); pPlanes[5].c = -(mTemp.m34 - mTemp.m33); pPlanes[5].d = -(mTemp.m44 - mTemp.m43); pPlanes[5] = ogPlaneNormalize(pPlanes[5]); return OG_OK; } |
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 |
//Berechnet die Clippingebenen und liefert sie als Array zurück OMEGA_API ogResult ogUtilsCalcClippingPlanes(const ogMatrix& mWorld, const ogMatrix& mView, const ogMatrix& mProjection, ogPlane* pPlanes) { //Array vorhanden? if(!pPlanes) OG_ERROR_NULL_POINTER("pPlanes", OG_ERROR); //Gesamtmatrix berechnen ogMatrix mTemp = mWorld * mView * mProjection; //Left clipping plane pPlanes[0].a = -(mTemp.m14 - mTemp.m11); pPlanes[0].b = -(mTemp.m24 - mTemp.m21); pPlanes[0].c = -(mTemp.m34 - mTemp.m31); pPlanes[0].d = -(mTemp.m44 - mTemp.m41); //Right clipping plane pPlanes[1].a = -(mTemp.m14 + mTemp.m11); pPlanes[1].b = -(mTemp.m24 + mTemp.m21); pPlanes[1].c = -(mTemp.m34 + mTemp.m31); pPlanes[1].d = -(mTemp.m44 + mTemp.m41); //Top clipping plane pPlanes[2].a = -(mTemp.m14 + mTemp.m12); pPlanes[2].b = -(mTemp.m24 + mTemp.m22); pPlanes[2].c = -(mTemp.m34 + mTemp.m32); pPlanes[2].d = -(mTemp.m44 + mTemp.m42); //Bottom clipping plane pPlanes[3].a = -(mTemp.m14 - mTemp.m12); pPlanes[3].b = -(mTemp.m24 - mTemp.m22); pPlanes[3].c = -(mTemp.m34 - mTemp.m32); pPlanes[3].d = -(mTemp.m44 - mTemp.m42); //Near clipping plane pPlanes[4].a = -(mTemp.m13); pPlanes[4].b = -(mTemp.m23); pPlanes[4].c = -(mTemp.m33); pPlanes[4].d = -(mTemp.m43); //Far clipping plane pPlanes[5].a = -(mTemp.m14 + mTemp.m13); pPlanes[5].b = -(mTemp.m24 + mTemp.m23); pPlanes[5].c = -(mTemp.m34 + mTemp.m33); pPlanes[5].d = -(mTemp.m44 + mTemp.m43); //Normalisieren der Ebenen for(int i = 0; i < 6; i++) ogPlaneNormalize(pPlanes[i]); return OG_OK; } |
Werbeanzeige