Повернуть вектор с помощью Java 3D - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь использовать 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. Хотя логика имеет смысл для меня, я явно что-то упускаю ..

1 Ответ

1 голос
/ 24 июня 2011

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

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

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

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

...