Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как вращать камеру по оси Y


Автор: vinograd2008 11.10.2011, 19:46
Как вращать камеру с помощью мыши по оси 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;
        }
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)