Поворот камеры от первого лица в 3D - PullRequest
2 голосов
/ 06 января 2011

Я написал класс камеры от первого лица для Android.

Класс действительно прост, объект камеры имеет три оси X, y и Z

, и есть функции для созданияматрицу ModelView (то есть CalculateModelViewMatrix ()), поверните камеру вдоль оси X и Y и переведите камеру вдоль оси Z.

Я думаю, что мой расчет ModelViewMatrix является правильным, и я также могу перевести камерувдоль оси Z.

Вращение по оси X, кажется, работает, но по оси Y это дает странные результаты.Еще одна проблема с вращением, по-видимому, заключается в том, что вместо вращения камеры моя 3d-модель начинает вращаться вместо ее оси.

Я написал другую реализацию, основанную на взгляде на точку и использующую функцию GLU.gluLookAt () ES из openGL для получения матрицы ModelView, но, похоже, она тоже страдает от тех же проблем.

РЕДАКТИРОВАТЬ

Прежде всего, спасибо за ваш ответ.

На самом деле я сделал вторую реализацию класса Camera, на этот раз с использованием функций вращения, предусмотренных в Android.opengl.Matrix класс, как вы сказали.Я привел приведенный ниже код, который намного проще.

К моему удивлению, результаты "Точно" одинаковы.Это означает, что мои функции поворота и функции поворота Android дают одинаковые результаты.

Я провел простой тест и посмотрел свои данные.Я просто повернул точку LookAt на 1 градус за один раз вокруг оси Y и посмотрел на координаты.Кажется, что моя точка LookAt отстает от точного угла поворота, например, на 20 градусов она повернулась только на 10-12 градусов.И после 45 градусов он начинает задний ход

1 Ответ

2 голосов
/ 09 января 2011

Существует класс android.opengl.Matrix, который представляет собой набор статических методов, которые делают все, что вам нужно, на поплавке [16], который вы передаете. Я настоятельно рекомендую вам использовать эти функции вместо того, чтобы использовать свои собственные.Вы, вероятно, захотите либо setLookAtM с точкой обзора, рассчитанной по углам вашей камеры (используя sin, потому что вы делаете это в своем коде - я предполагаю, что вы знаете, как это сделать.)

- отредактируйте в ответна новый ответ -

(кстати, вы, вероятно, должны были отредактировать свой первоначальный вопрос - ваш ответ как другой вопрос меня немного смутил)

Хорошо, вот один из способов сделатьЭто.Это не скомпилировано и не проверено.Я решил вместо этого построить матрицу вручную;возможно, это даст немного больше информации о том, что происходит ...

class TomCamera {
     // These are our inputs - eye position, and the orientation of the camera.
     public float mEyeX, mEyeY, mEyeZ; // position
     public float mYaw, mPitch, mRoll; // euler angles.

     // this is the outputted matrix to pass to OpenGL.
     public float mCameraMatrix[] = new float [16];

     // convert inputs to outputs.
     public void createMatrix() {
         // create a camera matrix (YXZ order is pretty standard)
         // you may want to negate some of these constant 1s to match expectations.
         Matrix.setRotateM(mCameraMatrix, 0, mYaw, 0, 1, 0);
         Matrix.rotateM(mCameraMatrix, 0, mPitch, 1, 0, 0);
         Matrix.rotateM(mCameraMatrix, 0, mRoll, 0, 0, 1);
         Matrix.translateM(mCameraMatrix, 0, -mEyeX, -mEyeY, -mEyeZ);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...