2012-06-19 40 views
0

我在应用旋转后移动3D对象时出现问题。移动和旋转功能都可以独立完成。但问题是当我在旋转之后移动一个对象时,对象不遵循鼠标并沿着奇怪的方向前进。如果有人能看到我的缺陷,我会很感激。谢谢!这里是我的代码:旋转后移动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; 
    } 
} 

回答

3

我希望这样的帮助:旋转和移动的顺序是非常重要的。如果你移动,然后旋转,那么它会根据x,y,z坐标移动。如果你旋转,然后移动,那么它将根据旋转坐标移动。

+1

由互联网故障殴打。详细说明,独立跟踪移动和旋转非常重要,并且如果将独立地允许这些移动和旋转,则将它们应用于每次从原点移动然后旋转顺序。虽然我建议即使使用四元数而不是内部变换,但允许将运动应用于新旋转的坐标系也是有用的,例如,如果您正在模拟飞行。 – Godeke

+0

好的,所以我需要更新我旋转后的坐标?我不知道该怎么做... –

0

通过设置原点来移动对象通常是一个不好的举动。如果你的帮助程序库(我不认为Transform3DHelper是.Net?)以基本方式进行矩阵运算,那么你通过设置rect.Origin来搞定它。

而是尝试找到移动的距离矢量并应用该转换矩阵。

我假定

的Vector2D DIST =新的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和腐烂,但我不确定API是否正在为您处理。查看该方法的重载版本是否允许您颠倒这两个。

+0

它是有道理的,我试图这样做之前,我决定只是设置原点,但当我这样做时,对象刚刚从屏幕上射出 –

+0

可视窗口是通常在-1,-1,-1 - > 1,1,1框中测量。尝试按照屏幕宽度/高度适当地分隔dist.x和dist.y。使用小(〜.25)硬编码转换进行测试。我不知道他们是如何做预测的,但是翻译一个大的z值应该可以按比例缩小你的目标。 – Alex

+0

我注意到,如果我不组合两个转换(只需输入rect.Transform = trans),它将随鼠标移动。但旋转仍然搞砸了,当我在旋转后移动它时,它会重置回原来的位置 –