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

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

14.08.2007, 14:25

Frsutum Culling

Hi

ich arbeite schon seit längerem an einer Terrain-Engine mit CLOD-Algorithmus. Ist alles soweti so gut bis auf die tatsache das Frustum culling EINFACH NET FUNZT!!!!! (*ärger*) Eigentlich ist alles richtig, habs noch nett in eine klasse gesteckt. einfach ma anguggen.

hier die header-datei:

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]


hier entsprechende implementierung:

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()
{
}


ansonten hatte ich nen extra projekt zum testen, aba kp was da nicht geht. es muss irgendwas in der klasse sein
[/cpp]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

14.08.2007, 14:42

Nearplane ist falsch.
@D13_Dreinig

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

15.08.2007, 13:38

thx 4 antwort

Ich hab nochma nachgeguckt in den aus dem ich das hab und da steht es genau so drin. auch dir nearplane.
ich hab das aus dem buch "programming role-playng games with directx 8.0" von Andre LaMothe.
Wär nice wenn du mir dann die richtige matrixkombination posten könntest bzw. nen link wos steht. :roll:

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

15.08.2007, 13:47

Korrekt wäre:

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;


Mir ist übrigens nicht klar warum du die Matrix mPlane genannt hast! :)
@D13_Dreinig

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

16.08.2007, 14:16

Jo funzt!!! thx

ich hatte die Matrix nur mPlane genannt, weil ich mit der Matrix ja die Planes berechne. Ich hab da so meine eigene Macke mit den Bezeicnern :D

Werbeanzeige