查看: 3327|回复: 11

osg中控制部分结点响应鼠标事件

[复制链接]

该用户从未签到

发表于 2014-7-2 16:24:48 | 显示全部楼层 |阅读模式

各位大哥,小弟遇到一个问题:

osg中如何控制部分结点响应鼠标事件。

比如:osg场景图中有两个结点,一个是 文字信息,一个是一头牛。
通过滚动鼠标中键,默认情况下,文字信息和 牛都会放大缩小。

现在的目的是:滚动鼠标中键,只让牛放大缩小, 文字信息大小保持不变。


多谢各位。

该用户从未签到

发表于 2014-7-2 21:31:29 | 显示全部楼层
可以看一下 AutoTransform

该用户从未签到

 楼主| 发表于 2014-7-6 22:44:53 | 显示全部楼层
cenfer 发表于 2014-7-2 21:31
可以看一下 AutoTransform

多谢cenfer。
我去看看 AutoTransform 的源代码。

该用户从未签到

 楼主| 发表于 2014-7-7 10:43:26 | 显示全部楼层
cenfer 发表于 2014-7-2 21:31
可以看一下 AutoTransform


cenfer.
再麻烦你一下:

你的意思是 用AutoTransform 结点作为"文字信息"的父节点?
然后在  AutoTransform 结点 updateCallback中:

总是设置:
setAutoRatateMode (无旋转)
setScale(1.0f,1.0f,1.0f)
setPosition(根据viewPort的大小来变化)?


请明示。多谢Cenfer。

该用户从未签到

发表于 2014-7-7 21:06:27 | 显示全部楼层
//自动缩放旋转
                        osg::AutoTransform* at = new osg::AutoTransform;
                        at->addChild(geode);
                        at->setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN);
                        at->setAutoScaleToScreen(true);
                        at->setMinimumScale(0.0);
                        at->setMaximumScale(FLT_MAX);
                        at->setPosition(pos);

该用户从未签到

发表于 2014-7-8 00:53:44 | 显示全部楼层
不需要AutoTransform,osg文字直接setCharacterSizeMode(osgText::Text::SCREEN_COORDS);

该用户从未签到

 楼主| 发表于 2014-7-8 10:18:02 | 显示全部楼层
本帖最后由 rubby 于 2014-7-8 10:29 编辑
smash 发表于 2014-7-8 00:53
不需要AutoTransform,osg文字直接setCharacterSizeMode(osgText::Text::SCREEN_COORDS);


多谢smash的回复,

但是使用了这个语句后,
并没有效果。

滚动鼠标中键, 文字信息大小和位置并没有保持不变(如始终在左上角)。
而是变化的。


是不是还要另外有些设置,

该用户从未签到

 楼主| 发表于 2014-7-8 10:52:50 | 显示全部楼层
本帖最后由 rubby 于 2014-7-8 11:12 编辑
cenfer 发表于 2014-7-7 21:06
//自动缩放旋转
                        osg::AutoTransform* at = new osg::AutoTransform;
                        at->addChild(geode);


多谢cenfer大哥。

我想将 文字信息 的位置固定在窗口的左上角,大小也不变。

那么pos是不是需要变化吗?(用户按下了鼠标中键 放大缩小,或者旋转了)

那这个pos是不是要在callback中设置?应该如何设置 pos位置根据 缩放 和旋转。使 文字信息 大小位置固定在窗口的左上角?

再次麻烦一下。。

该用户从未签到

发表于 2014-7-8 12:42:43 | 显示全部楼层
rubby 发表于 2014-7-8 10:18
多谢smash的回复,

但是使用了这个语句后,

你这种情况应该用HUD,可参考osg自带例子。

该用户从未签到

 楼主| 发表于 2014-7-8 13:53:20 | 显示全部楼层
本帖最后由 rubby 于 2014-7-8 14:33 编辑
smash 发表于 2014-7-8 12:42
你这种情况应该用HUD,可参考osg自带例子。


正解,多谢smash。

还有几个疑惑,麻烦你帮我解答下:

1.请问billboard 和 HUD的区别是什么?

billboard 相当于始终面向用户,但是仍然可以旋转?

2. hud中设置位置。
如果要设置为窗口的左上角,在绝对坐标系下,其坐标应该是 多少??

貌似这个坐标系和osg 平常使用的坐标位置不太一样。


万分感谢啊。

该用户从未签到

发表于 2014-7-8 15:06:53 | 显示全部楼层
rubby 发表于 2014-7-8 13:53
正解,多谢smash。

还有几个疑惑,麻烦你帮我解答下:

1.Billboard也有几种方式,可以绕物体原点旋转,也可以绕Z轴旋转,Billboard一般还是在三维场景中,只不过方向绕着视点转动。HUD则完全是以视点为参考坐标系放物体,物体的位置与场景没有关系。
2.HUDCamera在窗口缩放过后,左上角的点的值是会变化的。一般把HUDCamera设置为正投影,用getProjectionMatrixAsOrtho获取HUDCamera的left、right、top、bottom,这四个值跟你设置Text的位置是一致的。在响应窗口的Resize消息后要重新计算。

该用户从未签到

 楼主| 发表于 2014-7-8 16:24:12 | 显示全部楼层
smash 发表于 2014-7-8 15:06
1.Billboard也有几种方式,可以绕物体原点旋转,也可以绕Z轴旋转,Billboard一般还是在三维场景中,只不 ...

精辟啊,大哥!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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