查看: 1271|回复: 9

渲染到纹理的问题

[复制链接]

该用户从未签到

发表于 2010-7-6 16:13:45 | 显示全部楼层 |阅读模式
通过RTT实现汽车后视镜, 用跟踪节点实现车的运动,可是车运动的时候RTT的内容不能实时变化的现实在后视镜上。那位大哥知道为什么吗。敬请赐教。。。。
我觉得好像是FBO里的场景不实时变化啊。。。。

该用户从未签到

 楼主| 发表于 2010-7-6 16:14:55 | 显示全部楼层
初始时,后视镜显示的是正确的。。。。

该用户从未签到

发表于 2010-7-6 16:31:34 | 显示全部楼层
应该是RTT相机参数没有实时更新,因为初始的时候,显示是正常的

该用户从未签到

发表于 2010-7-6 22:17:58 | 显示全部楼层
您需要提供更多的信息以帮助排查问题

该用户从未签到

 楼主| 发表于 2010-7-7 10:18:53 | 显示全部楼层
//主要处理代码如下
osg::Node* Scenenode =osgDB::readNodeFile("ceep.ive");
osg::Node* skyNode = osgDB::readNodeFile("sky.ive");
osg::Node* carNode  =osgDB::readNodeFile("car.IVE");
  
osg:ositionAttitudeTransform* pat = new osg::PositionAttitudeTransform;//定义一个节点
pat->setPosition(osg::Vec3(0,-10.0,3.5));
carNode->asGroup()->addChild(pat);
transformAccumulator* tankWorldCoords = new transformAccumulator();
tankWorldCoords->attachToGroup(pat);//绑定到该节点
     followNodeMatrixManipulator* followcar = new followNodeMatrixManipulator(tankWorldCoords);//跟随相机
        //////////////////////////////////////////////////////////////////////////
osg::Texture2D* mirrorTexture = new osg::Texture2D;
osg::Group* parent =new osg::Group;
osg::CameraNode* camera = new osg::CameraNode;
const osg::BoundingSphere& bs =Scenenode->getBound();
float znear = 1.0f*bs.radius();
float zfar  = 3.0f*bs.radius();
// 2:1 aspect ratio as per flag geomtry below.
float proj_top   = 0.25f*znear;
float proj_right = 0.5f*znear;
znear *= 0.9f;
zfar *= 1.1f;
camera->addChild(Scenenode);//加入场景
// set up projection.
camera->setProjectionMatrixAsFrustum(-proj_right,proj_right,-proj_top,proj_top,znear,zfar);
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
camera->setReferenceFrame(osg::Transform::RELATIVE_RF);//???我觉得这里的设置应该是使其实时变化的。
        camera->setViewMatrixAsLookAt(osg::Vec3(-1.174,0.644,1.302),osg::Vec3(-1.151,-
         2.883,0.955),osg::Vec3(0.0f,0.0f,1.0f));
// set viewporttex_heighttex_widthtex_height
camera->setViewMatrix(osg::Matrix::identity());
//set the camera to render before the main camera.
camera->setRenderOrder(osg::CameraNode::PRE_RENDER);
//FBO
  osg::CameraNode::RenderTargetImplementation renderImplementation = osg::CameraNode::FRAME_BUFFER_OBJECT;
camera->setRenderTargetImplementation(renderImplementation);
camera->attach(osg::CameraNode::COLOR_BUFFER, mirrorTexture );
////////////////////////////////////////////左视镜/////////////////////////////////
osg::Node*  leftGeode =carNode->asGroup()->getChild(1);//左后视镜
osg::TexGen* texgen =new osg::TexGen;
texgen->setMode(osg::TexGen::SPHERE_MAP);
  
mirrorTexture->setDataVariance(osg::Object:YNAMIC);
mirrorTexture->setInternalFormat(GL_RGBA);
mirrorTexture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D:INEAR);
mirrorTexture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
osg::StateSet* stateset = new osg::StateSet;
stateset->setTextureAttributeAndModes(1,  mirrorTexture ,osg::StateAttribute::ON);
stateset->setTextureAttributeAndModes      (1,texgen,osg::StateAttribute::ON);
       leftGeode->setStateSet(stateset);
//add subgraph to render
       parent->addChild(camera);
       ////////////////////////////////////////////////////////////////////////////////////
        root->addChild(parent);
        root->addChild(Scenenode);
        root->addChild(carNode);
        viewer.setSceneData(root);
4# array

该用户从未签到

 楼主| 发表于 2010-7-7 10:22:34 | 显示全部楼层
array大哥,或者是不是我的方法就有问题啊。。。。 4# array

该用户从未签到

发表于 2010-7-7 12:27:34 | 显示全部楼层
  1. camera->setReferenceFrame(osg::Transform::RELATIVE_RF);
复制代码
这样的话,RTT相机的确会受到漫游器的影响,但是您用setViewMatrixAsLookAt设置的观察矩阵也会因此每帧叠加在场景的观察矩阵之上,我猜测是否是这个问题导致了最终的RTT相机观察矩阵不正确

该用户从未签到

 楼主| 发表于 2010-7-7 17:39:54 | 显示全部楼层
太谢谢了。确实是这样的。我去掉观察矩阵,后视镜的内容就是一直变化的。不过内容比较不正常。  我如果让RTT相机随漫游器变化。 相机的内容怎么控制,能够在后视镜中呈现正确的后视镜变化的场景。 7# array

该用户从未签到

发表于 2010-7-8 08:18:48 | 显示全部楼层
您需要用用setViewMatrix设置一个正确的观察矩阵,这个矩阵将每帧叠加到当前漫游器的观察矩阵上,得到最终的结果。至于如何保证内容的正确性,恐怕就需要您自己来计算这个叠加矩阵的值了

该用户从未签到

 楼主| 发表于 2010-7-8 08:59:41 | 显示全部楼层
哦  明白了。。。谢谢您的解答 9# array
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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