查看: 1627|回复: 6

请教一个简单的关于投影变换的问题~

[复制链接]

该用户从未签到

发表于 2010-3-30 21:40:30 | 显示全部楼层 |阅读模式
书中涉及到场景图形管理的几处都出现了下面的代码,有点搞不清楚:


//根据分辨率来确定合适的投影来保证显示的图形不变形
double fovy, aspectRatio, zNear, zFar;
viewer->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);


一、fovy。。。这四个变量没有赋初值,却作为实参调用下面的函数,是自动根据分辨率由系统赋值的么,这个过程究竟是怎样的?这么调用之后就自动把模型投影到一个对称的视椎体了?

接下来:

double newAspectRatio = double(traits->width) / double(traits->height);
double aspectRatioChange = newAspectRatio / aspectRatio;
if (aspectRatioChange != 1.0)
{
  //设置投影矩阵
  viewer->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0);
}


二、计算了新的宽高比,如果和之前的aspectRatio不一样的话,设置投影矩阵。
那么函数osg::Matrix::scale中的各个形参又代表什么,找到函数的定义如下,什么意思,为何这样算?


inline Matrixd Matrixd::scale(value_type sx, value_type sy, value_type sz)
{
    Matrixd m;
    m.makeScale(sx,sy,sz);
    return m;
}


PS:不知OSG有没有类似MSDN的东西可以方便查阅呢?在网上查有关投影变换的内容,也都讲的不清楚。。。

虽然可能是很初级的问题,还是冒昧问下吧。谢谢了~~

该用户从未签到

发表于 2010-3-31 08:35:50 | 显示全部楼层
我不知道您说的是什么书,不过这里很明显都是有关OpenGL投影矩阵运算的问题

一、fovy。。。这四个变量没有赋初值,却作为实参调用下面的函数,是自动根据分辨率由系统赋值的么,这个过程究竟是怎样的?这么调用之后就自动把模型投影到一个对称的视椎体了?
注意这里的函数是getProjectionMatrixAsPerspective,也就是获取透视投影矩阵的参数并通过传址传递给参数变量

二、计算了新的宽高比,如果和之前的aspectRatio不一样的话,设置投影矩阵。
那么函数osg::Matrix::scale中的各个形参又代表什么
这个函数本身是缩放矩阵,这里将其与当前投影矩阵相乘。如果您熟悉OpenGL投影矩阵的公式的话,直接带入计算一下就可以知道其中的意义了。

OSG在短时间内不可能有非常详细的类似MSDN的东西出现,简单来说,因为我们有自己的事业要做,不可能有很多空闲来专职维护文档。况且您的问题似乎和OSG也没有什么直接关系

开发者所需要的从来都不是免费的午餐,OSG开放了所有的代码,阅读这些代码就是最好的文档

该用户从未签到

 楼主| 发表于 2010-3-31 08:53:06 | 显示全部楼层
谢谢array~

我还是再找找看关于OpenGL投影矩阵的部分吧。

该用户从未签到

发表于 2010-3-31 09:39:33 | 显示全部楼层
这段代码很清楚啊~~就是保证宽高比不变啊

该用户从未签到

发表于 2010-3-31 10:36:31 | 显示全部楼层
我想问一下,OSG里投影变换(正交和透视变换)默认矩阵是什么?如果投影变换那些参数没有默认值,那投影变换矩阵是不是就没有默认值?

OSG中的默认视点在哪个位置?

该用户从未签到

发表于 2010-3-31 11:05:35 | 显示全部楼层
是根据漫游器自动计算的

该用户从未签到

发表于 2010-3-31 14:42:42 | 显示全部楼层
哦,谢谢,我看看漫游器的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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