Tengo un vector 3D de entrada, junto con el cabeceo y la guiñada de la cámara. ¿Alguien puede describir o proporcionar un enlace a un recurso que me ayudará a comprender e implementar la transformación requerida y el mapeo de la matriz?¿Cómo se convierten las coordenadas del mundo a las coordenadas de la cámara?
Respuesta
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.
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
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
- 1. ¿Cómo convertir las coordenadas de la vista de imagen a las coordenadas del mapa de bits?
- 2. ¿Cómo traduzco correctamente las coordenadas de píxeles a las coordenadas del lienzo en Android?
- 3. Transformar las coordenadas del oyente del mouse en las coordenadas del gráfico
- 4. ¿Coordenadas de OpenGL para coincidir con las coordenadas de la pantalla?
- 5. Obtener las coordenadas del cursor en raphael
- 6. ¿Cómo puedo convertir coordenadas espaciales 3D a coordenadas espaciales 2D?
- 7. Cómo convertir las coordenadas de GPS a la localidad
- 8. MATLAB ¿Cómo convertir coordenadas de ejes a coordenadas de píxeles?
- 9. ¿Cómo obtener las coordenadas de ToolStripButton?
- 10. Cómo mostrar las coordenadas y usar ginput
- 11. Traducir las coordenadas del mouse a un plan 3D
- 12. ¿Cómo obtengo las coordenadas con el dibujo?
- 13. ¿Cómo debo traducir las coordenadas del espacio de la pantalla a las coordenadas del espacio de la imagen en un PictureBox de WinForms?
- 14. ¿Cómo hago las letras de las coordenadas x?
- 15. Colocar la imagen en las coordenadas Android
- 16. ¿Cómo convierto estas coordenadas a coordenadas legibles por Google Maps?
- 17. Obtener el país desde las coordenadas?
- 18. Cómo obtengo las coordenadas utilizables de la pantalla en Delphi
- 19. Obtención de las coordenadas de IART touchstart
- 20. ¿Cómo configurar Eclipse para mostrar las coordenadas del cursor?
- 21. Datos de profundidad de Microsoft Kinect SDK a coordenadas del mundo real
- 22. ¿Cómo funcionan las coordenadas de la pantalla de Android?
- 23. Recuperando las coordenadas del tipo de punto de MySQL
- 24. ¿Cómo convierto las coordenadas a latitud y longitud?
- 25. rectángulo Cómo conseguir la superposición de las coordenadas
- 26. ¿Cómo encontrar las coordenadas en la etiqueta de área?
- 27. PHP Ordenando las coordenadas más cercanas
- 28. ¿Cómo marco las coordenadas de latitud/longitud en la pantalla?
- 29. Leaflet.js - Ajustar las coordenadas geoJSON en la vista de mapa
- 30. ¿Cómo convertir coordenadas de objetos locales a coordenadas mundiales?