Как найти нормальный вектор, указывающий прямо из виртуального мира на экран в Java3D?

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

Но все равно это работает некорректно. Я думаю, что должен быть простой способ создать такой вектор. Вы знаете, что не так с моим кодом или лучше?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 084
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

Ответ принят как подходящий

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

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

Спасибо.

Другие вопросы по теме