2014-10-27 85 views
2

我正在製作一個程序,其中我試圖在ModelVisual3D上實現幾個轉換。我對TranslateTransform3D沒有問題,但是當我嘗試旋轉一個對象(ModelVisual3D)時,它的CenterX,CenterY和CenterZ座標將會變爲0,0,0。我不知道如何記住對象的最後一個位置,當我旋轉它時,對象停留在我翻譯它的地方。我實現了旋轉對象的是,當LeftMouseButton被雙擊,但旋轉只執行once.Here是代碼的和平,這對應於RotateTransform:RotateTransform3D出現問題

MyViewport.MouseMove += (sender, e) => 
{ 
    if (modelHit != null && e.LeftButton == MouseButtonState.Pressed) 
    { 

     Point endPosition = e.GetPosition(gridDesigner); 
     Vector3D vector3D = GetTranslationVector3D(modelHit, startPosition, endPosition); 

     Matrix3D matrix3D = modelHit.Transform.Value; 
     vector3D += new Vector3D(matrix3D.OffsetX, matrix3D.OffsetY, matrix3D.OffsetZ); 

     matrix3D.OffsetX = vector3D.X; 
     matrix3D.OffsetY = 0.2f; 
     matrix3D.OffsetZ = vector3D.Z; 
     modelHit.Transform = new MatrixTransform3D(matrix3D); 
     startPosition = endPosition; 

     MyViewport.MouseLeftButtonDown += (Sender, m) => 
      { 
       if (modelHit != null && m.LeftButton == MouseButtonState.Pressed) 
       { 
        RotateTransform3D rotateTransform = new RotateTransform3D(); 
        AxisAngleRotation3D axisAngleRotation=new AxisAngleRotation3D(); 

        Matrix3D modelHitCoordinates = modelHit.Transform.Value; 
        rotateTransform.CenterX = modelHitCoordinates.OffsetX; 
        rotateTransform.CenterY = 0.1; 
        rotateTransform.CenterZ = modelHitCoordinates.OffsetZ; 

        axisAngleRotation.Axis = new Vector3D(0, 1, 0); 
        axisAngleRotation.Angle = 0; 
        rotateTransform.Rotation = axisAngleRotation; 

        if (m.ClickCount == 2) 
        { 
         axisAngleRotation.Angle += 45; 
         modelHit.Transform = rotateTransform; 

        } 

       } 
      }; 
    } 
}; 
+2

純粹,簡單的旋轉始終圍繞原點(0,0,0)。如果你想圍繞它的「中心」旋轉一些對象(假設你知道中心的位置),你必須對它進行轉換,使得centr與系統的原點一致,然後旋轉,然後將其翻譯回來。 – heltonbiker 2014-10-27 13:48:20

+0

@heltonbiker編號轉換方法確實允許您指定一個旋轉中心,因此它可以完成您在內部描述的轉換(如果使用了正確的類型,請參見下文)。 – roadrunner66 2015-03-17 15:51:19

回答

0

看看您要變換的類型。如果你的類型是「Vector3D」,那麼Transform方法將忽略旋轉中心。我不認爲這是正確的文件。

您正在旋轉的類型和中心必須是「Point3D」類型。

該方法的作者的意圖是合法的。空間中的方向(「Vector3D」)不應取決於旋轉中心,因此不需要額外轉動旋轉中心。但是,如果您在3D空間中旋轉位置(「Point3D」),則旋轉中心確實很重要。