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 trans = new TranslateTransform3D(dist.x,dist.y,0);

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

另一个可能的错误是 CombineTransform 应该反转 rect.Transform 和 rot,但我不确定 API 是否正在为您处理。查看该方法的重载版本是否允许您反转这两者。

于 2012-06-19T22:27:42.983 回答