lanseshuijing 发表于 2009-4-10 16:02:39

osg怎么实现拾取物体后高亮显示?

想在osg中实现这样的功能:当鼠标拾取到某个物体后,物体高亮显示?
不知道怎么实现!请高手指点!给出点示例代码!

axibian 发表于 2017-2-22 11:47:05

VR_user_happy 发表于 2013-8-27 16:56
节点选择后挂接节点就高亮显示了(即:在父节点和子节点中间插入一个高亮节点osgFX::Scribe)
osgFX::Scri ...

这只是把三角片的三个边高亮了,那如果需要把这些三角片(边和内部都是红色)都高亮为红色怎么做?

tan_dunming 发表于 2009-4-10 16:17:31

能否采用变色呢?即考虑屏蔽掉某个颜色分量? 如果是OpenGL的话 就使用
glColorMask,和OSG中具体怎么对应,你探索一下。

最好的办法是采用glMatrixMode(GL_COLOR),然后添加颜色变换。但是这个需要显卡支持ARB_imaging 扩展,至少我的显卡不支持。(这个可以看看OpenGL超级宝典图像那一章的介绍。)

如果模型比较少的话,那就建立一个Switch,拾取之后,切换一下显示节点就行了。

[ 本帖最后由 tan_dunming 于 2009-4-10 16:18 编辑 ]

array 发表于 2009-4-10 16:20:04

有很多方法,例如即时给Drawable对象设置一个全局颜色setColorArray并dirtyDisplayList;一个更好的方法是给使用osg中着色器的共享特性来实现,所有的对象都设置同一个uniform变量,对于需要高亮的对象则改变这个变量的值,而在根节点的着色器代码中根据此uniform变量的变化来执行不同的操作。

array 发表于 2009-4-10 16:21:48

tan_dunming说的两种方法应该也没问题~~在osg中就是ColorMask和ColorMatrix;
不过我个人是使用着色器实现的,感觉上比较方便

目前我还在等一些信息,等定下来或者被否决之后。会有一个针对此问题的例子出现在“你所不知的OSG:GLSL(2)”中,或者更适合大家阅读的地方~~~~

kinsung 发表于 2009-4-10 19:20:21

用笨办法就画一个四条边的框也行,表示选中状态。

lanseshuijing 发表于 2009-4-10 20:52:07

回复 2楼 的帖子

谢谢你!

lanseshuijing 发表于 2009-4-10 20:55:05

回复 3楼 的帖子

恩,试试啦,谢谢啊!

uerfar 发表于 2009-4-11 20:26:57

:P

mtt_sky 发表于 2013-8-27 11:27:13

有例子吗版主谢了

VR_user_happy 发表于 2013-8-27 16:56:25

本帖最后由 VR_user_happy 于 2013-8-27 17:00 编辑

节点选择后挂接节点就高亮显示了(即:在父节点和子节点中间插入一个高亮节点osgFX::Scribe)
osgFX::Scribe* parentAsScribe = new osgFX::Scribe();
               parentAsScribe->addChild(m_pickNode);
                pickNodeParent->replaceChild(m_pickNode, parentAsScribe);

取消高亮,就是把添加的高亮节点删除,重新把高亮节点下地子节点挂接到父节点上(删除这个插入的osgFX::Scribe节点)

VR_user_happy 发表于 2017-2-25 13:07:42

用STATESET,设置一下状态颜色:
osg::Stateset *pSet=pNode->getorCreateStateSet();
//
pMaterial为你想设置的材质,创建后可以设置任意颜色
pMaterial=new osg::Material();
pMaterial->setDefuseColor()
pMaterial->set...Color();
...

pSet->set(pMaterial)

//节点重设材质
pNode->setState(pSet);

左岸风景 发表于 2017-4-9 20:04:32

添加描边 osgFX::Scribe
页: [1]
查看完整版本: osg怎么实现拾取物体后高亮显示?