我正在编写一个程序,其中试图在ModelVisual3D上实现一些转换。我对TranslateTransform3D没问题,但是当我尝试旋转对象(ModelVisual3D)时,其CenterX,CenterY和CenterZ坐标将变为0,0,0。我不知道如何记住对象的最后位置,当我旋转它时,该对象停留在我平移的位置。我实现了一个对象的旋转,当双击LeftMouseButton时,旋转只执行一次,这是和平的代码,与RotateTransform对应:
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;
}
}
};
}
};
最佳答案
查看您要转换的类型。如果您的类型是“ Vector3D”,则“变换”方法将忽略旋转中心。我认为这没有正确记录。
您正在旋转的类型和“中心”都必须为“ Point3D”类型。
该方法作者的意图是合法的。空间方向(“ Vector3D”)不应取决于旋转中心,因此旋转中心不需要额外平移。但是,如果旋转3D空间中的位置(“ Point3D”),则旋转中心确实很重要。