2010-11-15 97 views
2

我在WPF中有一個3D透明對象。用於創建對象的畫筆的不透明度值已設置爲0.25。 我必須使用鼠標移動來旋轉關於其中心點的3D對象。 目前,物體的旋轉方向與鼠標移動方向相反。 有沒有人有關於如何在3D空間中旋轉透明對象的想法?WPF中的3D對象旋轉

用於旋轉的代碼是:

public static void DoMouseMoveEvent(object sender, MouseEventArgs e, Transform3DGroup transform3DGroup, System.Windows.Controls.Viewport3D viewport3D, ref Point mLastPos, Point3D centerPoint) 
    { 
     var pos = Mouse.GetPosition(viewport3D); 


     var actualPos = new Point(pos.X - viewport3D.ActualWidth/2, 
       viewport3D.ActualHeight/2 - pos.Y); 
     double dx = actualPos.X - mLastPos.X; 
     double dy = actualPos.Y - mLastPos.Y; 

     double mouseAngle = 0; 

     if (dx != 0 && dy != 0) 
     { 
      mouseAngle = Math.Asin(Math.Abs(dy)/
       Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2))); 
      if (dx < 0 && dy > 0) mouseAngle += Math.PI/2; 
      else if (dx < 0 && dy < 0) mouseAngle += Math.PI; 
      else if (dx > 0 && dy < 0) mouseAngle += Math.PI * 1.5; 
     } 
     else if (dx == 0 && dy != 0) 
     { 
      mouseAngle = Math.Sign(dy) > 0 ? Math.PI/2 : Math.PI * 1.5; 
     } 
     else if (dx != 0 && dy == 0) 
     { 
      mouseAngle = Math.Sign(dx) > 0 ? 0 : Math.PI; 
     } 

     double axisAngle = mouseAngle + Math.PI/2; 

     var axis = new Vector3D(Math.Cos(axisAngle) * 4, Math.Sin(axisAngle) * 4, 0); 

     //axis.Normalize(); 

     double rotation = 0.02 * Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2)); 

     var r = new QuaternionRotation3D(new Quaternion(axis, rotation * 180/Math.PI)); 

     var rotateTransform = new RotateTransform3D(r, centerPoint);    

     transform3DGroup.Children.Add(rotateTransform); 

     mLastPos = actualPos; 
    } 

可否不正確的行爲的原因是該z座標未被捕獲用於上述代碼段計算的旋轉?

感謝您的幫助....

回答

0

我認爲協調Z中的問題。如果在三維中不使用此座標旋轉圖形,則會在第三維中使用位置座標z座標。如果你計算z座標,我認爲問題將得到解決