我在应用旋转后移动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;
}
}
答案 0 :(得分:3)
我希望这有帮助:轮换和移动的顺序非常重要。如果移动,则旋转,然后根据x,y,z坐标移动。如果你旋转,然后移动,那么它将根据旋转坐标移动。
答案 1 :(得分:0)
通过设置原点移动对象通常是一个糟糕的举动。如果您的帮助库(我不认为Transform3DHelper是.Net?)正在以基本方式进行矩阵数学运算,那么您可以通过设置rect.Origin来搞乱它。
相反,尝试找到移动的距离矢量并应用该转换矩阵。
我假设
Vector2D dist = new 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和rot,但我不确定API是否正在为你处理。看看方法的重载版本是否允许你反转这两个版本。