我试图根据相机位置移动对象。这是我的顶点着色器
uniform mat4 osg_ViewMatrixInverse;
void main(){
vec4 position = gl_ProjectionMatrix * gl_ModelViewMatrix *gl_Vertex;
vec3 camPos=osg_ViewMatrixInverse[3].xyz;
if( camPos.z >1000.0 )
position.z = position.z+1.0;
if( camPos.z >5000.0 )
position.z = position.z+10.0;
if (camPos.z< 300.0 )
position.z = position.z+300.0;
gl_Position = position;
}
Run Code Online (Sandbox Code Playgroud)
但是,当摄像机的垂直位置小于300或大于1000时,该模型只是消失了,尽管在第二种情况下,它应该仅移动一个单位。我了解到着色器内部的坐标不同于世界坐标,这就是为什么我要乘以Projection和ModelView矩阵来获得世界坐标。在这一点上也许我错了?如果这是一个简单的问题,请原谅我,但我找不到答案。
更新:camPos转换为世界坐标,但位置未转换。可能与我使用osg_ViewMatrixInverse(由OpenSceneGraph传递)来获取相机位置以及内部gl_ProjectionMatrix和gl_ModelViewMatrix来获取顶点坐标有关。如何将位置转换为世界坐标?