Как найти нормальный вектор, указывающий прямо из виртуального мира на экран в Java3D? - PullRequest
1 голос
/ 02 сентября 2008

Я думаю, что это можно сделать, применив матрицу преобразования графа сцены к 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 голосов
/ 03 сентября 2008

Если я правильно понял, вы хотите вектор, который является нормальным к плоскости экрана, но в мировых координатах?

В этом случае вы хотите INVERT преобразование из World -> Screen and do Screen -> World в (0,0,-1) или (0,0,1) в зависимости от того, на какую ось направлен экран.

Поскольку матрица ModelView является просто матрицей вращения (игнорируя однородную часть преобразования), вы можете просто извлечь это, взяв транспонирование вращающейся части или простое чтение в нижнем ряду - так как это транспонируется в Z координатный столбец при транспонировании.

0 голосов
/ 03 сентября 2008

Да, вы правильно поняли мой вопрос. Извините, что я был немного смущен вчера. Теперь я исправил код, следуя вашему предложению и смешав два фрагмента кода в вопросе:

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

Спасибо.

...