Как вращать камеру с помощью мыши по оси X, а не Y не сдвигая 3D модель? Есть следующий код который вращает камеру вокруг 3D модели но модель постоянно сдвигается то влево то вправо то перемещается вверх за пределы окна и вращается очень быстро как это исправить? Как задать центр вращения. 3D Tools Trackball смотрел там такие же проблемы. | Код |
AxisAngleRotation3D rotate;
public MainWindow() { InitializeComponent(); }
Point mouseLastPosition; double mouseDeltaFactor = 10.00; double scaleFactor = 1; Point3D currentPosition; Vector3D lookDirection;
private void Viewport3D_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { mouseLastPosition = e.GetPosition(this); }
private void Viewport3D_MouseMove(object sender, MouseEventArgs e) { if (Mouse.LeftButton == MouseButtonState.Pressed) { Point newMousePosition = e.GetPosition(this); if (mouseLastPosition.X != newMousePosition.X) { HorizontalTransform(mouseLastPosition.X < newMousePosition.X, mouseDeltaFactor); } if (mouseLastPosition.Y != newMousePosition.Y) { // VerticalTransform(mouseLastPosition.Y > newMousePosition.Y, mouseDeltaFactor); } mouseLastPosition = newMousePosition; } }
private void VerticalTransform(bool upDown, double angleDeltaFactor) { Vector3D postion = new Vector3D(DefCamera.Position.X, DefCamera.Position.Y, DefCamera.Position.Z); Vector3D rotateAxis = Vector3D.CrossProduct(postion, DefCamera.UpDirection); RotateTransform3D rt3d = new RotateTransform3D(); rotate = new AxisAngleRotation3D(rotateAxis, angleDeltaFactor * (upDown ? -1 : 1)); rt3d.Rotation = rotate; Matrix3D matrix = rt3d.Value; Point3D newPostition = matrix.Transform(DefCamera.Position); DefCamera.Position = newPostition; DefCamera.LookDirection = new Vector3D(-newPostition.X, -newPostition.Y, -newPostition.Z);
Vector3D newUpDirection = Vector3D.CrossProduct(DefCamera.LookDirection, rotateAxis); newUpDirection.Normalize(); DefCamera.UpDirection = newUpDirection; }
private void HorizontalTransform(bool leftRight, double angleDeltaFactor) { Vector3D postion = new Vector3D(DefCamera.Position.X, DefCamera.Position.Y, DefCamera.Position.Z); Vector3D rotateAxis = DefCamera.UpDirection; RotateTransform3D rt3d = new RotateTransform3D(); AxisAngleRotation3D rotate = new AxisAngleRotation3D(rotateAxis, angleDeltaFactor * (leftRight ? -1 : 1)); rt3d.Rotation = rotate; Matrix3D matrix = rt3d.Value; Point3D newPostition = matrix.Transform(DefCamera.Position); DefCamera.Position = newPostition; DefCamera.LookDirection = new Vector3D(-newPostition.X, -newPostition.Y, -newPostition.Z); }
private void Viewport3D_MouseWheel(object sender, MouseWheelEventArgs e) { lookDirection.Normalize(); currentPosition = DefCamera.Position; lookDirection = DefCamera.LookDirection; System.Diagnostics.Debug.WriteLine(e.Delta.ToString()); lookDirection *= scaleFactor;
if (e.Delta == 90) { if ((currentPosition.X + lookDirection.X) * currentPosition.X > 0) { currentPosition += lookDirection; } } if (e.Delta == -90) { currentPosition -= lookDirection; } }
|
Это сообщение отредактировал(а) vinograd2008 - 11.10.2011, 19:48
|