Не был уверен, стоит ли размещать это здесь или в GameDev, но поскольку это не игра, я решил спросить здесь.Перевод и ротация OpenGL ES
Я пытаюсь использовать OpenGL ES 2 на Android, и сейчас у меня простая настройка. Я загружаю объект из файла .obj, отображаю его на экране, затем могу поворачивать камеру вокруг объекта, используя сенсорные элементы управления. Мой viewMatrix настроен так:
double[] dist = {DISTANCE * Math.sin(yawAngle) * Math.abs(Math.cos(pitchRollAngle)),
DISTANCE * Math.sin(pitchRollAngle),
DISTANCE * Math.cos(yawAngle) * Math.abs(Math.cos(pitchRollAngle))};
Matrix.setLookAtM(viewMatrix, 0, (float) dist[0], (float) dist[1], (float) dist[2], 0f, 0f, 0f, 0f, 1.0f, 0.0f);
И моя проекция матрица просто так:
Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1, 3, 100);
Я поставил рыскания/угол pitchRoll от событий прикосновения. Теперь это работает нормально, когда объект находится в центре экрана, я могу вращаться, как я должен. Но если я пытаюсь переместить объект, скажем, 1 единицу по оси X, как это:
float[] modelMatrix = new float[16];
Matrix.setIdentityM(modelMatrix, 0);
Matrix.translateM(modelMatrix, 0, 1, 0, 0);
И затем умножьте все из них, как это:
float[] MVPMatrix = new float[16];
Matrix.multiplyMM(MVPMatrix, 0, modelMatrix, 0, viewMatrix, 0);
Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, MVPMatrix, 0);
объект вращается вокруг на своем месте , но я хочу, чтобы он вращался вокруг точки (0, 0, 0)
. Что я делаю не так?
Хорошее объяснение @Matic, кажется логичным сейчас, когда я думаю об этом! Меня беспокоит одно, но сейчас все хорошо и хорошо, так как моя камера вращается вокруг объекта. Но что произойдет, если я захочу переместить камеру с помощью метода lookAt? Тогда матрица вида будет иметь в себе как поворот, так и перевод? Как бы я правильно его умножить? Или я должен создать другую матрицу с переводом для камеры и работать оттуда, чтобы матрица вида только когда-либо содержала поворот? Или я должен избегать метода lookAt и просто делать все вручную? – Squeazer
Я считаю, что лучше всего отслеживать 3 матрицы, один из которых содержит проекцию (усеченный или такой), один для камеры (посмотрите) и модельную матрицу. Затем просто умножьте эти 3 каждого кадра. Проецирование обычно является постоянным, за исключением случаев, когда изменяется окно просмотра, камера меняется обычно один раз за кадр max и матрица модели изменяется для каждой модели. LookAt очень полезно, вы должны использовать его, если это возможно. Что касается вашего вращающегося объекта, лучше всего, чтобы сам объект удерживал местоположение и вращение и восстанавливал матрицу, используя эти 2 значения. Поэтому в вашем случае вы будете менять место жительства. –