试图创造旋转螺旋桨。保持在原点周围旋转,而不是自身

时间:2010-10-29 16:10:33

标签: java 3d java-3d

我正在尝试用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:我试图将它转化为原点之前和之后,但它似乎没有做任何事情。

2 个答案:

答案 0 :(得分:2)

不知道足够的Java来给出完整的答案;正如您所怀疑的那样,数学术语中的正确解决方案是:将对象的中心转换为原点,旋转,然后将其转换回原始位置。

但是,很可能(也就是说,我猜)当你组合变换时,它们会被后乘以产生转换发生在模型空间中的效果。您可能想要的是预乘,以产生转换发生在世界空间中的效果。

考虑一下风车的风帆。在代码中,您希望能够转换到风车的顶部,然后调用绘制风帆的例程。该例程可能会应用旋转然后绘制。但就转换而言,实际上你想要在原点旋转风帆,使它们围绕它们的中心旋转,然后将它们移出。因此,转换的顺序与您请求它们的顺序相反。

这意味着,您希望将转换应用为:

  1. 离开原点
  2. 旋转
  3. 移至原点
  4. 例如,如果您使用的是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);
}