Mesh erstellen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Benibaerenstark

Betreff: Mesh erstellen

BeitragDo, Sep 29, 2005 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

Ich probiere mit Blitz3d ein Mesh zu erstellen. Um die Grundlagen zu verstehen probierte ich ein simples Mesh zu basteln, welches aus 100 Verticen besteht, welche mittels Triangels zu einer Fläche gemacht werden.

Ich erstelle eine Bank, in welcher die Indices der Vertices gespeichert werden:

BlitzBasic: [AUSKLAPPEN]
Bank = CreateBank(10*10*4)


danach werden die Vertices erstellt und in der Bank gespeichert:
BlitzBasic: [AUSKLAPPEN]
i=0
For x = 0 To 9
For y = 0 To 9

Vertex = AddVertex (Surface,x,y,0); Vertices im Raum \"verteilen\"
PokeByte Bank,i*4,Vertex ;Speichern des Vertex-Rückgabewerts (Index)

Kugel = CreateSphere () ; dort wo ein Vertex erstellt wird, positoniere ich eine Kugel
; damit man optisch etwas sieht
EntityColor Kugel,255-(i*2),255-(i*2),0 ; farbe nimmt ab, damit man die Reihenfolge sieht
ScaleMesh Kugel, 0.2,0.2,0.2
PositionEntity Kugel, x,y,0


i=i+1
Next
Next


Dies sieht dann ungefähr folgendermassen aus:

user posted image



Jetzt versuche ich die Vertexe zu verbinden, es sollten 81 (9*9, da die randvertexe nicht mitgerechnet werden dürfen) Quadrätchen mit je zwei Triangeln verbunden werden:

BlitzBasic: [AUSKLAPPEN]
i=0
For Anz = 1 To 81 ;81 Quadrate


V0 = PeekByte (Bank,i*4)
V1 = PeekByte (Bank,(i+1)*4)
V2 = PeekByte (Bank,(i+10)*4)
V3 = PeekByte (Bank,(i+11)*4)

AddTriangle(Surface,V0,V1,V2)
AddTriangle(Surface,V3,V2,V1)


i=i+1

Next



Das sieht dann folgendermassen aus:

user posted image


man sieht sofort, dass da einige triangeln fehlen, und auf der rückseite, finde ich sie dann auch:

user posted image



Ich glaube, es liegt an der art wie ich die Bank auslese und die Tris erstelle:

user posted image

Hier kommt es wohl zum Fehler:

user posted image



doch wie kann ich das beheben??? habe es schon mit "if i mod 10 = 0 then keine tris erstellen" und anderem probiert aber es hat nie richtig geklappt!! aber so schwer dürfte es wohl auch nicht sein!Evil or Very Mad

Edit: wie kann ich die Bilder gerade im thread anzeigen lassen??

vielen dank für eure hilfe


mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Benibaerenstark

BeitragDo, Sep 29, 2005 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm, versteht ihr die frage nicht, oder wisst ihr keine antwort? ein bisschen feedback wäre schon nett...

mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Vertex

BeitragDo, Sep 29, 2005 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ersteinmal: Die Vertexindices sind nicht zufällig. Sie beginnen bei 0 und enden bei CountVertices(Surface)-1.

Jetzt mache dir folgende Überlegung:
Code: [AUSKLAPPEN]
     0  1  2  3  4  5  6  7  8  9
    -----------------------------
0 | 00 01 02 03 04 05 06 07 08 09
1 | 10 11 12 13 14 15 16 17 18 19
2 | 20 21 22 23 24 25 26 27 28 29
3 | 30 31 32 33 34 35 36 37 38 39
4 | 40 41 42 43 44 45 46 47 48 49
5 | 50 51 52 53 54 55 56 57 58 59
6 | 60 61 62 63 64 65 66 67 68 69
7 | 70 71 72 73 74 75 76 77 78 79
8 | 80 81 82 83 84 85 86 87 88 89
9 | 90 91 92 93 94 95 96 97 98 99


Du musst also zu Anfang die 2 Triangles (00, 01, 11) und (11, 10, 00) erstellen.
Dann gehts weiter mit (01, 02, 12) und (12, 11, 01) usw.

Um den Vertexindex zu bekommen nimmst du die Formel Y*10+X. *10 weil in jeder Zeile 10 Vertices sind.


Code: [AUSKLAPPEN]
Graphics3D(640, 480, 32, 2)
SetBuffer BackBuffer()

Global Mesh, Surface, Camera

Mesh    = CreateMesh()
Surface = CreateSurface(Mesh)

For X = 0 To 9
   For Y = 0 To 9
      AddVertex(Surface, Float#(X)-5.0, Float#(Y)-5.0, 0.0)
   Next
Next

For X = 0 To 8
   For Y = 0 To 8
      AddTriangle(Surface, Y*10+X, Y*10+X+1, (Y+1)*10+X+1)
      AddTriangle(Surface, (Y+1)*10+X+1, (Y+1)*10+X, Y*10+X)
   Next
Next

Camera = CreateCamera()
PositionEntity(Camera, 0.0, 0.0, -10.0)
WireFrame(True)

While Not KeyDown(1)
   UpdateWorld()
   RenderWorld()
   Flip()
Wend

End


mfg olli
vertex.dreamfall.at | GitHub

Benibaerenstark

BeitragFr, Sep 30, 2005 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Herzliches Dankeschön!

habs ausprobiert und es hat geklappt! Ich versuche jetzt diesen Code und die Berechnung der Vertexindices zu verstehen:

Zitat:
AddTriangle(Surface, Y*10+X, Y*10+X+1, (Y+1)*10+X+1)
AddTriangle(Surface, (Y+1)*10+X+1, (Y+1)*10+X, Y*10+X)


wenn du mir diese Rechnungen noch mal "einfach" erklären könntest, wäre ich dir sehr dankbar Wink in solchen Überlegungsaufgaben habe ich manchmal einfach einen Knopf.Embarassed

mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Vertex

BeitragFr, Sep 30, 2005 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
     0  1  2  3  4  5  6  7  8  9
    -----------------------------
0 | 00 01 02 03 04 05 06 07 08 09
1 | 10 11 12 13 14 15 16 17 18 19
2 | 20 21 22 23 24 25 26 27 28 29
3 | 30 31 32 33 34 35 36 37 38 39
4 | 40 41 42 43 44 45 46 47 48 49
5 | 50 51 52 53 54 55 56 57 58 59
6 | 60 61 62 63 64 65 66 67 68 69
7 | 70 71 72 73 74 75 76 77 78 79
8 | 80 81 82 83 84 85 86 87 88 89
9 | 90 91 92 93 94 95 96 97 98 99


Code: [AUSKLAPPEN]
AddTriangle(Surface, Y*10+X, Y*10+X+1, (Y+1)*10+X+1)
AddTriangle(Surface, (Y+1)*10+X+1, (Y+1)*10+X, Y*10+X)


Nehmen wir mal das Quadrat (35, 36, 46, 45):
Wir müssen 2 Triangles (35, 36, 46) und (46, 45, 35) erstellen.

Der rechte Nachbar eines Vertex X ist X+1 (mit X < 9, deswegen zählen wir auch nur von 0 bis 8, da dann jeder Vertex ein rechten Nachbar hat).

Wir können also Vertex X und Vertex X+1 ersteinmal verbinden. Vertex X+1 muss dann mit seinem unteren Nachbarn verbunden werden. Also Y+1 UND X+1 (weil wir immer vom Originalvertex ausgehen).


Code: [AUSKLAPPEN]
(X, Y)  (X+1, Y)
V0------V1
 \      |
  \     |
   \    |
    \   |
     \  |
      \ |
       \|
        V2
        (X+1, Y+1)

Mit Originalvertex ist hier einfach V0 gemeint den gehen wir mit den 2 For-Schleifen ja auch durch.

Naja nehme wir die Indexformel her:
Y*10+X und setzen ein:
V0 = Y*10+X
V1 = Y*10+(X+1) = Y*10+X+1
V2 = (Y+1)*10+(X+1) = (Y+1)*10+X+1

So und den selben Spaß noch mit dem 2ten Triangle
Code: [AUSKLAPPEN]
(X, Y)
V0
|\
| \
|  \
|   \
|    \
|     \
|      \
|       \
V3-------V2
(X, Y+1) (X+1, Y+1)


V3 = (Y+1)*10+X

Und jetzt werden diese dann Verbunden:
Traingle1 = (V0, V1, V2)
Triangle2 = (V2, V3, V0)

Auf das Beispiel bezogen sind wir gerade bei Zeile 3 und Spalte 5 also Y=3 und X=5.

V0 = Y*10+X = 3*10+5 = 35
V1 = Y*10+X+1 = 3*10+5+1= 36
V2 = (Y+1)*10+X+1 = (3+1)*10+5+1 = 46
V3 = (Y+1)*10+X = (3+1)*10+X = 45

Und da kann ich mich mal selbst zitieren Smile
Zitat:
Nehmen wir mal das Quadrat (35, 36, 46, 45):
Wir müssen 2 Triangles (35, 36, 46) und (46, 45, 35) erstellen.


mfg olli
vertex.dreamfall.at | GitHub

Benibaerenstark

BeitragFr, Sep 30, 2005 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für diese ausführlichen Erklärungen!

ich habe bereits (erst:?: ) so viel verstanden, dass diese Formel soviel bedeutet wie:

Y*Anzahl Vertices+X, doch dies funktioniert nur bei quadratischen Meshs, also wenn Y und X gleich gross sind, oder?

Doch ich glaube, mit dem Hinweis, dass die Vertices von 0 her aufwärts "Indexiert" werden, es selbst schaffen zu können, auch "asymetrische" Meshs zu erstellen. Jedenfalls habe ich dank deinen Infos viel Grundwissen gelernt. Danke.


mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Vertex

BeitragFr, Sep 30, 2005 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Y*Anzahl Vertices+X, doch dies funktioniert nur bei quadratischen Meshs, also wenn Y und X gleich gross sind, oder?


Nöö Smile

Gehen wir mal von einem Rechteck mit 5 * 3 aus:
Code: [AUSKLAPPEN]
     0  1  2  3  4
    --------------
0 | 00 01 02 03 04
1 | 05 06 07 08 09
2 | 10 11 12 13 14


Y*Width+X = Y*5+X

Beim Vertex auf Zeile 2 und Spalte 3 wäre das dann halt:
2*Width+3 = 2*5+3 = 13 und siehe da, es stimmt mit dem Index in der Tabelle überein.

mfg olli
vertex.dreamfall.at | GitHub

Benibaerenstark

BeitragFr, Sep 30, 2005 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, verdammt, ich schnall das nicht! Embarassed Bei deinen Beispielen ist es immer so wunderbar einfach nachvollziehbar und es stimmt, aber umsetzen kann ichs trotzdem nicht...nervig..Evil or Very Mad

frage jetzt noch einmal, dann geb ichs auf...


BlitzBasic: [AUSKLAPPEN]


AnzVerticesX = 10
AnzVerticesY = 12


For X = 0 To AnzVerticesX-1
For Y = 0 To AnzVerticesY-1
AddVertex(Surface, Float#(X)-5.0, Float#(Y)-5.0, 0.0)
Next
Next


For X = 0 To AnzVerticesX-2
For Y = 0 To AnzVerticesY-2

AddTriangle(Surface, Y*AnzVerticesX+X, Y*AnzVerticesX+X+1, (Y+1)*AnzVerticesX+X+1)
AddTriangle(Surface, (Y+1)*AnzVerticesX+X+1, (Y+1)*AnzVerticesX+X, Y*AnzVerticesX+X)

Next
Next



liefert folgendes Resultat:

user posted image


wenn Anz X und Y gleich gross sind, gibt es ein schönes Quadrat und alles stimmt. Wo liegt der Fehler?

mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Benibaerenstark

BeitragSo, Okt 02, 2005 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
habe es endlich geschafft!

Musste die eine Schleife umkehren und das Mesh noch Flippen um zum gewünschten Resultat zu kommen

für die welche es interessiert:

der fragliche Code sieht nun folgendermassen aus:

BlitzBasic: [AUSKLAPPEN]
AnzX=6
AnzY=10

For Y = 0 To AnzY-1 ;hier vertaucht mit
For X = 0 To AnzX-1 ;dem
AddVertex(Surface, X, Y, 0.0)
Next
Next

For X = 0 To AnzX-2
For Y = 0 To AnzY-2
AddTriangle(Surface, Y*AnzX+X, Y*AnzX+X+1, (Y+1)*AnzX+X+1)
AddTriangle(Surface, (Y+1)*AnzX+X+1, (Y+1)*AnzX+X, Y*AnzX+X)
Next
Next

FlipMesh Mesh



vielen Dank nochmal an Olli

mfg beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group