Gamestudio Links
Zorro Links
Newest Posts
Newbie Questions
by fairtrader. 12/06/23 11:29
Zorro Trader GPT
by TipmyPip. 12/04/23 11:34
Square root rule
by Smallz. 12/02/23 09:15
RTest not found error
by TipmyPip. 12/01/23 21:43
neural function for Python to [Train]
by TipmyPip. 12/01/23 14:47
Xor Memory Problem.
by TipmyPip. 11/28/23 14:23
Training with command line parameters
by TipmyPip. 11/26/23 08:42
Combine USD & BTC Pairs In Asset Loop
by TipmyPip. 11/26/23 08:30
AUM Magazine
Latest Screens
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Tactics of World War I
Who's Online Now
7 registered members (fairtrader, Quad, miwok, Martin_HH, AndrewAMD, alibaba, dpn), 581 guests, and 0 spiders.
Key: Admin, Global Mod, Mod
Newest Members
fairtrader, hus, Vurtis, Harry5, KelvinC
19019 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
OBJ File Format Spezifikationen Faces? #174940
12/27/07 09:22
12/27/07 09:22
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Ich bastel im Moment an einer kleinen App (nicht im 3DGS, ich verwende hierzu ein 2D Authoring Tool) um Graustufenbilder in OBJ umzuwandeln. Und werde ehrlich gesagt irre mit der Formatbeschreibung für OBJ. Zum Beispiel hier zu finden:

http://www.martinreddy.net/gfx/3d/OBJ.spec

Das geht schon los mit dem simplen Auslesen der Vertices v. In der Spezifikation steht, dass in der Reihenfolge X/Y/Z gespeichert werden soll. Aber so ziemlich jede App verlangt X/Z/Y damit das Mesh richtig rotiert dargestellt wird.

Den Teil bekomme ich einigermassen hin.

Weiter mit den Faces vt. Aus der Beschreibung wird man nicht so recht schlau. Ich habe dann probiert einfach die Faces während des Auslesens der Vertices durchzunummerieren, weil es vom Ergebnis so ähnlich aussah. Passte.

Also bekomme ich auch den Teil einigermassen hin. Ein Testfile in dem ich nur den Teil der Vertices und Faces ersetzt habe wurde anstandslos geladen.

Die Normalen. Da dran werd ich irre. Ich bekomme sie nicht berechnet. Nach längerem Suchen fand ich zumindest raus dass es irgendwas mit Kreuzprodukt zu tun hat. Aber irgendwie hauen meine dann darauf basierenden Berechnungen gar nicht hin. Ich bekomme immer für X un Y die gleichen Werte und für Z null. Was so nicht sein kann. Bekennender mathematischer Vollpfosten ^^

Naja, weder Blender noch AOI speichern die Normalen mit. Also ab dafür.

Nun kommt der Teil den ich nicht gebacken bekomme. Denn am Schluss findet sich noch eine Liste der Faces. Und ich bekomme ums Verrecken nicht raus welche Werte da drin gespeichert sind. In der Spezifikation finde ich dazu nichts. Wenn ich aber nicht weiss was ich da reinschreiben soll kann ich auch nichts speichern.

Ich habe mir dann so geholfen dass ich einfach mit fester Grösse arbeite und die Faces Liste eines anderen Files da reinverwurschte. Ist ja ein Mesh mit gleicher Geometrie, abgesehen von den Z Werten der Vertices.

Funzt in Blender, funzt in AOI, funzt in meiner Lieblingsrendersoftware. Sogar MED läd ein so zusammengestupftes OBJ File. Nur da wo ich es brauche funzt die Methode natürlich nicht, grr

Könnte mir jemand sagen welche Werte im Faces Bereich geschrieben gehören?

Last edited by Tiles; 12/27/07 09:25.

trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Re: OBJ File Format Spezifikationen Faces? [Re: Tiles] #174941
12/27/07 11:55
12/27/07 11:55
Joined: Sep 2003
Posts: 9,859
F
FBL Offline
Senior Expert
FBL  Offline
Senior Expert
F

Joined: Sep 2003
Posts: 9,859
Kreuzprodukt:

x1 y1 = x2*y3 - x3*y2
x2 y2 = x3*y1 - x1*y3
x3 y3 = x1*y2 - x2*y1

x123 ist dein erster Vektor, y123 dein zweiter. Beide spannen zusammen eine Ebene auf. Der durch das Kreuzprodukt entstehende Vektor steht senkrecht auf dieser Ebene, ist also folglich die Normale der Ebene. Der Vektor selber ist aber NICHT normalisiert.

Die Reihenfolge der Vektoren ist wichtig beim Kreuzprodukt. Falls deine Normale in die falsche Richtung zeigt, die beiden Vektoren vertauschen.

Re: OBJ File Format Spezifikationen Faces? [Re: FBL] #174942
12/27/07 14:17
12/27/07 14:17
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Danke

Ich hatte zwischenzeitlich die Formel hier ausgebuddelt:

Normalx = (vtx1y - vtx2y) * (vtx2z - vtx3z) - (vtx1z - vtx2z) * (vtx2y - vtx3y)
Normaly = (vtx1z - vtx2z) * (vtx2x - vtx3x) - (vtx1x - vtx2x) * (vtx2z - vtx3z)
Normalz = (vtx1x - vtx2x) * (vtx2y - vtx3y) - (vtx1y - vtx2y) * (vtx2x - vtx3x)

Also das Gleiche. Hinbekommen habe ich es noch nicht. Da klemmt was in meinem Code. Sobald ich das mit den Faces geregelt habe beiss ich mich da wieder fest


trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Re: OBJ File Format Spezifikationen Faces? [Re: Tiles] #174943
12/27/07 17:47
12/27/07 17:47
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Okay, mal mein Problem ein weniger verdeutlichen.

In der Formatbeschreibung steht dass diese Faces in folgender Reihenfolge geschrieben werden: Vertex/Texturkoordinate/Normale

Dass ich bei einem Mehs aus Quads immer vier Zahlenbündel bekomme ist soweit klar. Aber wieso stehen da ganze Zahlen? Vertex ist meist eine Kommazahl. Texturkoordinate, okay, die ist zumindest bei mir eine ganze Zahl.

Ich komme einfach nicht dahinter wie die Zahlen zustandekommen. Selbst wenn ich weiss dass die erste Zahl das Vertice sein soll. Beziehungsweise hier mal ein Bespielmesh.



Wie lautet hier das erste Face? Ohne Normale?

f 1/1 2/2 4/4 /5/5 ? Also Vertices gleich Texturvertices? Und in welcher Reihenfolge?

Mit Normals spuckt mir zum Beispiel trueSpace das hierf für alle vier Faces aus. Keins davon entspricht 1,2,4,5 für ein Face:

f 1/1/1 5/5/5 6/6/6 7/8/7
f 2/2/2 7/8/7 6/6/6 8/9/8
f 4/4/4 8/9/8 6/6/6 9/10/9
f 5/5/5 3/3/3 9/10/9 6/6/6

Wie kommt dieses 7/8/7 zustande? Und wo kommt 10 her? Ich habe doch nur 9 Vertices.


trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Re: OBJ File Format Spezifikationen Faces? [Re: Tiles] #174944
12/30/07 08:56
12/30/07 08:56
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Den Faces Part habe ich nun soweit auch hinbekommen. Ohne die Normalen.

Es wird schlicht bei jedem Vertice ein Index erhöht, also die Vertices durchnummeriert. Und dann werden die zugehörigen Faces mit ihren anderen Vertices in Scanreihenfolge aufgelistet.

Im obigen Bild habe ich in X Richtung losgelegt. Nun muss man nur noch beachten dass die Vertices des Faces gegen den Uhrzeigersinn gelesen werden. Und dann bekommen wir folgendes Ergebnis für das erste Face ohne Normale:

f 1/1 4/4 5/5 2/2

Und um meine obige Frage nach der 10 zu beantworten, ich vermute mal dass hier in der Mitte mit dem Durchnummerieren gestartet wird. Dann nach aussen durchnummeriert. Und das letzte Vertice an dem sich der Kreis wieder schliesst wird dann zweimal nummeriert. Einmal mit zum Beispiel 4, also da wo es nach aussen geht. Und wenns zurückgeht und sich der Kreis schliesst ist das auch gleichzeitig Vertice 10. Denk ich mal.

Zurück zu den Normalen. Die bekomme ich auch noch hin

Last edited by Tiles; 12/30/07 08:57.

trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Re: OBJ File Format Spezifikationen Faces? [Re: Tiles] #174945
12/30/07 12:02
12/30/07 12:02
Joined: Jul 2002
Posts: 3,208
Germany
Error014 Offline
Expert
Error014  Offline
Expert

Joined: Jul 2002
Posts: 3,208
Germany
Theoretisch könntest du die Normalen natürlich auch einfach selbst berechnen, mit dem Kreuzprodukt, wie oben von Firoball vorgeschlagen. Wenn du das machst und die Werte beim Rendern übergibst, kriegst du aber Flat Shading raus, und das finden wir ja alle nicht mehr so schön. Darum nimmt man dann meist den Durchschnitt der umliegenden Faces.
Als ich damals meine Engine mit OpenGL geschrieben hatte, hatte ich für jeden Vertex einen einzelnen "Normalenwert" übergeben können. Wenn ich den von Wings3D benutzt habe, war das auch ein sehr schönes Gourad-shading, das hat mir die eigene Berechnung erspart (obwohl ich das auch mal versucht hatte).

Wie dem auch sei! So sieht das ja beispielsweise aus:

Code:

vn -0.57735027 -0.57735027 0.57735027
vn -0.57735027 0.57735027 0.57735027
vn 0.57735027 0.57735027 0.57735027
vn 0.57735027 -0.57735027 0.57735027
...



Wird ja alles in einer langen Liste gespeichert. Im Face-teil sind dann ja pro Vertex, dass zu dem Face gehört, mehrere Zahlen gespeichert, die sich dann auf die Position des Vertex in der Liste, die Position der Texturkoordinaten in der Liste und die Position der Normale in der Liste bestimmt.

Der jeweils dritte Wert bei "f", also bei

Code:

f 1//2 4//4 3//3 2//1



die jeweils letzte Zahl (2,4,3,1) ist der Wert der Normalen in der Liste. D.h. der erste Vertex von diesem Face hat die Normale -0.57735027 -0.57735027 0.57735027 (siehe Liste oben), der zweite Vertex dieses Face die Normale vn 0.57735027 -0.57735027 0.57735027, usw.

Wenn dein Modellprogramm dir das nicht exportiert, oder wenn du das ganze selber machen willst, musst du die Normalen wohl oder übel selber berechnen:

Machen wir das erstmal für die einzelnen Faces (wird dann ohne "ausgleichen" ein Flat Shading). Für unser Beispielface oben ist das schonmal schwierig, denn das ist ja ein Quad - und vier Punkte müssen nicht unbedingt in der Ebene liegen. Um das ganze erstmal einfahc zu halten, führen wir die bedingung ein, dass das Model nur aus Dreiecken besteht (kann fast jeder Editor mit einer Option wie "Triangulate"). Beispiel einer Pyramide, das ist die v-Liste:

Code:

v -1.00000000 -1.00000000 1.00000000
v 1.00000000 -1.00000000 1.00000000
v -1.00000000 -1.00000000 -1.00000000
v 1.00000000 -1.00000000 -1.00000000
v 0.0000000e+0 1.00000000 0.0000000e+0



und dass hier ist die f-Liste:

Code:

f 1//1 2//2 5//5
f 1//1 4//4 2//2
f 2//2 4//4 5//5
f 3//3 4//4 1//1
f 5//5 3//3 1//1
f 5//5 4//4 3//3



(Natürlich gibts hier schon Normalenwerte - aber die ignorieren wir mal und berechnen unsere eigenen).

Für das erste Face haben wir die folgenden drei Vertices:


Code:

v -1.00000000 -1.00000000 1.00000000
v 1.00000000 -1.00000000 1.00000000
v 0.0000000e+0 1.00000000 0.0000000e+0



Um nun die Normale des zugehörigen Face zu erhalten, rechnen wir erstmal die beiden Richtungsvektoren aus, die wir erhalten, wenn wir von "Vertex 1" zu "Vertex 2" bzw. "Vertex 3" gehen. Das macht:

u = v2 - v1 = 1-(-1) -1-(-1) 1-1 = 2 0 0
v = v3 - v1 = 0-(-1) 1-(-1) 0-1 = 1 2 -1

Und nun kommt das Kreuzprodukt zum Tragen - das Kreuzprodukt gibt uns den Vektor, der senkrecht auf diesen beiden steht. Im dreidimensionalen sind das natürlich beliebig viele, die aber alle parallel (bzw. antiparallel zueinander sind).

Wir erhalten einen davon, indem wir u x v rechnen, nach der Formel oben:

u2*v3 - u3*v2 = 0*(-1) - 0*2 = 0
u3*v1 - u1*v3 = 0*1 - 2*(-1) = 2
u1*v2 - u2*v1 = 2*2 - 0*1 = 4

Die Normale dieses Face lautet also 0|2|4 - die knönen wir dann zb. für die Beleuchtung angeben. Wenn du diese Berechnung jetzt für jedes Face durchführst, kannst du das ganze schön schattieren. Wenn du dann für jeden Vertex den Durchschnitt aller umliegenden Faces berechnest und dass als Normale übergibst (kann man - zumindest bei OpenGL - für jeden Vertex machen), dann wirkt das ganze viel sanfter und "runder". Natürlich sind das eine ganze Menge Berechnungen, musst du dir überlegen, ob du das nicht lieber alles einmal berechnest und dann speicherst und später nur darauf zugreifst.

Mit etwas Pech ist die Normale aber jetzt gerade "falschrum" - dann müssen wir sie invertieren, indem wir jeden Wert mit -1 multiplizieren, dann wäre der Vektor also 0|-2|-4.

Um einen Normalenvektor der Länge 1 zu erhalten, müssen wir ihn normalisieren, d.h. durch seine Länge teilen. Die Länge kriegst du mit:

|x| = sqrt(x1²+x2²+x3²)

hier also

sqrt(0+4+16) = sqrt(20) = 2*sqrt(5) ~ 4,472135

teilen wir die Werte dadurch, erhalten wir:

0|-0,4472135955|-0,89442738

(ungefähr, natürlich).

Und dass wäre dann der Normalenvektor dieses Face!


So. Ich hoffe, dass hat dir geholfen.

EDIT: Ist aber alles schon 'ne Weile her. Wenn ich hier Stuss erzähle, bitte ich, mich zu korrigieren.


Perhaps this post will get me points for originality at least.

Check out Dungeon Deities! It's amazing and will make you happy, successful and almost certainly more attractive! It might be true!
Re: OBJ File Format Spezifikationen Faces? [Re: Error014] #174946
12/30/07 18:33
12/30/07 18:33
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Wow. Super. Danke

Da brauch ich erst mal ein paar Tage mich da reinzulesen. Da ist noch zu viel Bahnhof dabei

Wie oben schon erwähnt habe ich eigentlich nur vor ein Graustufenbild als OBJ zu exportieren. Mit speziellen Shadings zu spielen hatte ich eigentlich nicht vor. Und das triangulieren wollt ich auch eher den Engines überlassen. Mir gehts nur darum ein einigermassen gültiges OBJ File zu schreiben das auch woanders geladen werden kann

Ach, ich probier mal ob ich es überhaupt gebacken bekomme. Und entscheide dann ^^


trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Re: OBJ File Format Spezifikationen Faces? [Re: Tiles] #174947
01/02/08 23:37
01/02/08 23:37
Joined: Sep 2003
Posts: 3,236
San Diego, CA
M
Marco_Grubert Offline
Expert
Marco_Grubert  Offline
Expert
M

Joined: Sep 2003
Posts: 3,236
San Diego, CA
Um kompatibel zu bleiben (und Fehler leichter zu finden) empfehle ich dringend, dass Du grundsaetzlich nur Dreiecke verwendest. Ist fuer Deine eigene Anwendung ja kein Problem da Du einfach nur eine Diagonale durch die Rechtecke ziehen musst.

Re: OBJ File Format Spezifikationen Faces? [Re: Marco_Grubert] #174948
01/03/08 18:36
01/03/08 18:36
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Danke

Sorry dass ich noch nicht Vollzug gemeldet habe. Ich komm grad irgendwie nicht dazu mich weiter mit dem OBJ Problem zu beschäftigen weil ich mich am Rest meines kleinen Proggies in Progress festgebissen habe. Aber irgendwann nächste oder übernächste Woche Woche werde ich wohl wieder ans Normalen Problem geraten. Ich geb dann Laut wenn ichs hinbekommen habe ^^

Wird auf jeden Fall dreieckig berechnet. Mir fehlt eh die Formel um das für ein Quad zu berechnen. Ich habe auch mal ein trueSpace gespeichertes OBJ File unter die Lupe genommen. Die Normalen waren für beide Files gleich. Sprich die Berechnung für das Quads File verwendet auch Dreiecke wie das für die Tris. Sonst wären die Werte nicht gleich


trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Re: OBJ File Format Spezifikationen Faces? [Re: Tiles] #174949
01/10/08 10:29
01/10/08 10:29
Joined: Sep 2007
Posts: 658
germany
Tiles Offline OP
User
Tiles  Offline OP
User

Joined: Sep 2007
Posts: 658
germany
Back to Normals. Und gleich am Fluchen XD

Irgendwie sieht mein Ergebnis immer noch aus wie Schweizer Käse. Alle Normals mit *-1 zu multiplizieren bringt gar nichts. Die Löcher bleiben. Die sind übrigends auch schon im File ohne Normals vorhanden.

Wie seh ich denn so einer Normalen an dass sie in die falsche Richtung zeigt? Und mit welchem Hammer muss ich dann draufhauen um sie wirklich umzudrehen? Wie oben erwähnt hat das Multiplizieren aller Normalen mit -1 gar nix gebracht.


trueSpace 7.6, A7 commercial
Free gamegraphics, freewaregames http://www.reinerstilesets.de
Die Community rund um Spiele-Toolkits http://www.clickzone.de
Page 1 of 2 1 2

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1