Mesh Fläche erstellen
Übersicht

![]() |
dav3dBetreff: Mesh Fläche erstellen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
also ich versuche gerade eine (Mesh) Fläche zu erstellen Blitz 3D, mitlerweile klappt alles wunderbar, nur die zuteilung der Triangles an die Vertices will nicht, muss ein Mathematischer Fehler sein, ich kann ihn aber nicht entdecken. wäre sehr froh über jede Hilfe. Code: [AUSKLAPPEN] size = 20
Dim ve(size^2) ;Hier werden die Vertices erstellt und in den Array gespeichert For z=1 To size For x=1 To size ind=x+z ve(ind) =AddVertex (surface,x,0,z) Next Next ;Hier werden den Vertices triangles zugeortnet For tx=0 To size For ty=0 To size v0=ve(tx+1) v1=ve(tx+1+size) ;Fehler müsste bei diesen Berechnungen sein v2=ve(tx+size) v3=ve(tx) AddTriangle surface,v0,v1,v2 AddTriangle surface,v0,v2,v3 Next Next |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst erst mit AddVertex Punkte im drei dimensionalem Raum deffinieren, dann kannst du erst per AddTriangle die Punkte miteinander verbinden! Das Beispiel der OH ist dafür gut beschrieben... Was dir fehlt sind die Koordianten in 3D, also X,Y und Z als Parameter kannst du noch U,V mit angeben. Diese können dann X und Y -Koordinaten einer Textur sein.
EDIT: Ähhh, nee,.. Nehme alles zurrück! Du hast es echt umständlich gemacht! Du hast ein eindimensionales Array erstellt und willst in dieser zwei/drei Zahlen mit rein packen!?! Keine Ahnung wie das gehen soll... Pack doch die AddTriangle -Zeile mit in die obere Schleife... Warum benötigst du denn zusätzlich noch das Array? |
||
- Zuletzt bearbeitet von hectic am Sa, Feb 25, 2006 21:04, insgesamt einmal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ind ist falsch. Das müsste z * size + x sein. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die vertices wurden doch oben schon erstellt. Un die coords sind doch relativ zum Zentrum des Meshs. und werden ya auch gesetzt. AddTriangle braucht keine coords, da sie doch durch die vertices ya schon klar sind. | ||
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
wieso denn "z*size+x"? es sind ya dort keine richtigen coords sondern nur indexnummer des Arrays wo die Vertices dann gespeichert werden. und ich habs trotzdem versucht. geht nicht. | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
david2 hat Folgendes geschrieben: wieso denn "z*size+x"? es sind ya dort keine richtigen coords sondern nur indexnummer...
Wenn X=2 ist und Y=2 ist ergibt 4! Wenn X=3 ist und Y=1 ist ergibt 4! Also werden Zahlen überschrieben! |
||
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
ups, haste recht, das löst vieleicht das problem, thx hab ich übersehen. | ||
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Richtung eingehalten? Also rechts herum sieht man sie, links herum sieht man sie nur von der Rückseite... Oder ganz billig, EntityFX 16... | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nunja, das zweite Problem ist, das du falsche Daten ausliest für die Vertices. Ich empfehle dir, dir auf einem Blatt papier dein gitter aufzuzeichnen mit den Koordinaten und allem und dann nochmal zu schauen.
Denn die Indizes der Vertices stimmen nicht im geringsten und ohne eine IF innerhalb der Loop kanns auch nicht funktionieren, sobald die Index berechnungen bereinigt sind. Übrigens: Du erzeugst von 1 to size also hat es wenig sinn wenn du von 0 to size ausliest. wenn du eine direktere codehaltige hilfe möchtest: Such ma nach Meshterrain oder gittermesh ... ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmmm,.. Der Grundgedanke mit dem 0 to size und 1 to size ist ja in Ordnung... Nur in dem Beispiel verkehrt rum... Also beim erzeugen der Vertices muß einmal mehr durchgeführt werden als beim verbinden der Punkte. Gibt ja mehr davon... | ||
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also einige sachen hatte ich schon bereits beseitigt, und ya die verticesauslesung ist müll(was auch das Problem ist). Nun das mit FX 16... was meinste damit? und ya hier ist der aktuelle code.
Code: [AUSKLAPPEN] size = 20
Dim ve(size^2) For z=0 To size-1 For x=0 To size-1 ind=(z*size)+x ve(ind) =AddVertex (surface,x,0,z) Next Next For tx=0 To size v0=ve(tx+1) v1=ve(tx+1+size) v2=ve(tx+size) v3=ve(tx) AddTriangle surface,v0,v1,v2 AddTriangle surface,v0,v2,v3 Next |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die For-Schleifen müssen auch potentiert werden. Also For...size^2. Ausserdem muß in der tx-Schleife auch tx*size genommen werden... Oder du nimmst gleich ein zweidimensionales Array. Würde so einiges an Denkarbeit erleichtern...
EDIT: Ach, quatsch... Man, die Schleifen machen mich ganz kirre! Nimm mal ein 2D-Array... Und das mit EntityFX 16. Es macht Meshes auch von der Rückseite sichtbar. Ist zumindest Sinnvoll, wenn man nicht mehr klar kommt mit dem was man geschrieben hat. Und eine Fehlersuche erstmal um einiges leichter... Nacher sollte man dieses aber wieder deaktivieren... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] size = 20
Dim ve(size^2) For z=0 To size For x=0 To size ind=(z*size)+x ve(ind) =AddVertex (surface,x,0,z) Next Next For tz=0 To size -1 for tx = 0 to size - 1 v0=ve(tz*size + tx) v1=ve(tz*size + tx + 1) v2=ve((tz+1)*size + tx + 1) v3=ve((tz+1)*size + tx) AddTriangle surface,v0,v1,v2 AddTriangle surface,v0,v2,v3 next Next sollte so eigentlich stimmen, lediglich die AddTriangle Befehle könnten falsch sein, sollte aber auch stimmen ![]() tz*size + tx ist der aktuelle linke untere punkt im gitter tz*size + tx + 1 ist der Punkt 1 rechts (tz+1)*size + tx ist der Punkt eins drüber im Gitter (tz+1)*size + tx + 1 ist der Punkt eins drüber und eins rechts im Gitter |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. bei size^2 entsteht ein fehler: "indexnumber out of bounds", hab deshlab size*18 für den moment. Das ist aber nicht das Problem.
2. 2D Arrays hatte ich am anfang vor, hab aber gemerkt das sass ganze viel umstentlicher und komplizieter ist. 3.EntityFX verwirrt irgendwie weil ich dann überall quadrate sehe wo keine sind, wireframe reicht.(vieleicht versteh ich auch nur was falsch) 4.Der Code Vohrschlag ist im grunde der Selbe wie der meine nur alles in 2 Schleifen aufgeteilt, was unnötig ist denk ich mal da meine version doch auch genau gleich funktioniert oder? (hab ihn trotzdem probiert geht aber nicht) 5.Were vieleicht gut wenn Ihr mal den Code ausprobieren würdet, dann wüsstet Ihr wie das ganze aussieht. (soneart 1x20 rechtecke anstelle von 20x20 quadrate). 6. Vielen dank aber für die laufende Hilfe, erfreut mich sehr ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sorry wenn du keine Lust hast selbst auch was zu machen, sollte ich den Thread glaub schliessen, wa?
Wir sind net hier um deine Codes zu schreiben. Ich schrieb ja, die Vertexreihenfolge bei den triangles könnte falsch sein ... Musst dir halt ein Blatt papier nehmen und es aufzeichnen und V0 - V3 beschriften und sehen was es macht und was es machen muss. Dein Code kann eh net funktionieren, der geht nur 1 der size-1 zeilen durch, insofern hat der keine Chance überhaupt funktionieren zu können. Und statt size^2 kann man auch size * size schreiben (sollte man für ^2 eh da es schneller ist) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
dav3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey sry so war das nicht gemeint, ich schreibe doch nur meine Meinung zu euern Vorschlägen damit es vorwerts geht. Ausserdem arbeite ich schon den ganzen Tag ununterbrochen an dem Ding. Es ist ya nicht alles falsch was Ihr sagt oder so.
Aber wenn Ihr das resultat des Codes mal ansehen würdet(falls nicht geschehen) dann könntet Ihr sehen das das ganze überhaupt nicht so herauskommt wie es anscheinend sollte. -> Es gehen doch alle Zeilen und Spalten durch nicht nur eine da es ya heisst size^2 (also 400) mit ye 2 Triangles(dann 800) und bei der Erstellung sind es 20 Spalten mit je 20 Zeilen(400 Total). Das Ganze ist nun nicht ganz genau so korrekt aber glaub genug um zu sagen das das nicht mein Hauptproblem ist. Wenn ich wirklich den Anschein gebe das ich den Kompleten Code verlangen und nichts selber mache dann wirklich sry. So ist das nun wirklich nicht gemeint, und ich bin ya dankbar für eure Hilfe. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Graphics3D 400,400,0,2
SetBuffer BackBuffer() camera=CreateCamera() PositionEntity camera,0,4,-10 light=CreateLight() RotateEntity light,60,0,0 mesh=CreateMesh() surface=CreateSurface(mesh) size=20 Dim ve(size,size) For z=0 To size For x=0 To size ve(x,z)=AddVertex (surface,x,0,z) Next Next For z=0 To size-1 For x=0 To size-1 v0=ve(x,z) v1=ve(x,z+1) v2=ve(x+1,z+1) v3=ve(x+1,z) AddTriangle surface,v0,v1,v2 AddTriangle surface,v0,v2,v3 Next Next WireFrame True RenderWorld Flip WaitKey End |
||
- Zuletzt bearbeitet von hectic am So, Feb 26, 2006 1:06, insgesamt einmal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und würdest du den Code den man dir liefern ansehen und zu verstehen versuchen, wüsstest du was du daran ändern musst, damit es stimmt.
Ich gebe Hinweise nicht aus sSpass und fertig funktionierenden Code gibts bei mir eigentlich nur bei 3 Zeilen Codes oder einem einzigen Befehl (programmieren ist learning by doing also soll man auch was tun müssen). Da du das 1x20 Problem hast bei meinem Code haste den Hinweis definitiv nicht gelesen, sorry. Aber damit das ganze geklärt ist: Code: [AUSKLAPPEN] graphics3d 800,600,0,2
mesh = createmesh() surface = createsurface(mesh) const size = 20 Dim ve(size * size) For z = 0 To size For x = 0 To size ve(z*(size+1) + x) = AddVertex (surface,x,0,z) Next Next For tz = 0 To size - 1 For tx = 0 to size - 1 v0=ve(tz*(size+1) + tx) v1=ve(tz*(size+1) + tx + 1) v2=ve((tz+1)*(size+1) + tx + 1) v3=ve((tz+1)*(size+1) + tx) AddTriangle surface,v0,v2,v1 AddTriangle surface,v0,v3,v2 Next Next cam = createcamera() piv = createpivot() positionentity piv, 10, 0, 10 positionentity cam, 10, 20, 10 pointentity cam,piv wireframe true While not keyhit(1) updateworld renderworld flip Wend end *und hier sogar in einer form die man auch direkt ausprobieren kann* |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dremora. Bei mir kommt 'Array index out of bounds' bei deinem Code bei eingeschalteten Debugger... Keine Ahnung warum auf ein eindimensionales Array soviel 'Wert' gelegt wird... Wenn man dann wenigstens ein BlitzArray nehmen würde, währen die ja schneller. Soweit ich weiß... | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group