Java 试图创造旋转的螺旋桨。一直围绕原点旋转,而不是它本身
我正在尝试用Java3D创建一个旋转的飞机螺旋桨。目前,它正在围绕原点旋转。但是,我需要它围绕自身旋转。我还没有用Java做过很多3D图形,所以我几乎被难住了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
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知识来给出完整的答案;数学术语中正确的解决方案正如您所怀疑的:将对象的中心平移到原点,旋转,然后将其平移回原始位置 然而,很可能(即,我猜)当您组合转换时,它们会被后乘,以产生转换在模型空间中发生的效果。您可能想要的是预乘法,以使变换在世界空间中发生 以风车的帆为例。在代码中,您希望能够转换到风车顶部,然后调用绘制风帆的例程。该例程可以应用旋转,然后绘制。但在变换方面,实际上你想在原点旋转帆,使其围绕中心旋转,然后将其移出。因此,转换的应用顺序与您请求它们的顺序相反 这意味着,您希望将转换应用为:
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);
}