2014-10-27 86 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”),则旋转中心确实很重要。