2

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:私はそれを前後に原点に翻訳しようとしましたが、何もしていないようです。

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 に答える