2

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

4

2 回答 2

2

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

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

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

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

  1. 远离原点
  2. 旋转
  3. 移动到原点

例如,如果你在 OpenGL 中(它也是一个后乘法器,即使你实际上并不知道它也很容易在这个例子中遵循)你可能会这样做:

glTranslatef(centreOfBody.x, centreOfBody.y, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(-centreOfBody.x, -centreOfBody.y, 0.0f);
于 2010-10-29T16:25:14.203 回答
1

@Tommy 建议的方法是正确的。与 GL 一样,Java 图形上下文的转换是concatenated“以最常用的方式”,我认为这是后进。一个典型的paintComponent()方法如下所示,在这个完整的例子中。

@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);
}
于 2010-10-29T21:23:37.283 回答