查看: 2034|回复: 5

【求助】想要把OSG的camera嵌入到MyGUI的RanderBox下,有没有什么好的办法。

[复制链接]

该用户从未签到

发表于 2013-8-6 13:36:18 | 显示全部楼层 |阅读模式
本帖最后由 xulin_2005 于 2013-8-6 13:36 编辑

想要实现类似ORGE那样的RanderBox,如下图,将Camera放入到了一个MyGUI的Canvas中,但在OSG下还不知如何实现,有谁能指点一下,谢谢~~
图像 1.png

该用户从未签到

发表于 2013-8-7 08:11:11 | 显示全部楼层
MyGUI的Canvas ? 用RTT 渲染到纹理,然后在显示

该用户从未签到

 楼主| 发表于 2013-8-8 17:51:02 | 显示全部楼层
本帖最后由 xulin_2005 于 2013-8-8 17:53 编辑

谢谢!RTT渲染到纹理这一步我已经实现了,方法是通过Camera::attach()和一个osg::Texture绑定,可以将纹理显示在一个平面上,但是MyGUI使用的MyGUI::ITexture,这个要转成osg::Textrue似乎有点难度,能否在给点提示呢。。。
图像 3.png

该用户从未签到

发表于 2013-8-9 08:19:00 | 显示全部楼层
没怎么使用干过MyGUI。 MyGUI::ITexture 应该里面有相关设置texture信息的东西吧

该用户从未签到

发表于 2013-8-12 09:49:03 | 显示全部楼层
我不太建议您做这种UI与场景的互相嵌合,如果MyGUI的Texture可以支持直接输入TexID的话,那么直接讲getTextureObject()的id赋予它应该就可以,但是这样的结构设计并不好,再次重申。

该用户从未签到

 楼主| 发表于 2013-8-20 14:50:45 | 显示全部楼层
谢谢!我已经实现了在MyGUI::Canvas中嵌入RttTexture。和Array您的方法类似,中间需要TextureObject,不过id的创建和使用是反过来的。具体如下:
【思路】
用MyGUI::Canvas创建MyGUI::OpenGLTexture对象,然后再将Texture的id放入到TextrueObject中,再将TextureObject放入到osg::Texture2D中,最后通过camera::attach的方法将Camera和Canvas相关联。
【关键代码片段】
  1.                 // 创建Canvas,并创建Texture
  2.                 MyGUI::Canvas* canvas = root->createWidget<MyGUI::Canvas>("Canvas", MyGUI::IntCoord(0, 0, 512, 512), MyGUI::Align::Stretch, "Canvas1");
  3.                 canvas->createTexture(MyGUI::IntSize(512, 512), MyGUI::Canvas::TextureResizeMode::TRM_PT_VIEW_ALL);               
  4.                 MyGUI::OpenGLTexture * openglTexture = dynamic_cast<MyGUI::OpenGLTexture*>(canvas->getTexture());

  5.                 // 创建Texture2D
  6.                 _texture = new osg::Texture2D;
  7.                 _texture->setWrap(osg::Texture2D::WrapParameter::WRAP_S,osg::Texture2D::WrapMode::CLAMP_TO_BORDER);
  8.                 _texture->setWrap(osg::Texture2D::WrapParameter::WRAP_T,osg::Texture2D::WrapMode::CLAMP_TO_BORDER);
  9.                 _texture->setInternalFormat( GL_RGBA );
  10.                 _texture->setFilter( osg::Texture::MIN_FILTER, osg::Texture::LINEAR );
  11.                 _texture->setFilter( osg::Texture::MAG_FILTER, osg::Texture::LINEAR );
  12.                 _texture->setTextureSize(512,512);

  13.                 // MyGUI::ITextrue::ID => TextureID => TextureObject => Texture2D
  14.                 osg::ref_ptr<osg::Texture::TextureObject>                to = new osg::Texture::TextureObject(_texture, openglTexture->getTextureID(), GL_TEXTURE_2D);
  15.                 _texture->setTextureObject(0, to);

  16.                 // 增加子Camera
  17.                 _camera = new osg::Camera;
  18.                 _camera->setViewport(0, 0, 512, 512);
  19.                 _camera->setAllowEventFocus(false);
  20.                 _camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  21.                 _camera->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 0.2));
  22.                 _camera->setRenderOrder( osg::Camera::PRE_RENDER );
  23.                 _camera->setProjectionMatrix( osg::Matrix::ortho2D(-20, 120, -20, 120) );
  24.                 _camera->setViewMatrix(osg::Matrix::translate(osg::Vec3(.0, -100.0, 0.0)) * osg::Matrix::rotate(osg::DegreesToRadians(180.0), osg::Vec3(1., 0., 0.)) * osg::Matrix::identity());
  25.                 _camera->setCullMask(0x01);
  26.                 _camera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  27.                 _camera->setRenderTargetImplementation(osg::Camera::RenderTargetImplementation::FRAME_BUFFER_OBJECT);
复制代码

【图释 】下图中将同一个Texture2D,在MyGUI::Canvas和一个osg平面上显示。
图像 5.png

【新的问题】
1、在将RttCamera的内容放入到Canvas中显示时发现图像需要一个沿x轴的180翻转,否则图片显示的是反的。
2、放到Canvas中,无法Camera中的内容无法接收鼠标、键盘的响应,估计需要将MyGUI的鼠标键盘消息再重新映射到osg的消息处理中,这个是否是Array您说的结构设计不好?



您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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