Red de conocimiento informático - Material del sitio web - Cómo obtener las coordenadas mundiales de un objeto usando un sombreador

Cómo obtener las coordenadas mundiales de un objeto usando un sombreador

De hecho, la canalización de transformación OpenGL multiplica directamente las coordenadas del objeto gl_Vertex con gl_ModelViewMatrix para obtener las coordenadas del ojo. Si gl_ModelViewMatirx se divide en gl_ModelMatrix y gl_ViewMatrix, entonces el problema está resuelto. Pero en realidad no fue proporcionado. Para decirlo sin rodeos, OpenGL en realidad no tiene un sistema de coordenadas mundial, el sistema de coordenadas mundial es un concepto de aplicación. De hecho, puede pensar que la cámara de OpenGL es fija y su sistema de coordenadas es el sistema de coordenadas del ojo. Mover la cámara y cambiar la posición del objeto es una transformación inversa. Para los observadores, no tienen forma de saber si la cámara se está moviendo o si el objeto se está moviendo (piense en la magia de la Estatua de la Libertad de David, risas).

En este punto, la transformación final se ve así:

eyePos=viewMatrix * modelMatrix * modelVertex

En OpenGL, viewMatrix y modelMatrix están fusionados, porque OpenGL no tiene parámetros de cámara. , por lo que OpenGL no sabe qué es viewMatrix. viewMatrix está definido por el usuario, por lo que si puede obtener viewMatrix y su matriz inversa, puede obtener worldPos:

worldPos=viewMatrixInv * viewMatrix * modelMatrix * modelVertex<

OpenGL tradicional los programas deben calcular viewMatrixInv usted mismo, pero afortunadamente OSG Camera proporciona el método getViewMatrixInverse (), a través del cual podemos obtener fácilmente viewMatrixInv, luego pasarlo al sombreador de vértices (uniforme es suficiente) y calcularlo directamente.

Recuerda que necesitas actualizar este viewMatrixInv en cada fotograma, solo un updateCallBack.

Bien, mire algunas imágenes. Creé dos cuadros en 3DSMAX para facilitar la visualización, limité los valores de los vértices del modelo a 0-1 y luego los exporté usando osgExp. También desmarque Aplanar transformación estática, que no convierte los puntos fijos del modelo en vértices del sistema de coordenadas mundiales.

En el código fuente, puede cambiar el valor de gl_FragColor= para mostrar el valor del sistema de coordenadas correspondiente.

El resultado final del sistema de coordenadas mundial se mostrará como una transformación de color continua.