Повернуть вектор с помощью Java 3D

Я пытаюсь использовать Java3D для поворота вектора. Моя цель — создать преобразование, которое сделает вектор параллельным оси Y. Для этого я вычислил угол между исходным вектором и идентичным вектором, за исключением того, что он имеет значение z, равное 0 (исходный x, исходный y, 0 для значения z). Затем я сделал то же самое для оси y (исходный x, 0 для значения y, исходный z). Затем я использовал каждый угол для создания двух объектов Transform3D, перемножил их вместе и применил к вектору. Мой код выглядит следующим образом:

Transform3D yRotation = new Transform3D();
Transform3D zRotation = new Transform3D();

//create new normal vector
Vector3f normPoint = new Vector3f (normal.getX(), normal.getY(), normal.getZ());

//****Z rotation methods*****
Vector3f newNormPointZ = new Vector3f(normal.getX(), normal.getY(),0.0F);
float zAngle = normPoint.angle(newNormPointZ);
zRotation.rotZ(zAngle);

//****Y rotation methods*****
Vector3f newNormPointY = new Vector3f(normal.getX(),0.0F, normal.getZ());
float yAngle = normPoint.angle(newNormPointY);
yRotation.rotY(yAngle);

//combine the two rotations
yRotation.mul(zRotation);

System.out.println("before trans normal = " +normPoint.x + ", "+normPoint.y+", "+normPoint.z);
//PRINT STATEMENT RETURNS: before trans normal = 0.069842085, 0.99316376, 0.09353002

//perform transform 
yRotation.transform(normPoint);

System.out.println("normal trans = " +normPoint.x + ", "+normPoint.y+", "+normPoint.z);
//PRINT STATEMENT RETURNS: normal trans = 0.09016449, 0.99534255, 0.03411238    

Я надеялся, что преобразование даст значения x и z, равные или очень близкие к 0. Хотя логика мне понятна, я явно что-то упускаю.


person BrenOsh    schedule 23.06.2011    source источник


Ответы (1)


Если ваша цель состоит в том, чтобы повернуть вектор параллельно оси y, почему вы не можете просто вручную установить его, используя величину вектора и установив вектор на ‹0, MAGNITUDE, 0>?

Кроме того, вы должны знать, что поворот вектора так, чтобы он указывал прямо на +Y или -Y, может привести к поломке некоторых реализаций поворота, поскольку они работают в соответствии с вектором «мир вверх», или ‹0,1,0>. Вы можете решить эту проблему, создав свою собственную систему вращения и используя вектор «вне мира» ‹0,0,1> при вращении прямо вверх.

Если у вас есть для этого какие-то другие цели, fastgraph помог мне с построением матриц вращения.

Лучше всего понимать математику происходящего, чтобы знать, что делать в будущем.

person maher.cs    schedule 23.06.2011
comment
Спасибо. Моя общая цель - повернуть все облако точек, чтобы пол имел значения, очень близкие или равные 0. Я пытаюсь создать Transform3D, который будет вращать вектор (нормальный к полу) параллельно оси Y, а затем использовать тот же Transform3D для поворота каждой точки в облаке точек. Я надеюсь, что после поворота все точки, принадлежащие полу, будут иметь значение, очень близкое к нулю. Это звучит как достойный подход? - person BrenOsh; 24.06.2011
comment
Расположение каждой точки будет зависеть от оси вращения. Если я правильно помню, функции RotX/Y/Z вращаются с использованием матрицы просмотра модели каждого объекта, поэтому вращение точки, которая была перемещена в (a,b,c), приведет к тому, что точка все еще будет находиться в (a,b, в), но с другим направлением нормали. AxisAngle4f кажется тем, что вам нужно. - person maher.cs; 24.06.2011