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:
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?
Edit2:
Duidelijkere screenshot
Edit3:
Probleem is al opgelost... Het was een fout in mijn for loop
. 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++).
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
[ Voor 22% gewijzigd door AuC op 19-06-2005 22:49 ]