2012-06-19 96 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),它將隨鼠標移動。但旋轉仍然搞砸了,當我在旋轉後移動它時,它會重置回原來的位置 –