2009-11-19 4 views
4

Моя проблема заключается в следующем:OPENGL и ориентации от видовой матрицы

Я вложен объект в моей OPENGL сцене, и я знаю только их взаимное расположение и ориентацию.

Как получить абсолютное положение и ориентацию внутреннего объекта? Я собираюсь вычислить матрицу модели внутреннего объекта, и после этого у меня есть текущая матрица, но как я могу преобразовать ее в положение и ориентацию? Другими словами, для двух векторов с плавающей точкой, поэтому я могу позвонить по следующему коду:

glTranslatef(position.x,position.y,position.z); 

glRotatef(alignment.x,1.0f,0.0f,0.0f); 
glRotatef(alignment.y,0.0f,1.0f,0.0f); 
glRotatef(alignment.z,0.0f,0.0f,1.0f); 

Заранее благодарим за внимание!

+1

Извините, слишком устал, чтобы получить полный ответ на данный момент. Переводите и вращайте на самом деле просто мультипликацию с «специальными» матрицами. (Легко для google: «матрица перевода вращения»). Просто делайте умножения и следите за правильным порядком. Затем выполните умножение матрицы-вектора, и все готово. (Если это не ответит, когда я проснусь завтра, у меня будет второй взгляд ...) – Andreas

ответ

5

Если у вас есть видовая матрица объекта можно извлечь позицию следующего кода:

// ... Some rotations/translations has been applied 
GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix); 
const float position_x = matrix[12]; 
const float position_y = matrix[13]; 
const float position_z = matrix[14]; 

Вращения является немного более сложным, посмотрите: euler angles. Матрица вращения мы хотим транспонированная ZYX-один =>

//c1 = cos(alignment_x) 
//c2 = cos(alignment_y) 
//c3 = cos(alignment_z) 
//s1 = sin(alignment_x) 
//s2 = sin(alignment_y) 
//s3 = sin(alignment_z) 
//matrix[0] = c1 * c2 
//matrix[1] = -c2 * s1 
//matrix[2] = s2 
//matrix[4] = c3 * s1 + c1 * s2 * s3 
//matrix[5] = c1 * c3 - s1 * s2 * s3 
//matrix[6] = -c2 * s3 
//matrix[8] = s1 * s3 - c1 * c3 * s2 
//matrix[9] = c3 * s1 * s2 + c1 * s3 
//matrix[10] = c2 * c3 

извлекая фактические углы от этого довольно грязно, потому что есть несколько особенностей, если мы будем игнорировать этого мы получим:

// Assumes c2 != 0, you'll need more code to handle the special cases 
if (matrix[0] != 0.0f || matrix[1] != 0.0f) { 
    const float alignment_x = atanf(-matrix[1], matrix[0]); 
    float c2; 
    if (0 != cosf(alignment_x)) { 
     c2 = matrix(0)/cosf(alignment_x); 
    } else { 
     c2 = matrix(1)/-sinf(alignment_x); 
    } 
    const float alignment_y = atanf(matrix[2], c2); 
    const float alignment_z = atanf(-matrix[6], matrix[10]); 
} else { 
    alignment_y = atanf(matrix[2], 0); 
    //Too tired to deduce alignment_x and alignment_z, someone else? 
} 

Все приведенные выше коды предполагают, что вы используете только повороты/переводы и не масштабируете или не перекосы.

Позвольте мне закончить, говоря, углы Euler злы, если вы были, я бы искать альтернативные решения любой проблемы это вы пытаетесь решить;)

/A.B.

+0

привет, я был бы очень благодарен, если бы вы могли предоставить остальную часть кода, потому что я думаю, что это именно то, что мне нужно в данный момент. У меня тоже есть модельная матрица и вы хотите извлечь 3 угла, чтобы сделать что-то вроде glRotatef (x, 1,0,0); glRotatef (y, 0,1,0); glRotatef (z, 0,0,1); самостоятельно. в моем случае я определенно знаю, что нет никаких переводов с матрицей, но я думаю, что это не относится к вычислению вращения (?) будут результирующие значения в диапазоне значений от 0 до 360 или - PI для PI или существует такое? –

+0

, в каком виде это здесь: http://www.songho.ca/opengl/gl_anglestoaxes.html#anglestoaxes, связанный с вашим кодом? вы просто извлекаете углы для всех возможных матриц? –

+0

Да и нет, на странице Песни Хо вы можете рассчитать матрицу вращения для одной из 6 возможных комбинаций углов Эйлера. То, о чем вы просите, является обратным: как вычислить определенный набор углов Эйлера с учетом матрицы поворота? Как я уже сказал в своем первоначальном ответе, это довольно сложно сделать, поскольку есть отдельные варианты, которые делают расчет не очень определенным. Код, который я поставил выше, даст все углы в радианах. –

 Смежные вопросы

  • Нет связанных вопросов^_^