【发布时间】:2014-04-19 20:17:39
【问题描述】:
我正在尝试根据相机位置移动对象。这是我的顶点着色器
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;
}
但是当相机的垂直位置小于 300 或大于 1000 时,模型会简单地消失,尽管在第二种情况下它应该只移动一个单位。我读到着色器坐标与世界坐标不同,这就是为什么我乘以 Projection 和 ModelView 矩阵来获得世界坐标。也许我在这一点上错了?如果这是一个简单的问题,但我找不到答案,请见谅。
更新:camPos 被转换为世界坐标,但位置不是。也许这与我使用 osg_ViewMatrixInverse (由 OpenSceneGraph 传递)来获取相机位置和内部 gl_ProjectionMatrix 和 gl_ModelViewMatrix 来获取顶点坐标的事实有关?如何将位置转换为世界坐标?
【问题讨论】:
标签: c++ opengl glsl openscenegraph