Sinds kort ben ik bezig wat C++ te leren, naast alle andere talen die ik al opgedaan heb. Ik heb al een ruime ervaring in DirectX, alleen nog nooit in 3D gewerkt.
Zo nu en dan komen ik iets tegen waar ik uren op zit, en dan gelukkig nog de oplossing voor vind, zoals de Quad Tree die ik voor m'n terrein gemaakt heb. Echter nu zit ik met een probleem, waar ik echt niet meer uitkom.. en de uren teller gaat maar omhoog en omhoog
.
Mijn terrein is 128x128 gebaseerd van een heightmap die 256x256 is. Elke triangle is in principe 16 pixels breed.
Het terrein is ingedeelt dmv. een quad tree, 8x8 hokjes. Een quad is dus 128/8 = 16x16 vertices groot. Omdat we dingen een beetje efficient willen houden, zijn de vertices ook ingedeeld in quads
Dus de vertices gaan zoals dit (eerder plaatje van tijdje terug, daarom engels
):
.
(Edit, ik zie nu datdit plaatje niet helemaal klopt.. na een tijdje gaat de structuur naar beneden. alles gaat gewoon zoals de quad van 1t/m9)
Geen volledige rijen dus! Nu heb ik een stuk code om normals te berekenen die bij het terrein voorbeeld zat waarop ik mijn spul baseer. Werkt gewoon goed, op een ding na
.
Wireframe ziet er goed uit:

Maar als je het solid rendert (zonder tex voor duidelijkheid)

Tevens is dit probleem met normals -denk ik- ook het probleem voor het door elkaar heen lopende terrein:

Er gaat dus iets mis in de normals berekeningen, alsof ie de randjes niet meeneemt. Maar aangezien ik door alle indices heen loop, lijkt me dat het gewoon goed komt. Ik heb al veel dingen geprobeert, zoals bijvoorbeeld niet de indices te gebruiken, maar gewoon de vertices. Gaf ook niet echt het gewenste resultaat
.
Misschien heeft hier iemand ervaring met quadtrees en normals/indices, en heeft die een ideewaar ik een denk fout maak? Ik heb de situatie al meerdere keren op papier uitgewerkt, maar ik kom er niet uit.
Normal code:
Dus als iemand enig idee heeft..
. Ik ben echt radeloos aan het worden.
. Ik hoop dat ik ook genoeg info gegeven heb...
Zo nu en dan komen ik iets tegen waar ik uren op zit, en dan gelukkig nog de oplossing voor vind, zoals de Quad Tree die ik voor m'n terrein gemaakt heb. Echter nu zit ik met een probleem, waar ik echt niet meer uitkom.. en de uren teller gaat maar omhoog en omhoog
Mijn terrein is 128x128 gebaseerd van een heightmap die 256x256 is. Elke triangle is in principe 16 pixels breed.
Het terrein is ingedeelt dmv. een quad tree, 8x8 hokjes. Een quad is dus 128/8 = 16x16 vertices groot. Omdat we dingen een beetje efficient willen houden, zijn de vertices ook ingedeeld in quads
Dus de vertices gaan zoals dit (eerder plaatje van tijdje terug, daarom engels
.(Edit, ik zie nu datdit plaatje niet helemaal klopt.. na een tijdje gaat de structuur naar beneden. alles gaat gewoon zoals de quad van 1t/m9)
Geen volledige rijen dus! Nu heb ik een stuk code om normals te berekenen die bij het terrein voorbeeld zat waarop ik mijn spul baseer. Werkt gewoon goed, op een ding na
Wireframe ziet er goed uit:

Maar als je het solid rendert (zonder tex voor duidelijkheid)

Tevens is dit probleem met normals -denk ik- ook het probleem voor het door elkaar heen lopende terrein:

Er gaat dus iets mis in de normals berekeningen, alsof ie de randjes niet meeneemt. Maar aangezien ik door alle indices heen loop, lijkt me dat het gewoon goed komt. Ik heb al veel dingen geprobeert, zoals bijvoorbeeld niet de indices te gebruiken, maar gewoon de vertices. Gaf ook niet echt het gewenste resultaat
Misschien heeft hier iemand ervaring met quadtrees en normals/indices, en heeft die een ideewaar ik een denk fout maak? Ik heb de situatie al meerdere keren op papier uitgewerkt, maar ik kom er niet uit.
Normal code:
code:
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
| D3DXVECTOR3 CTerrain::GetTriangleNormal(D3DXVECTOR3* vVertex1,
D3DXVECTOR3* vVertex2, D3DXVECTOR3* vVertex3)
{
D3DXVECTOR3 vNormal;
D3DXVECTOR3 v1;
D3DXVECTOR3 v2;
D3DXVec3Subtract(&v1, vVertex2, vVertex1);
D3DXVec3Subtract(&v2, vVertex3, vVertex1);
D3DXVec3Cross(&vNormal, &v1, &v2);
D3DXVec3Normalize(&vNormal, &vNormal);
return vNormal;
}
for(i = 0; i < m_dwNumOfIndices; i=i+3)
{
dwVertex1 = pBufferIndices[i];
dwVertex2 = pBufferIndices[i + 1];
dwVertex3 = pBufferIndices[i + 2];
vNormal = GetTriangleNormal(&D3DXVECTOR3(pcvVertices[dwVertex1].x, pcvVertices[dwVertex1].y,
pcvVertices[dwVertex1].z),
&D3DXVECTOR3(pcvVertices[dwVertex2].x,
pcvVertices[dwVertex2].y,
pcvVertices[dwVertex2].z),
&D3DXVECTOR3(pcvVertices[dwVertex3].x,
pcvVertices[dwVertex3].y,
pcvVertices[dwVertex3].z));
pNumOfSharedPolygons[dwVertex1]++;
pNumOfSharedPolygons[dwVertex2]++;
pNumOfSharedPolygons[dwVertex3]++;
pSumVertexNormal[dwVertex1].x += vNormal.x;
pSumVertexNormal[dwVertex1].y += vNormal.y;
pSumVertexNormal[dwVertex1].z += vNormal.z;
pSumVertexNormal[dwVertex2].x += vNormal.x;
pSumVertexNormal[dwVertex2].y += vNormal.y;
pSumVertexNormal[dwVertex2].z += vNormal.z;
pSumVertexNormal[dwVertex3].x += vNormal.x;
pSumVertexNormal[dwVertex3].y += vNormal.y;
pSumVertexNormal[dwVertex3].z += vNormal.z;
}
//Unlock the index buffer
m_pIndexBuffer->Unlock();
for(i = 0; i < m_dwNumOfVertices; i++)
{
vNormal.x = (float)pSumVertexNormal[i].x / pNumOfSharedPolygons[i];
vNormal.y = (float)pSumVertexNormal[i].y / pNumOfSharedPolygons[i];
vNormal.z = (float)pSumVertexNormal[i].z / pNumOfSharedPolygons[i];
D3DXVec3Normalize(&vNormal, &vNormal);
pcvVertices[i].nx = vNormal.x;
pcvVertices[i].ny = vNormal.y;
pcvVertices[i].nz = vNormal.z;
} |
Dus als iemand enig idee heeft..
[ Voor 7% gewijzigd door Sponge op 27-09-2004 11:05 . Reden: code breedte gefixed ]



