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

Aktuelle Zeit: Fr Jul 11, 2025 05:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen bei Animation berechnen
BeitragVerfasst: Mi Okt 31, 2007 18:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hallo,

wir haben eine allgemeine Frage bzgl. Normalen-Transformation bei Animationen.
Was wäre denn der beste und einfachste Weg? Wir haben schon folgende Möglichkeiten durchdacht:

(1) Manuelle Normalenberechnung nach jeder Bewegung über Kreuzprodukt.
-> Gravierender Nachteil: Für jedes Face gibt es ja bekannterweise 2 Normalen ...
Wie muss man das Kreuzprodukt anwenden, damit man die 'richtige' erhält, bzw. welche ist denn überhaupt die richtige Normale?

(2) Wir speichern die Normalen bereits beim Exportieren des Objekts mit ab und berechnen sie dann grob und sehr ungenau bei jeder Bewegung des Objekts, durch 'einfache', durch die Bones vorgegebene, Drehung der Normalen.

Wie ihr seht, haben wir keine wirklich brauchbare Lösung ... vielleicht gibt es ja eine standard-Lösung und wir sind einfach nicht darauf gekommen ;)
Dann gibt es ja noch das Problem mit 'solid' und 'smooth' der Faces.
Wie muss man das berücksichtigen, denn das macht die ganze Sache noch viel komplizierter ...

Vielen Dank schonmal für die Hilfe.

Conan, MatReno

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 31, 2007 22:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Wenn ich dich richtig verstanden habe, so verwendest du Boneanimationen. D.h. du besitzt die Matrizen zu den bestimmten Keyframes, mit denen du deine neue Vertexposition ermittelst. Ebenso wie die Vertices durch die Matrizen transformiert werden können, so lässt sich auch eine Normale transformieren.
Du musst also nur die Normalen für die initiale Positionen der Faces berechnen und ihre Ausrichtung zum jeweiligen Zeitpunkt errechnest du dann ebenso wie die Vertexpositionen. Statt die Normalen jedoch mit der kompletten Matrix zu multiplizieren (denn diese enthält auch die Translationsinformationen für die Vertices) interessieren dich hier nur die Rotationskomponenten (D.h. die ersten drei Zeilen und Spalten). Anschließend musst du die transformierten Normalen noch einmal normalisieren.

Da du die Normalen nur transformierst behältst du automatisch immer deine smoothed Faces (soweit für die initiale Faceposition einmal berechnet), da mit einer Verformung eines Faces auch die Normalen entsprechend rotiert werden.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 01, 2007 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Vielen Dank für die Antwort, Magellan.

Was passiert jedoch mit den Normalen der umliegenden Vertices bei einem gesmoothten Face?
Nehmen wir bspw. eine gesmoothte Heightmap, womit sich die Normale eines Vertices aus den vier umliegenden Vertices ergibt.
Wird jetzt bei einer Animation nur ein einziger Vertex dieser Heightmap verschoben, so würden wir dementsprechend auch nur dessen Normale transformieren, die vier umliegenden jedoch nicht.

Hab' ich dich da richtig verstanden?

Ist das ein Problem, das andere Loader auch außer Acht lassen, da es vernachlässigbar ist?

Vielen Dank nochmal,
Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 01, 2007 18:36 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du wirst nach der Transformation die "Gesamtnormalen" an der die geänderte Normale beteiligt ist nochmal berechnen müssen. Sonst stimmt die beleuchtung nicht mehr mit der Geometrie überein.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 01, 2007 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Hi Flash,

danke für die Antwort.
Dann muss ich also für jedes gesmoothte Face, das besagten transformierten Vertex benutzt, die entsprechenden Nachbar-Vertices kennen, um deren Normale wiederrum mithilfe deren Nachbar-Vertices via Kreuzprodukt neu zu berechnen? :shock:

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 08, 2007 10:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Nehmen wir also an, ich habe für jeden Vertex die entsprechenden Nachbar-Vertizen vorliegen.
Wie berechne ich daraus das Kreuzprodukt, d.h. wie kann ich jeden dieser Nachbarn miteinbeziehen, um anschließend die korrekte, gesmoothte Normale zu erhalten?
Nehmen wir bspw. den Vertex an der Spitze eines Cones. Dieser hat i.d.R. 'ne ganze Menge Nachbar-Vertizen. Aus welchen Vertexpaaren mache ich jeweils meine Vektoren für das Kreuzprodukt? Beim Cone wäre die Wahl der Vertexpaare evtl. egal, ist aber der Cone deformiert, so erhalte ich, glaube ich, für jede Möglichkeit, die Vertexpaare auszuwählen, eine andere Normale ...

Gehe ich falsch an die Sache ran?

Conan

_________________
THE TRUTH IS NOT OUT THERE!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 08, 2007 21:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Im Prinzip ist es recht simpel. Du berechnest für jedes Dreieck, welches aus dem jeweiligen Vertex besteht die Normale. Diese Normalen addierst du einfach auf, soweit sie einen bestimmten Winkel nicht überschreiten. Eine Kugel sieht mit weichen normalen toll aus. Bei einem Würfel erreichst du hingegen das Gegenteil. Anschließend bringst du diese Normalensumme wieder auf die Länge von 1 und du hast deine weiche Normale.

Ein Vertex kann also durchaus mehrere Normalen haben. Nimm z.B. den Eckpunkt eines Würfels! Dieser hätte dann drei Normalen für die angrenzenden Flächen. Ein Vertex an der Kante eines Kegels hätte z.B. zwei Normalen (Eine weiche Normale an der gerundeten Fläche und eine Richtung Boden). Bei einer Kugel hätte ein Vertex nur noch eine Normale.

Ich nutze einen Grenzwinkel von 30° der aus meiner Sicht recht gute Ergebnisse liefert.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 08, 2007 22:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 07, 2006 13:37
Beiträge: 83
Wohnort: Partenheim
Danke, Magellan.
Damit sollten nun endlich alle Unklarheiten behoben sein und ich kann mich wieder an die Arbeit machen 8)

Großartig, nochmals vielen Dank,
Conan

_________________
THE TRUTH IS NOT OUT THERE!


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste


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.008s | 15 Queries | GZIP : On ]