Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 21:01

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen&Blender-RAW-Model
BeitragVerfasst: Do Aug 24, 2006 01:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Hi,

ich hab grad ein kleines Problem mit der Normalenberechnung eines Blender-RAW-Models (hui, überraschend ;) ). Nun, ich hab mir in Blender mal den Monkey erstellt, ein paar mal gesubsurfaced, dann gesmoothed und mangels Wissen über irgendwelche Modelformate und -loader als RAW exportiert.
Soweit ich das begriffen habe, steht jede Zeile für ein TRIANGLE_FAN mit den angegeben Vertizes. Also hab ich mir erstmal einen Loader gebastelt, aber das Ergebnis gefällt mir nicht wirklich:
Bild
(mit Specular-Shader)
Bild
(nur CubeMap)

Das ist mein Loader:
Code:
  1. procedure TAVModel.LoadFromFile(FileName: string);
  2.   procedure MakeVecs(const Str: string);
  3.   var
  4.     i, j, k: Integer;
  5.     dat: string;
  6.     B, L, V: TVector3f;
  7.   begin
  8.     dat := '';
  9.     j := 0;
  10.     k := 0;
  11.     for i := 1 to Length(Str) do
  12.     begin
  13.       if Str[i] = ' ' then
  14.       begin
  15.         V[j] := StrToFloat(dat);
  16.         Inc(j);
  17.         if j = 3 then
  18.         begin
  19.           if k >= 2 then
  20.           begin
  21.             SetCurrentNormal(L[0], L[1], L[2], V[0], V[1], V[2], B[0], B[1], B[2]);
  22.  
  23.             Inc(Triangles);
  24.           end
  25.           else if k = 0 then
  26.             B := V;
  27.  
  28.           L := V;
  29.           glVertex3fv(@V);
  30.           Inc(k);
  31.           L := V;
  32.           j := 0;
  33.         end;
  34.         dat := '';
  35.       end
  36.       else if Str[i] = '.' then
  37.         dat := dat+','
  38.       else
  39.         dat := dat+Str[i];
  40.     end;
  41.   end;
  42. var
  43.   SL: TStringList;
  44.   i: Integer;
  45. begin
  46.   Triangles := 0;
  47.  
  48.   SL := TStringList.Create;
  49.   try
  50.     SL.LoadFromFile(FileName);
  51.  
  52.     glNewList(FList, GL_COMPILE);
  53.  
  54.     for i := 0 to SL.Count-1 do
  55.     begin
  56.       glBegin(GL_TRIANGLE_FAN);
  57.         MakeVecs(SL.Strings[i]);
  58.       glEnd;
  59.     end;
  60.  
  61.     glEndList;
  62.   finally
  63.     SL.Free;
  64.   end;
  65. end;


Das ist SetCurrentNormal:
Code:
  1. procedure SetCurrentNormal(X1, Y1, Z1, X2, Y2, Z2: Single; X0: Single = 0;
  2.                            Y0: Single = 0; Z0: Single = 0);
  3. var
  4.   v: array[0..2] of GLFloat;
  5.   l: Single;
  6.   i: Integer;
  7. begin
  8.   if X0 <> 0 then
  9.   begin
  10.    X1 := X1-X0;
  11.    X2 := X2-X0;
  12.   end;
  13.   if Y0 <> 0 then
  14.   begin
  15.     Y1 := Y1-Y0;
  16.     Y2 := Y2-Y0;
  17.   end;
  18.   if Z0 <> 0 then
  19.   begin
  20.     Z1 := Z1-Z0;
  21.     Z2 := Z2-Z0;
  22.   end;
  23.  
  24.   v[0] := Y1*Z2 - Z1*Y2;
  25.   v[1] := Z1*X2 - X1*Z2;
  26.   v[2] := X1*Y2 - Y1*X2;
  27.  
  28.   l := 0;
  29.   for i := 0 to 2 do
  30.     l := l + Sqr(v[i]);
  31.   l := Sqrt(l);
  32.   for i := 0 to 2 do
  33.     v[i] := v[i]/l;
  34.  
  35.   glNormal3fv(@v);
  36. end;


Meiner Meinung nach stimmt irgendwas mit den Normalen nicht. Im WireFrame-Mode sehen die Planes auch passend aus. Nun, sieht irgendjemand nen Fehler oder hat ne Idee? Wäre sehr dankbar.

Noch was: Das Model hat derzeit 15.000 Triangles und läuft bei mir auf etwa 40 fps, ein anderes (Runtime-Generiertes) etwa 13.500 und läuft auf 400fps. Das erste wird mit GL_TRIANGLE_FAN, das zweite mit GL_QUAD_STRIP gerendert. Macht das so einen großen Unterschied?

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 24, 2006 10:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich kenne immer nur 2 Probleme mit export von Blender zu xd_data.
1)Es werden nur normale Facenormals und nicht Smooth Shaded Normals exportiert, dadurch sehen models ziemlich kantig aus.
Hier müsste man entweder gucken, wo die endgültigen Normals liegen und exportieren oder selber im Programm berechnen.
2)y und z sind verdreht, wenn man beim exportieren ist, sollte man die Objekt Matrix mit den Verticecoordinaten verrechnen und y,z vertauschen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 24, 2006 15:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Erstmal Danke für die Antwort,
TAK2004 hat geschrieben:
Ich kenne immer nur 2 Probleme mit export von Blender zu xd_data.

ich bin zwar grade noch nicht so auf der Höhe mit Models im Allgemeinen. Derzeit langt mir ein simpler RAW-Export:
Code:
  1. 0.453143 0.177865 0.753151 0.438540 0.160269 0.756324 0.446654 0.151414 0.742665 0.462793 0.170894 0.739169
  2. 0.463862 0.198198 0.750722 0.453143 0.177865 0.753151 0.462793 0.170894 0.739169 0.474706 0.193371 0.736475
  3. [...]

Wenn ich durch das Überfliegen mittels Suche richtig informiert bin, ist xd_data XML-basiert und wir reden nicht über Dasselbe?
Zitat:
1)Es werden nur normale Facenormals und nicht Smooth Shaded Normals exportiert, dadurch sehen models ziemlich kantig aus.
Hier müsste man entweder gucken, wo die endgültigen Normals liegen und exportieren oder selber im Programm berechnen.

Derzeit berechne ich ja Face-Normals im Programm (siehe oben), da RAW nur Vertizes exportiert. Vertex-Normals wären natürlich ne bessere Idee, aber da muss ich erstmal noch die geladenen Vertizes zwischenspeichern. Allerdings kommen mir (siehe Screenshots oben) manche Face-Normals nicht wirklich korrekt vor. Da könnte natürlich auch direkt ein Export der Normalen aus Blender in ein "richtiges" Format nützlich sein. Nur derzeit bin ich noch auf der Suche nach passenden Loadern / Exportern / Specs. RAW war halt nur geschickt für Quick'n'Dirty. ;)
Zitat:
2)y und z sind verdreht, wenn man beim exportieren ist, sollte man die Objekt Matrix mit den Verticecoordinaten verrechnen und y,z vertauschen.

Das ist nicht das Problem, wie gesagt, alle Faces liegen laut Wireframe da wo sie sein sollten.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 24, 2006 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hab mir dein Code mal angeguckt und glaube nun das Problem zu kennen.
Du benutzt ja Stripes aber für stripes müsstest du die normals smoothen, sonnst sind sie völlig murks.
Also entweder steigst du auf triangles, quads um oder du musst deine normalberechnung ändern.

normal1=normal1
normal2=(normal2+normal4)/2
normal3=normal2
normal4=(normal4+normal6)/2

So in etwa wäre es, um smooth normals für ein stripe zu berechnen aber selbst das wäre noch nicht korrekt.
Da es nicht mit anderen Stripes übereinstimmt.

Das beste wäre alle normals für jedes face zu berechnen und anschliessend folgendes zu tun.
1list mit allen vertice anlegen

2Vertice auswählen
-umliegende Vertice ermitteln
-normals aller selektierten Vertice auf addieren
-neue normal mit der anzahl der selektierten Vertice dividieren
-neue normal in einen extra variable speichern
-vertice von der liste entfernen
-überprüfen ob noch vertice da sind und mit 2Schritt weiter machen

Nun hast du meshdaten,face normals und smooth vertice normals.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 24, 2006 19:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
OK, Danke für die Mühe. Vielleicht werde ich die RAW-Daten einfach in ein eigenes Format übertragen lassen, dass mir dann Vertices geschickt speichert, Normalen berechnet und dazuspeichert. Das spart zusätzlich Speicherplatz und Performance. Deine Methode klingt interessant, werde ich dann bei Bedarf einbauen.
Da ich aber übermorgen in Urlaub fahren werde, wird das wohl noch ein bisschen aufgeschoben werden. ;)

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 25, 2006 13:21 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Es macht durchaus sinn auch die normalen aus Blender zu exportieren. Dann muss man sie zumindest nicht mehr im Program neu berechnen und man hat durchaus die Möglichkeit die Normalvektoren zu manipulieren..


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]