[C++] Normals kloppen niet na omhoog brengen terrein

Pagina: 1
Acties:

  • AuC
  • Registratie: Januari 2003
  • Laatst online: 03-04 14:09
Ik ben momenteel bezig met een terrain engine in c++. Alles werkt momenteel aardig, en ook mijn normals lijken goed te werken. Althans, op een vlak terrein, want zodra ik een aantal punten verhoog (bergjes) dan gaan op een klein afstandje van het bergje af de normals alle kanten op. Hier kan je een screenshot vinden om mijn probleem duidelijker te maken. Zoals je ziet gaan de normals (blauw en geel) alle kanten op.

Ik gebruik de volgende code voor het berekenen van mijn normals:

C++:
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
bool CTerrain::CalculateNormals()
{
    bool bOnce = false;

    int i, j, x, z;

    for( x = 0; x <= m_iTerrainWidth; x++ )
    {
        for( z = 0; z <= m_iTerrainHeight; z++ )
        {
            // 3 ---2
            // | \ B|
            // | A \|
            // 0 ---1
            
            // Get The Points of The Whole Quad
            CVector3D point0 = CVector3D( 0.0f,   GetHeight(x, z), 0.0f );
            CVector3D point1 = CVector3D( 1.0f, GetHeight(x+1, z), 0.0f );
            CVector3D point2 = CVector3D( 1.0f, GetHeight(x+1,z+1), 1.0f );
            CVector3D point3 = CVector3D( 0.0f,   GetHeight(x, z+1), 1.0f );

            // Get the sides of triangle a
            CVector3D SideA1 = point0 - point1;
            CVector3D SideA2 = point3 - point0;

            // Calculate Normal of triangle A
            CVector3D NormalA = SideA1 ^ SideA2;
            NormalA.Normalize();

            // Get the sides of triangle b
            CVector3D SideB1 = point2 - point3;
            CVector3D SideB2 = point1 - point2;

            // Calculate Normal of Triangle B
            CVector3D NormalB = SideB1 ^ SideB2;
            NormalB.Normalize();

            // Store the normals
            m_fvNormalMap[0].push_back( NormalA );
            m_fvNormalMap[1].push_back( NormalB );
        }
    }

    m_bHasNormals = true;

    return true;
}


Het probleem ligt duidelijk aan deze code, want zonder normals werkt alles prima.

Edit:

m_fvNormalMap is een vector class. Aangezien ik hier nog nooit me heb gewerkt zet ik deze code er ook maar bij, ik weet namelijk niet of ik zo data uit een vector class mag halen?

C++:
1
2
3
4
5
6
7
8
9
CVector3D CTerrain::GetNormal1( int x, int z )
{
    return m_fvNormalMap[0][x + z * m_iTerrainWidth];
}

CVector3D CTerrain::GetNormal2( int x, int z )
{
    return m_fvNormalMap[1][x + z * m_iTerrainWidth];
}


Edit2:
Duidelijkere screenshot

Edit3:
Probleem is al opgelost... Het was een fout in mijn for loop 8)7. Een eindje terug gebruikte ik in de loop for( i = 0; i < width; i++) (waar ik het terrein initializeerde), bij de normals gebruikte ik for( i = 0; i <= width; i++).

[ Voor 22% gewijzigd door AuC op 19-06-2005 22:49 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Wat is dat toch met die normalen... :) In de search kan je denk ik van afegelopen maand wel twee of drie topics terugvinden hierover.....