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




Если я правильно понял, вам нужен вектор, нормальный к плоскости экрана, но в мировых координатах?
В этом случае вы хотите, чтобы 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);
Спасибо.