View Full Version : [Frage] normal-vektoren transformieren in CG1Object.transform()
ich kopiere erst die modelMatrixVector und multiplizier sie mit der viewMatrixVector. wenn ich dann mit transformVectors den normalTable auf transNormals umrechnen will stellts ihn auf. folgendes meldungen:
java.lang.NullPointerException
at CG1Matrix3x3.transformVectors(CG1Matrix3x3.java:13 7)
at CG1Object.transform(CG1Object.java:387)
at CG1Object.draw(CG1Object.java:417)
at CG1MainFrame.drawScene(CG1MainFrame.java:1075)
at CG1MainFrame.addButtonActionPerformed(CG1MainFrame .java:1273)
at CG1MainFrame.access$2100(CG1MainFrame.java:15)
at CG1MainFrame$22.actionPerformed(CG1MainFrame.java: 986)
at java.awt.Button.processActionEvent(Button.java:382 )
at java.awt.Button.processEvent(Button.java:350)
at java.awt.Component.dispatchEventImpl(Component.jav a:3615)
at java.awt.Component.dispatchEvent(Component.java:34 77)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 456)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchTh
read.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:100)
java.lang.NullPointerException
at CG1Matrix3x3.transformVectors(CG1Matrix3x3.java:13 7)
at CG1Object.transform(CG1Object.java:387)
at CG1Object.draw(CG1Object.java:417)
at CG1MainFrame.drawScene(CG1MainFrame.java:1075)
at CG1MainFrame$MouseSpy.run(CG1MainFrame.java:1603)
:confused:
white russian
13-11-2004, 15:35
Wenn du faceNormals und transfaceNormals verwendest müsste es Funktionieren
ps. habe den gleichen Fehler gehabt
hab seit tagen genau das selbe problem ...
seltsam, da gibt es eigentlich wenig, was man falsch machen kann.
"transformVectors (normalTable, transNormals) " kann die ja eigentlich kaum eine null-pointer exception liefern, es sei denn, du hättest die initialisierung von normalTable und transNormals aus CG1Object.load() entfernt ...
hast du eh nicht normalTable oder transNormals nochmal in transform() definiert? das würde das nämlich erklären ...
allgemein ist es übrigens eleganter, modelMatrixVector links auf die neue Matrix draufzumultiplizieren (die neue Matrix wird ja als Einheitsmatrix initialisiert), anstatt die Werte einfach rüberzukopieren. Die Idee, dass man jede modifikation von links draufmultipliziert, bleibt dann erhalten, und das ganze ist etwas übersichtlicher (obwohl natürlich dasselbe rauskommt).
ille_pille
14-11-2004, 00:11
seltsam, da gibt es eigentlich wenig, was man falsch machen kann.
"transformVectors (normalTable, transNormals) " kann die ja eigentlich kaum eine null-pointer exception liefern, es sei denn, du hättest die initialisierung von normalTable und transNormals aus CG1Object.load() entfernt ...
hast du eh nicht normalTable oder transNormals nochmal in transform() definiert? das würde das nämlich erklären ...
allgemein ist es übrigens eleganter, modelMatrixVector links auf die neue Matrix draufzumultiplizieren (die neue Matrix wird ja als Einheitsmatrix initialisiert), anstatt die Werte einfach rüberzukopieren. Die Idee, dass man jede modifikation von links draufmultipliziert, bleibt dann erhalten, und das ganze ist etwas übersichtlicher (obwohl natürlich dasselbe rauskommt).
Ich habe das so implementiert...wie du es erklärt hast. Zuerst erstelle ich eine neue Matrix und dann multipliziere ich modelMatrixVector von links darauf. Dann viewMatricVector.Und dann rufe uch transformVectors mit normalTable und transNormals und bekomme dieselben Exseptions wie oben gepostet!?!
Und ich habe noch eine Frage. Wenn ich das Programm starte und zwei Obejkte lade, dann kann ich diese nicht getrennt transformieren. Also z.b. lade ich zuerst Sphere und rotiere sie. Dann lade ich noch einmal Sphere und wende darauf z.b. trasnlation....dabei wird auch die erste Sphere transliert. Muss das so sein oder habe ich was falsches in meinem Code!?
:confused:
Matthias
14-11-2004, 01:48
Und ich habe noch eine Frage. Wenn ich das Programm starte und zwei Obejkte lade, dann kann ich diese nicht getrennt transformieren. Also z.b. lade ich zuerst Sphere und rotiere sie. Dann lade ich noch einmal Sphere und wende darauf z.b. trasnlation....dabei wird auch die erste Sphere transliert. Muss das so sein oder habe ich was falsches in meinem Code!?
:confused:
sind beide markiert oder nur eine (in der listbox links)?
ille_pille
14-11-2004, 12:16
sind beide markiert oder nur eine (in der listbox links)? :p ja das war das Problem....habe gar nicht geschaut. Danke :thumb:
Ich habe im Moment das selbe Problem.
Beim Testen ist mir aber aufgefallen, dass manche der 3d-atoff files funktionieren (sphere, teapots) und manche (eigentlich der Rest) nicht. An den Angaben wird's aber nicht wirklich liegen oder?
EDIT:
Ich habe mir jetzt zum Testen einmal die Längen der arrays (für die Normalvektoren) ausgeben lassen. Bei den atoff files, die nicht funktionieren sind die arrays aus irgendeinem Grund null. Bei denen, die bei mir funktionieren, sind sie nicht null.
Woran kann das liegen?
- TeMET_noSCE -
14-11-2004, 15:33
ich hatte das selbe problem. bei mir funktionierts seitdem ich die normalvektoren nur dann berechne, wenn diese tatsächlich vom gewählten rendermode benötigt werden! (das steht in einem thread vom letzten jahr glaub ich auch schon erklärt...)
ille_pille
14-11-2004, 15:51
ich hatte das selbe problem. bei mir funktionierts seitdem ich die normalvektoren nur dann berechne, wenn diese tatsächlich vom gewählten rendermode benötigt werden! (das steht in einem thread vom letzten jahr glaub ich auch schon erklärt...)
:) Das erklart schon einiges. Aber wo kann ich nachschauen , für welche RenderModes ob und welche Vektoren zu berechnen sind!?
Das weiß ich leider nicht und ich habe schon gesucht aber nicht für alle eine Erklärung gefunden :(
ich hatte das selbe problem. bei mir funktionierts seitdem ich die normalvektoren nur dann berechne, wenn diese tatsächlich vom gewählten rendermode benötigt werden! (das steht in einem thread vom letzten jahr glaub ich auch schon erklärt...)
Hast du schon andere Rendermodi als Wireframe (bzw. Scanfill) implementiert, um testen zu können, ob die Exceptions dann nicht mehr auftreten?
So wie ich dich verstehe werden bei dir die Normalvektoren im Wireframe Modus einfach nicht transformiert, oder?
- TeMET_noSCE -
14-11-2004, 16:05
Hast du schon andere Rendermodi als Wireframe (bzw. Scanfill) implementiert, um testen zu können, ob die Exceptions dann nicht mehr auftreten?
So wie ich dich verstehe werden bei dir die Normalvektoren im Wireframe Modus einfach nicht transformiert, oder?an das hab ich dummerweise noch nicht gedacht... :shinner:
danke, wenn ich faceNormals auf transfaceNormals transformier gehts.
normalTable und transNormals hab ich gar nicht angerührt, sollte ich das?
Matthias
14-11-2004, 19:50
danke, wenn ich faceNormals auf transfaceNormals transformier gehts.
normalTable und transNormals hab ich gar nicht angerührt, sollte ich das?
Die benötigst du spätestens beim Gouraud und Phongshading, ob du das schon jetzt oder erst später implementierst ist dir überlassen.
faceNormals funktionieren bei mir auch.
Die Normalvektoren, die in normalTable kommen, funktionieren bei mir nur bei Sphere und den beiden Teapots.
Vielleicht ist da ein Fehler in den Files selber oder in der Methode, die die Files einliest?
Matthias
14-11-2004, 20:19
faceNormals funktionieren bei mir auch.
Die Normalvektoren, die in normalTable kommen, funktionieren bei mir nur bei Sphere und den beiden Teapots.
Vielleicht ist da ein Fehler in den Files selber oder in der Methode, die die Files einliest?
Richtig, es ist kein "Fehler", aber bei vielen Modellen existieren keine Vertexnormalen. Beim Berechnen der transformierten Normalen ist daher abzufragen, ob überhaupt welche existieren. Werden diese aufgrund des gewählten Beleuchtungsmodells (Gouraud, Phong) benötigt, sind aber nicht vorhanden, so kann da z.B. auf Flatshaded geschaltet werden. Die Facenormals sollten immer vorhanden sein, da man sie ja selbst berechnet.
Danke für die prompte Antwort. :)
ille_pille
14-11-2004, 22:00
Richtig, es ist kein "Fehler", aber bei vielen Modellen existieren keine Vertexnormalen. Beim Berechnen der transformierten Normalen ist daher abzufragen, ob überhaupt welche existieren. Werden diese aufgrund des gewählten Beleuchtungsmodells (Gouraud, Phong) benötigt, sind aber nicht vorhanden, so kann da z.B. auf Flatshaded geschaltet werden. Die Facenormals sollten immer vorhanden sein, da man sie ja selbst berechnet.
Wie kann ich abfragen,ob Vertexnormalen existieren. normalTable ist erst in der load-methode initalisiert,und falls welche Vertexnormalen gelesen werden,sonst existiert nur die Variable. numNormal, welche die anzahl der gelesenen Vertexnormalen zeigt ist ja lokal für die load-methode....:confused:
Matthias
14-11-2004, 22:03
Wie kann ich abfragen,ob Vertexnormalen existieren. normalTable ist erst in der load-methode initalisiert,und falls welche Vertexnormalen gelesen werden,sonst existiert nur die Variable. numNormal, welche die anzahl der gelesenen Vertexnormalen zeigt ist ja lokal für die load-methode....:confused:
normalTable auf null abfragen...
ille_pille
14-11-2004, 22:39
normalTable auf null abfragen...
:D daran habe ich gar nicht gedacht...danke....
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.