Du bist nicht angemeldet.

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

1

16.11.2003, 13:59

frustum culling probs

ich verzweifel langsam,
ich hab jetzt die 6 ebene meines view-frustums
wie im tutorial "fast extraction of viewing frustum planes
from the World-View-Projection-Matrix" beschrieben, vielleicht
kennt das ja der ein oder andere ???.
als grundlage dient M = V*P also müsste ich
die ebenen laut tut in world-space-koordinaten bekommen.
leider funktioniert nur die gleichung für die near-plane.
wenn ich gegen alle ebenen teste fällt absolut alles durch
und der billdschirm bleibt leer. aber dafür hab ich über 730 fps *g*
habs auch schon mit andern matrizen versucht...ich glaub ich bin einfach
zu blöd.
kann mir jemand helfen.??????

gruß 50-27

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.11.2003, 14:09

Was willst Du cullen? Boxes oder Kugeln?
Ich verwende diesen Algorithmus auch (auch in der Engine), und er funktioniert wunderbar...

3

16.11.2003, 14:15

boxes also praktisch die nodes meines (nicht-ganz-oct-)trees
ich teste die 8 eckpunkte, und wenn keiner drinne is dann
überspring ich den "sektor" meines levels.
das sollte klappen...theoretisch *g*
welche matrizen benutzt du um die ebenen-gleichungen
aufzustellen:? v*p?

4

16.11.2003, 14:31

hier mal ein bisschen code...

Quellcode

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
    D3DXMatrixMultiply(&matComb, &matProj, &matView);
    //matComb = matView;

#define m_f(x)(m_frust.planes[x])
#define mc matComb

    //near-plane
    m_f(0).a = mc._13;
    m_f(0).b = mc._23;
    m_f(0).c = mc._33;
    m_f(0).d = mc._43;

    //far-plane
    m_f(1).a = mc._14 - mc._13;
    m_f(1).b = mc._24 - mc._23;
    m_f(1).c = mc._34 - mc._33;
    m_f(1).d = mc._44 - mc._43;

    //top_plane
    m_f(2).a = mc._14 - mc._12;
    m_f(2).b = mc._24 - mc._22;
    m_f(2).c = mc._34 - mc._32;
    m_f(2).d = mc._44 - mc._42;

    //bottom_plane
    m_f(3).a = mc._14 + mc._12;
    m_f(3).b = mc._24 + mc._22;
    m_f(3).c = mc._34 + mc._32;
    m_f(3).d = mc._44 + mc._42;

    //left_plane
    m_f(4).a = mc._14 + mc._11;
    m_f(4).b = mc._24 + mc._21;
    m_f(4).c = mc._34 + mc._31;
    m_f(4).d = mc._44 + mc._41;

    //riht_plane
    m_f(5).a = mc._14 - mc._11;
    m_f(5).b = mc._24 - mc._21;
    m_f(5).c = mc._34 - mc._31;
    m_f(5).d = mc._44 - mc._41;

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

16.11.2003, 14:31

Du brauchst keine 8 Punkte zu testen, 2 reichen vollkommen!
Das hier sollte Dir helfen:

Quellcode

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
// ******************************************************************
// Berechnen des View-Frustums anhand der Projektionsmatrix und der Sichtmatrix
TRIBASE_API tbResult tbComputeClipPlanes(const tbMatrix& mView,
                                         const tbMatrix& mProjection,
                                         tbPlane* pOut)
{
    // Sichtmatrix mit der Projektionsmatrix multiplizieren
    tbMatrix mTemp(mView * mProjection);

    // Linke Clippingebene
    pOut[0].a = -(mTemp.m14 + mTemp.m11);
    pOut[0].b = -(mTemp.m24 + mTemp.m21);
    pOut[0].c = -(mTemp.m34 + mTemp.m31);
    pOut[0].d = -(mTemp.m44 + mTemp.m41);
    pOut[0] = tbPlaneNormalize(pOut[0]);

    // Rechte Clippingebene
    pOut[1].a = -(mTemp.m14 - mTemp.m11);
    pOut[1].b = -(mTemp.m24 - mTemp.m21);
    pOut[1].c = -(mTemp.m34 - mTemp.m31);
    pOut[1].d = -(mTemp.m44 - mTemp.m41);
    pOut[1] = tbPlaneNormalize(pOut[1]);

    // Obere Clippingebene
    pOut[2].a = -(mTemp.m14 - mTemp.m12);
    pOut[2].b = -(mTemp.m24 - mTemp.m22);
    pOut[2].c = -(mTemp.m34 - mTemp.m32);
    pOut[2].d = -(mTemp.m44 - mTemp.m42);
    pOut[2] = tbPlaneNormalize(pOut[2]);

    // Untere Clippingebene
    pOut[3].a = -(mTemp.m14 + mTemp.m12);
    pOut[3].b = -(mTemp.m24 + mTemp.m22);
    pOut[3].c = -(mTemp.m34 + mTemp.m32);
    pOut[3].d = -(mTemp.m44 + mTemp.m42);
    pOut[3] = tbPlaneNormalize(pOut[3]);

    // Nahe Clippingebene
    pOut[4].a = -(mTemp.m14 + mTemp.m13);
    pOut[4].b = -(mTemp.m24 + mTemp.m23);
    pOut[4].c = -(mTemp.m34 + mTemp.m33);
    pOut[4].d = -(mTemp.m44 + mTemp.m43);
    pOut[4] = tbPlaneNormalize(pOut[4]);

    // Ferne Clippingebene
    pOut[5].a = -(mTemp.m14 - mTemp.m13);
    pOut[5].b = -(mTemp.m24 - mTemp.m23);
    pOut[5].c = -(mTemp.m34 - mTemp.m33);
    pOut[5].d = -(mTemp.m44 - mTemp.m43);
    pOut[5] = tbPlaneNormalize(pOut[5]);

    return TB_OK;
}

// ******************************************************************
// Sichtbarkeit eines Quaders prüfen
TRIBASE_API BOOL tbBoxVisible(const tbVector3& vBoxMin,
                              const tbVector3& vBoxMax,
                              const tbMatrix& mBoxTransformation,
                              const tbPlane* pClipPlanes)
{
    // Matrix invertieren
    tbMatrix mInvBoxTransformation(tbMatrixInvert(mBoxTransformation));

    // Wenn der Quader auf der Vorderseite einer Ebene liegt, ist er unsichtbar.
    if(tbClassifyBox_Inv(vBoxMin, vBoxMax, mInvBoxTransformation, pClipPlanes[0]) == 1) return FALSE;
    if(tbClassifyBox_Inv(vBoxMin, vBoxMax, mInvBoxTransformation, pClipPlanes[1]) == 1) return FALSE;
    if(tbClassifyBox_Inv(vBoxMin, vBoxMax, mInvBoxTransformation, pClipPlanes[2]) == 1) return FALSE;
    if(tbClassifyBox_Inv(vBoxMin, vBoxMax, mInvBoxTransformation, pClipPlanes[3]) == 1) return FALSE;
    if(tbClassifyBox_Inv(vBoxMin, vBoxMax, mInvBoxTransformation, pClipPlanes[4]) == 1) return FALSE;
    return tbClassifyBox_Inv(vBoxMin, vBoxMax, mInvBoxTransformation, pClipPlanes[5]) != 1;
}

Werbeanzeige