查看: 4235|回复: 5

请问在GLSL中怎样获得当前视点所在的世界坐标?

[复制链接]

该用户从未签到

发表于 2009-4-18 21:57:45 | 显示全部楼层 |阅读模式
如题,我个人觉得是不是能从内置的gl_ModelViewMatrix这个矩阵中求出来当前所在视点的世界坐标?还是说需要从OSG中通过callback的方法来实时地更新摄像机的坐标,再传给Shader?本人刚刚接触GLSL,麻烦各位指导一下~谢谢~~!

另外,我看到官方发布的GLSL的参考中有一些关于OSG的预置的Uniform的变量,有一个osg_ViewMatrix,不知能否直接引用呢?请指教~

该用户从未签到

发表于 2009-4-18 23:03:30 | 显示全部楼层
一般来说要确定的是各个顶点在视点参考系下的坐标,没必要单独把视点作为一个uniform变量。
ecPosition  = gl_ModelViewMatrix * gl_Vertex;

可以直接引用,不过要在Shader中先定义好它们的类型,以免编译出错;而OSG会负责每帧自动更新。
所有可用的GLSL中的OSG一致变量如下:
uniform int osg_FrameNumber:当前OSG程序运行的帧数;
uniform float osg_FrameTime:当前OSG程序的运行总时间;
uniform float osg_DeltaFrameTime:当前OSG程序运行每帧的间隔时间;
uniform mat4 osg_ViewMatrix:当前OSG摄像机的观察矩阵;
uniform mat4 osg_ViewMatrixInverse:当前OSG摄像机观察矩阵的逆矩阵

该用户从未签到

 楼主| 发表于 2009-4-18 23:25:40 | 显示全部楼层
原帖由 array 于 2009-4-18 23:03 发表
一般来说要确定的是各个顶点在视点参考系下的坐标,没必要单独把视点作为一个uniform变量。
ecPosition  = gl_ModelViewMatrix * gl_Vertex;

可以直接引用,不过要在Shader中先定义好它们的类型,以免编译出错; ...


谢谢array老师了~

该用户从未签到

 楼主| 发表于 2009-4-19 01:21:38 | 显示全部楼层
恩。。。刚才想了想,本人感觉还是需要在Shader里面得到当前视点的世界坐标。。。关键是我现在想求一下在世界坐标系中某点与视点连线这个矢量的水平、竖直方向上的方位角,我个人感觉在视点坐标系下应该求不出来吧~再次请教各位老师~

该用户从未签到

 楼主| 发表于 2009-4-19 03:20:32 | 显示全部楼层
恩。。刚才在OpenGL官方的Wiki中看到这样的解决方法:
The "camera" or viewpoint is at (0., 0., 0.) in eye space. When you turn this into a vector [0 0 0 1] and multiply it by the inverse of the ModelView matrix, the resulting vector is the object-space location of the camera

但是我还是在原理上不太明白,这个模型视点矩阵里面到底是怎么计算出来的?为什么左乘[0 0 0 1]这个向量就能得出摄像机的世界坐标?谢谢!

该用户从未签到

发表于 2009-4-19 10:08:40 | 显示全部楼层
您没有完全理解那段话的意思:
视点在人眼参考系中的坐标为(0,0,0),为了能够让它参与4x4矩阵运算,我们将其定义为(0,0,0,1),并与模型视点矩阵的逆矩阵相乘,得到的结果就是视点在世界参考系中的坐标。

对于OSG而言,人眼参考系中某一点 v 在世界参考系的坐标 v' 是:
v' = v * inverse(ViewMatrix)

对于GLSL,则可以使用osg_ViewMatrixInverse
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表