java - 如何在 Java 3D 中旋转对象?

标签 java opengl graphics java-3d

我用以下代码在 Java 3D 中绘制了一个圆锥体:

Cone cone = new Cone(2f, 3f);

Transform3D t3d = new Transform3D();
TransformGroup coneTransform = new TransformGroup(t3d);
coneTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

t3d.setTranslation(new Vector3f(0f,0f,0f);
coneTransform.setTransform(t3d);
coneTransform.addChild(cone);

this.addChild(coneTransform);

假设我将圆锥体放在点 (1,1,1) 上,我希望圆锥体的尖端指向一条穿过 (0,0,0) 和 (1,1,1) 的假想线。 .. 我该怎么做?

这是我一直在尝试的示例:

Transform3D t3d = new Transform3D();  

Vector3f direction = new Vector3f(1,2,1);    

final double angleX = direction.angle(new Vector3f(1,0,0));
final double angleY = direction.angle(new Vector3f(0,1,0));
final double angleZ = direction.angle(new Vector3f(0,0,1));

t3d.rotX(angleX);
t3d.rotY(angleY);
t3d.rotZ(angleZ);

t3d.setTranslation(direction);

coneTransform.setTransform(t3d);

提前感谢所有帮助!

最佳答案

目前我自己正在学习 Java 3D,根据我目前的知识,旋转方法将变换设置为仅围绕该轴旋转。 因此,如果您希望围绕多个轴执行旋转,那么您将需要使用第二个 Transform3D。
即:

Transform3D rotation = new Transform3D();
Transform3D temp = new Transform3D();

rotation.rotX(Math.PI/2);
temp.rotZ(Math.PI/2);
rotation.mul(temp); // multiply the 2 transformation matrices together.

至于Math.PI的原因,这是因为它使用的是弧度而不是度数,其中Math.PI相当于180度。

找到当前方向和预期方向之间的角度并不难 - 您可以使用 Vector3fs 和 angle() 方法。 Vector 将设置为初始方向,另一个设置为预期方向。 但是,这并没有告诉您角度位于哪个轴上。这样做需要检查 vector 以查看设置了哪些段。 [当然,API 中可能还有一些我目前不知道的东西]

关于java - 如何在 Java 3D 中旋转对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330727/

相关文章:

java - Double 无法取消引用 Java 编译器错误

Java 重命名正常文件的问题。我想将给定名称重命名为新文件名

c++ - 在OpenGL程序中绘制彩色四边形作为背景

python - 使用 OpenCv-python 的失真效果

algorithm - 模拟自然铅笔需要画线算法

java - Netty 可以为每个客户端请求发送多个响应吗

java - 从 ASCII 转换为十六进制并再次转换回来时丢失左引号

opengl - 无法理解合并实例的概念

c++ - 闪烁(后台缓冲区?)

algorithm - 最快的边缘检测方法是什么?