Как найти нормальный вектор, указывающий прямо из виртуального мира на экран в 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

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

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 - > Экран и сделать экран - > Мир из (0,0, -1) или (0,0,1) в зависимости от того, на какую ось направлен экран.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top