Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вращать камеру по оси Y, Вращение камеры по оси Y 
:(
    Опции темы
vinograd2008
Дата 11.10.2011, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.12.2008

Репутация: нет
Всего: нет



Как вращать камеру с помощью мыши по оси 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.