MyGUI RTT到OSG Widget点选实现

首先是将MyGUI中的纹理包装成OSG的问题,解决方法是用TextureObject.参考网址见 http://forum.openscenegraph.org/viewtopic.php?t=12967&view=previous
具体到我的代码就是:
//关联纹理 osg::ref_ptr tex2D=new osg::Texture2D;                                osg::ref_ptr to=new osg::Texture::TextureObject(tex2D.get(),texID,GL_TEXTURE_2D);tex2D->setTextureObject(GlobalInfo::m_GlobalInfo_ContextID,to.get());

上面texID是MyGUI中RTT后的纹理ID
GlobalInfo::m_GlobalInfo_ContextID是图形上下文ID

有个tex2D就好办了,想怎么贴就怎么贴,HUD?模型节点,都可以了喔

好吧,贴完后,更大的问题来了,我怎么交互啊,由于RTT后是贴一张图片,怎么将点击之类的东东反馈给MyGUI(比如,现在我移到了某控件上了,MyGUI,你给我将该控件高亮),MyGUI中有两个相关的例子,前面学习中貌似已经说过了,UnitTest_Layers和UnitTest_RTTLayer,ogre版已经实现了UnitTest_Layers,所以思路就是跟着该例子走。

一看例子非常熟悉啊,求交,替换为OSG求交就行了。但是被getCoordByRel和getCoordByTriangle两个函数难住了,知道它两是在求纹理坐标,但是具体实在是看不懂,完全搬过来照用仍然不行(完全没效果啊),是时候体现一点创新的时候了,这里我用三角形重心坐标来求纹理坐标。
具体思路如下:
一、用OSG求交,如果求交点是贴RTT纹理的节点,转第二步,否则,直接返回拣选false。
二、得到求交点的世界坐标以及该求交点所在三角形的三个点的世界坐标和纹理坐标。
三、计算该求交点在该三角形内的重心坐标。
算法如下:
osg::Vec3 OSGPickSceneObject::getCoordByTriangle(osg::Vec3_position, const osg::Vec3& _corner0, const osg::Vec3&_corner1, const osg::Vec3& _corner2) const
{
//osg::Vec3 result;
osg::Vec3 dir0=_corner0-_position;
osg::Vec3 dir1=_corner1-_position;
osg::Vec3 dir2=_corner2-_position;

osg::Vec3 tempDir0=dir0;
tempDir0.normalize();
osg::Vec3 tempDir1=dir1;
tempDir1.normalize();
osg::Vec3 tempDir2=dir2;
tempDir2.normalize();

double arcthea0=acos(tempDir1*tempDir2);
double arcthea1=acos(tempDir0*tempDir2);
double arcthea2=acos(tempDir0*tempDir1);

osg::Vec3 orignal0=_corner1-_corner0;
osg::Vec3 orignal1=_corner2-_corner0;

osg::Vec3 tempOriginal0=orignal0;
osg::Vec3 tempOriginal1=orignal1;

    tempOriginal0.normalize();
tempOriginal1.normalize();

double arcthea=acos(tempOriginal0*tempOriginal1);

double s0=dir1.length()*dir2.length()*sin(arcthea0);
double s1=dir0.length()*dir2.length()*sin(arcthea1);
double s2=dir0.length()*dir1.length()*sin(arcthea2);

doubles=orignal0.length()*orignal1.length()*sin(arcthea);

double u=s0/s;
double v=s1/s;
double w=s2/s;

return osg::Vec3(u,v,w);
}
传入参数就是求交点的世界坐标和三角形三个点世界坐标,返回的是该点在三角形内的重心坐标(u,v,w)。
四、计算求交点在RTT纹理中的坐标osg::Vec2 osg::Vec2point2=selTexcoords[0]*point.x()+selTexcoords[1]*point.y()+
selTexcoords[2]*point.z();
_x = (int)(point2.x() * _texture_width);
_y = (int)(point2.y() * _texture_height);

selTexcoords是三个三角形点的纹理坐标,point就是上面求的重心坐标。_x和_y为计算的该点在RTT纹理中的坐标,拿这个在MyGUI中用吧!在getLayerItemByPoint和getPosition方法中。

再说一下MyGUI中的坑,前面所说的纹理反转是一个,透明问题,折磨了我一天啊。。。。Widget背景如果不透明度为0,RTT到OSG后居然一点不透明,而如果是稍微有点不透明度,到OSG中就有点透明了,尼玛。各种方法各种测试,无解,最后查看了MyGUI中Ogre的例子,一句话解决。在MyGUI_OpenGLRTTexture.cpp Begin方法glOrtho(-1, 1, 1,-1, -1, 1);句下面加上glClearColor(0,0,0,0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值