Java3D で仮想世界から画面を直接指す法線ベクトルを見つけるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/40028

  •  09-06-2019
  •  | 
  •  

質問

シーングラフの変換行列をz-normal(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();

しかし、これでもまだ正しく動作しません。このようなベクトルを簡単に作成する方法があるはずだと思います。私のコードのどこが間違っているのか、それとももっと良い方法があるのか​​知っていますか?

役に立ちましたか?

解決 2

はい、私の質問は正解でした。昨日は少し混乱してしまい申し訳ありませんでした。あなたの提案に従い、質問内の 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);

ありがとう。

他のヒント

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

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

ModelView 行列は単なる回転行列 (同次変換部分を無視する) であるため、回転部分を転置するか、下の行を単純に読み取ることでこれを簡単に取り出すことができます。これは、これを転置するためです。 Z 転置中の座標列。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top