Esate.ru

Камера

И снова я) Создал новый класс, камера, вроде бы все окей, работаю через gluLookAt, крутит, вертит, перемещается, но не могу додумать как сделать стрэйф (движение камеры влево или вправо)

Объявляю:
/*http://esate.ru, OniKy*/


CCamera cam = new CCamera();


В инициализации:
/*http://esate.ru, OniKy*/


cam.Position_Camera(0, 5, -10, 0, 0, 0, 0, 1, 0);


В таймере:
/*http://esate.ru, OniKy*/


        Glu.gluLookAt(cam.mPos.x, cam.mPos.y, cam.mPos.z,
               cam.mView.x, cam.mView.y, cam.mView.z,
               cam.mUp.x, cam.mUp.y, cam.mUp.z);

        Gl.glPushMatrix();
        //модели
        Gl.glPopMatrix();


Считываю клаву:
/*http://esate.ru, OniKy*/


      private void AnT_KeyDown(object sender, KeyEventArgs e)
      {
        if (e.KeyCode == Keys.W)
           cam.Move_Camera(0.03f);

        if (e.KeyCode == Keys.S)
           cam.Move_Camera(-0.03f);

        if (e.KeyCode == Keys.A)
           cam.Rotate_Position(0.03f, 0, 1, 0);

        if (e.KeyCode == Keys.D)
           cam.Rotate_Position(-0.03f, 0, 1, 0);

        label2.Text = e.KeyCode.ToString();
      }


Вот сам класс:
/*http://esate.ru, OniKy*/


      public struct Vector3D
      {
        public float x, y, z;
      };

      class CCamera
      {
        public Vector3D mPos;
        public Vector3D mView;
        public Vector3D mUp;

        static float currentRotX;
        static float lastRotX;

        public void Rotate_Position(float angle, float x, float y, float z)
        {
           mPos.x = mPos.x - mView.x;
           mPos.y = mPos.y - mView.y;
           mPos.z = mPos.z - mView.z;

           Vector3D vVector = mPos;
           Vector3D AVector;

           float SinA = (float)Math.Sin(angle);
           float CosA = (float)Math.Cos(angle);

           // Найдем новую позицию X для вращаемой точки 
           AVector.x = (CosA + (1 - CosA) * x * x) * vVector.x;
           AVector.x += ((1 - CosA) * x * y - z * SinA) * vVector.y;
           AVector.x += ((1 - CosA) * x * z + y * SinA) * vVector.z;

           // Найдем позицию Y 
           AVector.y = ((1 - CosA) * x * y + z * SinA) * vVector.x;
           AVector.y += (CosA + (1 - CosA) * y * y) * vVector.y;
           AVector.y += ((1 - CosA) * y * z - x * SinA) * vVector.z;

           // И позицию Z 
           AVector.z = ((1 - CosA) * x * z - y * SinA) * vVector.x;
           AVector.z += ((1 - CosA) * y * z + x * SinA) * vVector.y;
           AVector.z += (CosA + (1 - CosA) * z * z) * vVector.z;

           mPos.x = mView.x + AVector.x;
           mPos.y = mView.y + AVector.y;
           mPos.z = mView.z + AVector.z;
        }

        public void Move_Camera(float speed)
        {
           Vector3D mmView;
           mmView.x = mView.x - mPos.x;
           mmView.y = mView.y - mPos.y;
           mmView.z = mView.z - mPos.z;

           Vector3D vVector = mmView;  // Get the view vector 

           // Двигаем камеру со скоростью speed
           mPos.x = mPos.x + vVector.x * speed;
           mPos.z = mPos.z + vVector.z * speed;
           mView.x = mView.x + vVector.x * speed;
           mView.z = mView.z + vVector.z * speed;
        }

        public void Move()
        {
           mPos.x = mPos.x + 1;
           mView.x = mView.x + 1;
        }

        public void Rotate_View(float speed)
        {
           Vector3D mmView;
           mmView.x = mView.x - mPos.x;
           mmView.y = mView.y - mPos.y;
           mmView.z = mView.z - mPos.z;

           Vector3D vVector = mmView;  // Получаем вектор View

           mView.z = (float)(mPos.z + Math.Sin(speed) * vVector.x + Math.Cos(speed) * vVector.z);
           mView.x = (float)(mPos.x + Math.Cos(speed) * vVector.x - Math.Sin(speed) * vVector.z);
        }

        public void Position_Camera(float pos_x, float pos_y, float pos_z,
              float view_x, float view_y, float view_z,
              float up_x, float up_y, float up_z)
        {
           mPos.x = pos_x;
           mPos.y = pos_y;
           mPos.z = pos_z;
           mView.x = view_x;
           mView.y = view_y;
           mView.z = view_z;
           mUp.x = up_x;
           mUp.y = up_y;
           mUp.z = up_z;
        }
      };

А как стрейф сделать не пойму( может кто знает?

0       553        09.01.2011        4
0  
11.01.2011 00:00:00
тоже самое что и подвинуть камеру вперед, только сначала повернув ее влево или вправо на 90 градусов, нет? :) (А после передвижения на 90 градусов обратно)
Ссылка 0  
0  
11.01.2011 00:00:00
Вернее обратно не надо, мы так (+90) только вычисляем ее новые координаты. (не крутим)
Родитель Ссылка 0  
0  
12.01.2011 00:00:00
все равное не могу понять как сделать ( может пример покажешь?) плиз)
Родитель Ссылка 0  
0  
13.01.2011 00:00:00
Смотри, если выполнить Move_Camera, то она передвинется вперед (в соответствии с направлением вектора).

Нужно выполнить Move_Camera, только направление вектора изменить (считать что он повернут на 90 или 270 градусов, тогда новые координаты будут такими, как если бы мы двигались в бок (лево или право).
Родитель Ссылка 0  

Блоги Esate.ru

Регистрация

Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 

Восстановление пароля

Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш E-mail. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
 
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
 

Авторизация

Пожалуйста, авторизуйтесь, для входа на сайт с помощью соц. сети:
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.

или с помощью аккаунта на сайте:

Логин
Пароль