我正在尝试用Java 3D创建旋转飞机螺旋桨。此刻,它正在原点周围旋转。但是,我需要它绕自己旋转。我在Java中没有做太多的3D图形,所以我很难过。
TransformGroup rotateTheBlades = new TransformGroup();
rotateTheBlades.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Alpha rotationAlpha = new Alpha(-1,5000);
RotationInterpolator rotator = new RotationInterpolator(
rotationAlpha,rotateTheBlades);
Transform3D abc = new Transform3D();
abc.rotZ(Math.PI/2);
rotator.setTransformAxis(abc);
rotator.setSchedulingBounds(new BoundingSphere());
rotateTheBlades.addChild(rotator);
rotateTheBlades.addChild(propeller);
sceneBG.addChild(rotateTheBlades);
非常感谢任何帮助。 PS:我试图将它转化为原点之前和之后,但它似乎没有做任何事情。
答案 0 :(得分:2)
不知道足够的Java来给出完整的答案;正如您所怀疑的那样,数学术语中的正确解决方案是:将对象的中心转换为原点,旋转,然后将其转换回原始位置。
但是,很可能(也就是说,我猜)当你组合变换时,它们会被后乘以产生转换发生在模型空间中的效果。您可能想要的是预乘,以产生转换发生在世界空间中的效果。
考虑一下风车的风帆。在代码中,您希望能够转换到风车的顶部,然后调用绘制风帆的例程。该例程可能会应用旋转然后绘制。但就转换而言,实际上你想要在原点旋转风帆,使它们围绕它们的中心旋转,然后将它们移出。因此,转换的顺序与您请求它们的顺序相反。
这意味着,您希望将转换应用为:
例如,如果您使用的是OpenGL(也是一个后乘数,即使您实际上并不熟悉,也很容易在此示例中使用),您可能会这样做:
glTranslatef(centreOfBody.x, centreOfBody.y, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(-centreOfBody.x, -centreOfBody.y, 0.0f);
答案 1 :(得分:1)
@Tommy建议的方法是正确的。与GL一样,Java图形上下文的转换是concatenated
“以最常用的方式”,我认为它是 last-in , first-out 。典型的paintComponent()
方法如下所示,完整example。
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
g2d.rotate(theta);
g2d.translate(-image.getWidth(null) / 2, -image.getHeight(null) / 2);
g2d.drawImage(image, 0, 0, null);
}