Java 试图创造旋转的螺旋桨。一直围绕原点旋转,而不是它本身

Java 试图创造旋转的螺旋桨。一直围绕原点旋转,而不是它本身,java,3d,java-3d,Java,3d,Java 3d,我正在尝试用Java3D创建一个旋转的飞机螺旋桨。目前,它正在围绕原点旋转。但是,我需要它围绕自身旋转。我还没有用Java做过很多3D图形,所以我几乎被难住了 TransformGroup rotateTheBlades = new TransformGroup(); rotateTheBlades.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); Alpha rotationAlpha = new Alpha(-1,5000); Rot

我正在尝试用Java3D创建一个旋转的飞机螺旋桨。目前,它正在围绕原点旋转。但是,我需要它围绕自身旋转。我还没有用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:我试着在之前和之后将它翻译成源代码,但它似乎没有做任何事情。

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

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

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

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

  • 离开原点
  • 轮换
  • 移到原点
  • 例如,如果您使用的是OpenGL(它也是一个后乘数,在本例中即使您不知道也很容易理解),您可能会执行以下操作:

    glTranslatef(centreOfBody.x, centreOfBody.y, 0.0f);
    glRotatef(angle, 0.0f, 0.0f, 1.0f);
    glTranslatef(-centreOfBody.x, -centreOfBody.y, 0.0f);
    

    @Tommy建议的方法是正确的。与GL一样,Java图形上下文的转换是“最常用的方式”,我认为是后进先出。典型的
    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);
    }