查看: 4522|回复: 7

关于LineSegmentIntersector射线求交

[复制链接]

该用户从未签到

发表于 2010-6-7 11:42:24 | 显示全部楼层 |阅读模式
LineSegmentIntersector的构造函数,如是写到:

  1. LineSegmentIntersector::LineSegmentIntersector(CoordinateFrame cf, double x, double y)
  2. {
  3.    ...
  4.    case PROJECTION : _start.set(x,y,-1.0); _end.set(x,y,1.0); break;
  5.    ...
  6. }
复制代码


我认为,远近平面的点应该是
  1. _start.set(x,y,0.0); _end.set(x,y,1.0)
复制代码

为什么偏偏PROJECTION模式下需要初始化为

  1. _start.set(x,y,-1.0); _end.set(x,y,1.0);
复制代码

呢?

欢迎讨论

该用户从未签到

发表于 2010-6-8 08:13:57 | 显示全部楼层
哦,其实我之前的那个回复可能有些问题:
WINDOW和VIEW模式下才有远近平面的概念
这句话并不准确,因为远近平面的参数已经传入到投影矩阵中了,它们的作用正是把视锥体所在的范围规范到[-1,1]的区间内

该用户从未签到

发表于 2010-6-7 12:16:40 | 显示全部楼层
PROJECTION模式下所有的数据都被规范化到[-1,1]的区间内
WINDOW和VIEW模式下才有远近平面的概念,因为这个时候会假设数据是源自2D屏幕的

该用户从未签到

 楼主| 发表于 2010-6-7 14:44:40 | 显示全部楼层
我的理解与array有所不同,呵呵~
我认为“远近平面”的概念在任何时候都有的,它属于视景体的范畴。
在摄像机坐标系下的场景对象坐标,经过投影矩阵变换,得到投影坐标。其中,在透视(正交)投影模式下,视景体的近平面经过投影矩阵得到的坐标一律是(x,y,0),而远平面上的点坐标为(x,y,1)。
射线求交(暂且说使用PROJECTION模式),就是鼠标点击的二维点(x,y)被认为是近平面点(x,y,0),再找到相应远平面(x,y,1),并经过观察矩阵、投影矩阵相乘的逆矩阵变换,得到世界坐标系下的射线,与场景对象进行几何求交运算。
不知我理解的正确否?

该用户从未签到

发表于 2010-6-7 16:55:38 | 显示全部楼层
我觉得您的理解有误。

使用投影矩阵将观察坐标系(VCS)中的信息转换到规格化坐标系(NDCS)中后,得到的坐标总是在(-1,-1,-1)到(1,1,1)的范围内。而远近平面的设定是在视口变换中完成的!这相当于以下的变换过程:
Xdcs = 0.5 * (Xndcs + 1) * width + originx
Ydcs = 0.5 * (Yndcs + 1) * height + originy
Zdcs = 0.5 * (Zndcs + 1)

其中orginx,originy,width,height为窗口的偏移和尺寸。很容易看出,此时Z坐标方被限制于(0,1)的范围内

《OSG三维渲染引擎设计与实践》的第七章对此有详细的阐述

该用户从未签到

 楼主| 发表于 2010-6-7 17:26:50 | 显示全部楼层
多谢,哈哈~
《OSG三维渲染引擎设计与实践》很专业啊!

该用户从未签到

 楼主| 发表于 2010-6-7 17:37:00 | 显示全部楼层
但是我还有一个问题不明白,想向array求教
既然远近平面的设定是在视口变换中完成,那么为什么远近平面的参数要在设置投影矩阵时传入呢(setProjectionMatrix)?而不是在setViewport()中呢?

该用户从未签到

 楼主| 发表于 2010-6-8 10:25:46 | 显示全部楼层
正是。

经过projectionMatrix矩阵变换后,所有坐标都量化在[-1,1]区间。所以,近平面的点坐标为(x,y,-1), 远平面的点坐标为(x,y,1),使用这两点这样就可以确定一条求交射线了。

感谢array的耐心回答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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