查看: 2776|回复: 5

绘制到纹理时纹理的大小和子场景的大小问题

[复制链接]

该用户从未签到

发表于 2008-9-22 22:52:02 | 显示全部楼层 |阅读模式
目的:将一个矩形绘到一个1*1的2D纹理上,再把这个纹理贴到另一平面个上.
问题:当矩形的大小<视平面的1.415倍时,得不到正确的结果.
请问产生这个问题的原因是什么?
有什么办法让一个和视平面一样大小的矩形正确绘到一个1*1的2D纹理上呢?(这样投影纹理的坐标比较好计算)
谢谢!

附件里是源代码

PreRender.rar

6.33 KB, 下载次数: 132, 下载积分: 威望 1

该用户从未签到

发表于 2008-9-23 08:59:50 | 显示全部楼层
我想问题在于setViewMatrixAsLookAt和setProjectionMatrix的设置上,
做一些变化以后就会有效果,例如调整LookAt的向量,换而使用透视矩阵,四方形顶点坐标设置在XZ平面等。

您需要仔细研究一下投影和观察矩阵与您的要做烘焙的场景的对应关系,我没有仔细考虑其中的规律。

该用户从未签到

 楼主| 发表于 2008-9-24 09:09:04 | 显示全部楼层
经过测试发现改用透视投影是可以的.

一个最简单的程序
  1. osgViewer::Viewer viewer;       
  2. viewer.setSceneData( osgDB::readNodeFile("cow.osg"));

  3. viewer.getCamera()->setProjectionMatrixAsPerspective( 90, 1, 10, 100. );  //OK
  4. //viewer.getCamera()->setProjectionMatrixAsFrustum(-10, 10, -10, 10, 10, 100);  //OK
  5. //viewer.getCamera()->setProjectionMatrixAsOrtho(-10,10,-10,10,-10,10);  //not OK
  6. //viewer.getCamera()->setProjectionMatrixAsOrtho2D(-10, 10, -10, 10);  //not OK

  7. viewer.getCamera()->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  8. viewer.getCamera()->setViewMatrixAsLookAt(osg::Vec3(0.0f,10.0f,0.0f), osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f));

  9. //viewer.run();
  10. while (!viewer.done())
  11. {
  12.         viewer.frame();
  13. }
复制代码
用透视投影可以正确显示,用正交投影显示不出任何东西.请问原因是什么?怎么解决?
谢谢!

附件里是测试程序

Viewer.rar

5.39 KB, 下载次数: 112, 下载积分: 威望 1

该用户从未签到

发表于 2008-9-24 10:22:50 | 显示全部楼层
不必怀疑OSG的正交投影实现有错误~~

由于Viewer在初始化时(也就是realize,程序中不写realize的话就会在第一帧自动执行)会设置一个缺省的ViewMatrix,所以设置主摄像机为HUD摄像机的工作就需要在这之后进行。如果是新增一个HUD摄像机就没有这个问题了(参考osghud)
  1. viewer.setSceneData( osgDB::readNodeFile("cow.osg"));
  2. viewer.realize();
  3. viewer.getCamera()->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  4. viewer.getCamera()->setViewMatrixAsLookAt(osg::Vec3(0.0f,10.0f,0.0f), osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f));
  5. viewer.getCamera()->setProjectionMatrixAsOrtho2D( -10,10,-10,10 );
  6. while ( ... ) { ... }
复制代码

[ 本帖最后由 array 于 2008-9-24 10:27 编辑 ]

该用户从未签到

 楼主| 发表于 2008-9-24 10:35:06 | 显示全部楼层
多谢!我忘记了realize这回事了.

该用户从未签到

发表于 2008-10-2 22:39:29 | 显示全部楼层
viewer的realize和某些类的init一样,令人迷惑~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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