Сохранение оригинальной системы координат при вращении с openGL - PullRequest
1 голос
/ 05 декабря 2010

Я реализую arcball с openGL (на cpp).Скажем, у меня есть объект в центре системы осей, и я хочу несколько раз повернуть его в соответствии с исходными (мировыми) осями.Но после первого поворота оси меняются, и все дальнейшие повороты идут не так.Есть идеи?Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

Предоставьте объекту его собственные оси ориентации (матрица вида модели), а затем умножьте это на матрицы вращения. Проверьте Википедию для получения информации о том, как построить матрицы вращения.

1 голос
/ 13 января 2012

Добавьте xAngle и yAngle к текущей матрице.

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);
1 голос
/ 05 декабря 2010

Я сам должен был сделать то же самое в приложении OpenGL ES, которое я описываю в статье об этом здесь .Исходный грубый подход считал матрицу представления текущей модели и манипулировал ею для получения желаемого эффекта:

GLfloat currentModelViewMatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix);   
glRotatef(xRotation, currentModelViewMatrix[1], currentModelViewMatrix[5], currentModelViewMatrix[9]);
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix);
glRotatef(yRotation, currentModelViewMatrix[0], currentModelViewMatrix[4], currentModelViewMatrix[8]);

Это будет работать, но имейте в виду, что два вызова glGetFloatv() замедляют рендеринг, останавливая конвейер,С тех пор я заменил этот код вычислениями, которые я выполняю на собственной внутренней копии матрицы представления модели, а затем просто пишу матрицу представления модели с внутренним управлением после каждого поворота.Это устраняет необходимость выполнять дорогостоящие операции чтения матрицы.

...