2009-03-29 36 views

Respuesta

12

La matriz de transformación de mundo a cámara es la inversa de la matriz de cámara a mundo. La matriz de cámara a mundo es la combinación de una traslación a la posición de la cámara y una rotación a la orientación de la cámara. Por lo tanto, si M es la matriz de rotación de 3x3 correspondiente al de la cámara de orientación y t es la posición de la cámara, entonces la matriz de la cámara al mundo 4x4 es:

 
M00 M01 M02 tx 
M10 M11 M12 ty 
M20 M21 M22 tz 
0 0 0 1 

Tenga en cuenta que he asumido que los vectores son vectores de columnas que se multiplican a la derecha para realizar transformaciones. Si usa la convención opuesta, asegúrese de transponer la matriz.

Para encontrar M, puede utilizar una de las fórmulas que aparecen en Wikipedia, dependiendo de su convenio determinado para balance, cabeceo, y guiñada. Tenga en cuenta que esas fórmulas usan la convención de que los vectores son vectores de filas que se multiplican a la izquierda.

En lugar de calcular la matriz de cámara-a-mundo e invertirla, una alternativa más eficiente (y numéricamente estable) es calcular directamente la matriz de cámara a cámara. Para hacerlo, simplemente invierta la posición de la cámara (anulando las 3 coordenadas) y su orientación (anulando los ángulos de balanceo, inclinación y guiñada, y ajustándolos para que estén en sus rangos adecuados), y luego calcule la matriz usando el mismo algoritmo.

-5

Lo que está describiendo se llama 'Proyección de perspectiva' y hay una gran cantidad de recursos en la web que explican las matemáticas de la matriz y proporcionan el código necesario para hacerlo. Se podría comenzar con el wikipedia page

7

Si tenemos una estructura como esta para describir una matriz 4x4:

class Matrix4x4 
{ 
public: 
    union 
    { 
     struct 
     { 
      Type Xx, Xy, Xz, Xw; 
      Type Yx, Yy, Yz, Yw; 
      Type Zx, Zy, Zz, Zw; 
      Type Wx, Wy, Wz, Ww; 
     }; 

     struct 
     { 
      Vector3<Type> Right; 
      Type XW; 
      Vector3<Type> Up; 
      Type YW; 
      Vector3<Type> Look; 
      Type ZW; 
      Vector3<Type> Pos; 
      Type WW; 
     }; 

     Type asDoubleArray[4][4]; 
     Type asArray[16]; 
    }; 
}; 

Si todo lo que tiene es ángulos de Euler, que es un ángulo que representan la guiñada, cabeceo y rollo y un punto en el espacio 3D para la posición, puede calcular los vectores Derecho, Arriba y Apariencia. Tenga en cuenta que Right, Up y Look son solo los vectores X, Y, Z, pero como se trata de una cámara, me resulta más fácil nombrarla así. La forma más sencilla de aplicar sus itinerarios a la matriz de la cámara es construir una serie de matrices de rotación y multiplicar la matriz de la cámara por cada matriz de rotación.

Una buena referencia para lo que está aquí: http://www.euclideanspace.com

Una vez que haya aplicado todas las rotaciones es necesario, puede ajustar la Pos vector para la posición de la cámara en el espacio mundial.

Por último, antes de aplicar la transformación de la cámara, debe tomar la cámara inversa de su matriz. Esto es lo que vas a multiplicar tu matriz de vista de modelo antes de comenzar a dibujar polígonos. Para la clase matriz anterior, la inversa se calcula así:

template <typename Type> 
Matrix4x4<Type> Matrix4x4<Type>::OrthoNormalInverse(void) 
{ 
    Matrix4x4<Type> OrthInv; 
    OrthInv = Transpose(); 
    OrthInv.Xw = 0; 
    OrthInv.Yw = 0; 
    OrthInv.Zw = 0; 
    OrthInv.Wx = -(Right*Pos); 
    OrthInv.Wy = -(Up*Pos); 
    OrthInv.Wz = -(Look*Pos); 
    return OrthInv; 
} 

Así que finalmente, con todo nuestro constuction matriz fuera del camino, que estaría haciendo algo como esto:

Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation; 
Vector4<float> cameraPosition; 

cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation; 

Matrix4x4<float> invCameraMat; 

invCameraMat = cameraMatrix.OrthoNormalInverse(); 

glMultMatrixf(invCameraMat.asArray); 

Esperanza esta ayuda

Cuestiones relacionadas