0

回転を適用した後で 3D オブジェクトを移動すると問題が発生します。移動機能と回転機能の両方が単独で完全に機能します。しかし問題は、回転後にオブジェクトを移動すると、オブジェクトがマウスに従わず、奇妙な方向に移動することです。誰かが私の欠陥を見ることができれば、私はそれを感謝します. ありがとう!これが私のコードです:

private void Rotate()
{
    double angle;
    bool willangle = Double.TryParse(AngleRot.Text.ToString(), out angle);
    RectangleVisual3D rect = (RectangleVisual3D)LastSelectedObject;
    AxisAngleRotation3D r = new AxisAngleRotation3D(new Vector3D(0, 0, 1), angle);
    RotateTransform3D rot = new RotateTransform3D(r, rect.Origin);
    rect.Transform = Transform3DHelper.CombineTransform(rect.Transform, rot);
    LastSelectedObject = rect as ModelVisual3D;
}
private void MoveObject(MouseEventArgs e)
{
    if (LastSelectedObject is RectangleVisual3D)
    {
        RectangleVisual3D rect = (RectangleVisual3D)LastSelectedObject;
        Point3D? origin = GetPoints(e);
        if (origin == null)
            return;
        rect.Origin = (Point3D)origin;
        LastSelectedObject = rect as ModelVisual3D;
    }
}
4

2 に答える 2

3

これがお役に立てば幸いです。回転と移動の順序は非常に重要です。移動してから回転すると、x、y、z座標に従って移動します。回転してから移動すると、回転座標に従って移動します。

于 2012-06-19T22:05:25.103 に答える
0

原点を設定してオブジェクトを移動することは、一般的に悪い動きです。ヘルパー ライブラリ (Transform3DHelper は .Net ではないと思いますか?) が基本的な方法で行列演算を行っている場合、rect.Origin を設定することでそれを台無しにしています。

代わりに、移動した距離ベクトルを見つけて、その平行移動行列を適用してみてください。

私は仮定している

Vector2D dist=new Vector2D((oldPosition - newPosition).x, (oldPosition - newPosition).y);

TranslateTransform3D トランス = 新しい TranslateTransform3D(dist.x,dist.y,0);

rect.Transform = Transform3DHelper.CombineTransform(rect.Transform, trans);

もう 1 つの考えられるエラーは、CombineTransform が rect.Transform と腐敗を逆にする必要があることですが、API がそれを処理しているかどうかはわかりません。メソッドのオーバーロードされたバージョンでこれら 2 つを逆にできるかどうかを確認してください。

于 2012-06-19T22:27:42.983 に答える