1

シーングラフの変換行列を z 法線 (0, 0, 1) に適用すればできると思いますが、うまくいきません。私のコードは次のようになります。

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();

しかし、それでもこれは正しく機能しません。そのようなベクトルを作成する簡単な方法があるに違いないと思います。私のコードの何が問題なのか、またはより良い方法を知っていますか?

4

2 に答える 2

2

これが正しければ、画面平面に垂直なベクトルが必要ですが、ワールド座標でしょうか?

その場合、画面が下を向いている軸から、またはどの軸に応じてINVERT変換する必要があります。World -> Screen and do Screen -> World(0,0,-1)(0,0,1)

ModelView マトリックスは単なる回転マトリックスであるため (同次変換部分は無視)、回転部分の転置を取得するか、一番下の行を読み取るだけでこれを引き出すことができます。これは、転置中のZ座標列に転置されるためです。

于 2008-09-02T21:05:56.027 に答える
0

はい、あなたは私の質問を正しく理解しました。昨日は少し混乱してしまい申し訳ありませんでした。今、私はあなたの提案に従い、質問の2つのコードを混ぜ合わせてコードを修正しました:

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);

ありがとうございました。

于 2008-09-03T06:07:08.893 に答える