2008-09-02 30 views
1

我認爲可以通過將scenegraph的變換矩陣應用到z-normal(0,0,1)來完成,但它不起作用。我的代碼是這樣的:如何查找直接從虛擬世界指向Java3D中的法線矢量?

Vector3f toScreenVector = new Vector3f(0, 0, 1); 
Transform3D t3d = new Transform3D(); 
tg.getTransform(t3d); //tg is Transform Group of all objects in a scene 
t3d.transform(toScreenVector); 

然後我試圖這樣的事情太:

Point3d eyePos = new Point3d(); 
Point3d mousePos = new Point3d(); 
canvas.getCenterEyeInImagePlate(eyePos); 
canvas.getPixelLocationInImagePlate(new Point2d(Main.WIDTH/2, Main.HEIGHT/2), mousePos); //Main is the class for main window. 

Transform3D motion = new Transform3D(); 
canvas.getImagePlateToVworld(motion); 
motion.transform(eyePos); 
motion.transform(mousePos); 

Vector3d toScreenVector = new Vector3f(eyePos); 
toScreenVector.sub(mousePos); 
toScreenVector.normalize(); 

但是這仍然無法正常工作。我認爲必須有一個簡單的方法來創建這樣的矢量。你知道我的代碼有什麼問題或更好的方法嗎?

回答

0

是的,你有我的問題的權利。對不起,我昨天有點困惑。現在我通過遵循您的建議並將問題中的兩段代碼混合在一起來糾正代碼:

Vector3f toScreenVector = new Vector3f(0, 0, 1); 

Transform3D t3d = new Transform3D(); 
canvas.getImagePlateToVworld(t3d); 
t3d.transform(toScreenVector); 

tg.getTransform(t3d); //tg is Transform Group of all objects in a scene 
t3d.transform(toScreenVector); 

謝謝。

2

如果我得到這個權利,你想要一個矢量是正常的屏幕平面,但在世界座標?

在想這取決於從 World -> Screen and do Screen -> World(0,0,1)INVERT改造這種情況下軸屏幕百分點。由於ModelView矩陣只是一個旋轉矩陣(忽略均勻變換部分),因此您可以簡單地通過旋轉部分的轉置或簡單讀取將其拖出底部行 - 因爲這會轉換爲Z座標轉換下的列。