查看: 2560|回复: 27

定时功能

[复制链接]

该用户从未签到

发表于 2009-10-23 11:33:54 | 显示全部楼层 |阅读模式
1 请教osg定时功能?
2 怎样让一幅图片载入后鼠标不能令他旋转

该用户从未签到

 楼主| 发表于 2009-10-23 11:34:41 | 显示全部楼层
文本通过定时自动 消失

该用户从未签到

发表于 2009-10-23 12:46:04 | 显示全部楼层
1、不一定非要局限于OSG的功能,Windows自己的Timer或者各类GUI的定时控制都可以,不过对于场景的操作要尽量在回调中完成
2、用一个独立的HUD相机(设置相机setAllowEventFocus(false))作为这个图片的根节点

该用户从未签到

 楼主| 发表于 2009-10-23 14:40:32 | 显示全部楼层
设置了之后,图片不能显示。  我显示文字是用这个设计的,但是我setAllowEventFocus(true)  文字还是不动的,所以和这个属性有关还是无关的呢

该用户从未签到

发表于 2009-10-23 15:24:08 | 显示全部楼层
图片不能显示只是因为相机的观察矩阵设置的不对而已,再检查吧。文字的轴对称设置会影响文字是否可动,setAllowEventFocus(false)则决定了HUD相机是否接受用户交互事件!

该用户从未签到

 楼主| 发表于 2009-10-23 15:47:32 | 显示全部楼层

修改的

本帖最后由 lxlbgd1 于 2009-10-23 15:50 编辑

_camera->setProjectionMatrix(osg::Matrixortho2D(0,1024,0,768));

    // set the view matrix   
    _camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
    _camera->setViewMatrix(osg::Matrix::identity());

    // only clear the depth buffer
    _camera->setClearMask(GL_DEPTH_BUFFER_BIT);

    // draw subgraph after main camera view.
    _camera->setRenderOrder(osg::CameraPOST_RENDER);

    // we don't want the camera to grab event focus from the viewers main camera(s).
    _camera->setAllowEventFocus(false);


请帮我详细解释下 相机的这几个参数的意思  谢谢 array  谢谢

该用户从未签到

发表于 2009-10-23 15:58:15 | 显示全部楼层
看英文解释不是很清楚吗,没有什么好补充的。

或者请您更深入地研究之后再提问,我不想输入几百字来回答您用Ctrl+V就粘贴上来的问题。个人希望提问者和回答者能够站在平等的角度上去思考问题~~

该用户从未签到

 楼主| 发表于 2009-10-23 16:52:48 | 显示全部楼层
7# array 不好意思 array,我以后提问注意点

该用户从未签到

 楼主| 发表于 2009-10-30 11:57:20 | 显示全部楼层
试了好多方法,还是不能固定, 用AutoTransform 也不行,不是不能显示图片,就是图片还是旋转不能固定,究竟怎么办,试了很多方法 呀? 谢谢

该用户从未签到

发表于 2009-10-30 12:02:15 | 显示全部楼层
用一个HUD相机就可以了,不必考虑那么复杂

该用户从未签到

 楼主| 发表于 2009-10-30 12:13:21 | 显示全部楼层
10# array
array 您说的是不是得设置 相机的 setViewMatrix
我用 hud的例子,可是图片还是不能显示啊

该用户从未签到

发表于 2009-10-30 12:28:27 | 显示全部楼层
那要看您的图片所在位置,以及相机的观察矩阵和投影矩阵设置,没有这些信息,我帮不了您什么

该用户从未签到

 楼主| 发表于 2009-10-30 14:23:26 | 显示全部楼层
首先,图片是这样载入的
createModel(osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(4.0f,0.0f,0.0f), osg::Vec3(0.0f,1.0f,1.0f),imagePath);
osg::Geode* TrInterfaceImage::createModel(osg::Vec3 & topleft, osg::Vec3 & w, osg::Vec3 & h, std::string & name)
{
   _imageNode->addDrawable(osg::createTexturedQuadGeometry(topleft, w, h));
    _imageNode->setStateSet(createState(name));
        //_imageNode=geode;
        _camera->addChild(_imageNode);
        return _imageNode;
}

相机是这样设置的
_camera->setProjectionMatrix(osg::Matrix:rtho2D(0,1024,0,768));

    // set the view matrix   
    _camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
    _camera->setViewMatrix(osg::Matrix::identity());

您看行吗? array
我怎么也弄不出来图片,图片是通过纹理贴图贴上去的

该用户从未签到

发表于 2009-10-30 15:11:46 | 显示全部楼层
下面一段代码,您判断一下四方形应当占据屏幕的多达范围?
  1. osg::Camera* createHUD( double l, double r, double b, double t )
  2. {
  3.     osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  4.     camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
  5.     camera->setViewMatrix( osg::Matrix::identity() );
  6.     camera->setProjectionMatrix( osg::Matrix:rtho2D(l, r, b, t) );
  7.     camera->setClearMask( GL_DEPTH_BUFFER_BIT );
  8.     camera->setRenderOrder( osg::Camera:OST_RENDER );
  9.     camera->setAllowEventFocus( false );
  10.     camera->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
  11.     return camera.release();
  12. }

  13. int main(...)
  14. {
  15.     ...
  16.     osg::Geode* geode = new osg::Geode;
  17.     geode->addDrawable( osg::createTexturedQuadGeometry(
  18.         osg::Vec3(-320.0f,-240.0f,0.0f), osg::Vec3(640.0f,0.0f,0.0f), osg::Vec3(0.0f,480f,0.0f)) );
  19.     osg::Camera* hud = createHUD( -640.0f, 640.0f, -480.0f, 480.0f );
  20.     hud->addChild( geode );
  21.     ...
  22. }
复制代码
实际情况是正好占据了屏幕中央四分之一的区域,并且不会受到鼠标和键盘事件的影响。您觉得呢?请为我说明一下理由好吗?谢谢。
希望对您的学习理解有帮助。

该用户从未签到

 楼主| 发表于 2009-10-30 15:54:43 | 显示全部楼层
14# array 我是初学者,array,就是想让载入的东西如图片、模型、动画等,在动鼠标的时候它们不动,不受鼠标的影响,受键盘影响的东西我会用键盘事件来实现  谢谢array

该用户从未签到

 楼主| 发表于 2009-11-2 00:01:04 | 显示全部楼层
谢谢 array
不过hud->addChild( geode );
这条应该是
hud->addChild( hud);

该用户从未签到

发表于 2009-11-2 08:55:34 | 显示全部楼层
  1. hud->addChild( hud);
复制代码
您的意思我不明白?

还有如果您的确是初学者,希望您能够回应一下我提的问题,我相信那个问题能够帮助您巩固一些基础知识:
实际情况是正好占据了屏幕中央四分之一的区域,并且不会受到鼠标和键盘事件的影响。您觉得呢?请为我说明一下理由好吗?


当然,您可以不理睬,不过这会十分打击我粘贴代码的积极性

该用户从未签到

 楼主| 发表于 2009-11-3 14:33:34 | 显示全部楼层
hud->addChild( hud); 我说错了,不好意思。
createTexturedQuadGeometry(osg::Vec3(-320.0f,-240.0f,0.0f), osg::Vec3(640.0f,0.0f,0.0f), osg::Vec3(0.0f,480f,0.0f)) );表示以第一个参数作为左下角的点,第二个参数作为宽,第三个作为高,创建一个几何(矩形)面片,  相机的投影矩阵为在屏幕上的投影区域,正好包括了几何面片。我的屏幕分辨率是1024*768的  所以不是正好占据了1/4,但确实是在屏幕中央
对吗? array  谢谢

该用户从未签到

发表于 2009-11-3 16:05:10 | 显示全部楼层
1、不一定非要局限于OSG的功能,Windows自己的Timer或者各类GUI的定时控制都可以,不过对于场景的操作要尽量在回调中完成
2、用一个独立的HUD相机(设置相机setAllowEventFocus(false))作为这个图片的根节点
array 发表于 2009-10-23 12:46


请教下array老师,为什么这里强调是“对于场景的操作要尽量在回调中完成”呢?

该用户从未签到

发表于 2009-11-3 16:06:32 | 显示全部楼层
事实上您并没有为我解释其中的原理……不过,算了……我无德无能,不应该好为人师
如果您自己能够理清思路的话,那么以后类似的问题想必也迎刃而解~~呵呵

该用户从未签到

 楼主| 发表于 2009-11-3 17:26:02 | 显示全部楼层
本帖最后由 lxlbgd1 于 2009-11-4 00:23 编辑

20# array
试了好久,终于想明白了其中的道理,我说说,您看看对吗,array
相机的投影矩阵是相对于全屏幕的,就是说投影矩阵是占据的是整个屏幕,所以您这样设置:osg::Vec3(-320.0f,-240.0f,0.0f), osg::Vec3(640.0f,0.0f,0.0f), osg::Vec3(0.0f,480f,0.0f)) );
osg::Camera* hud = createHUD( -640.0f, 640.0f, -480.0f, 480.0f );
面片的位置正好占据了屏幕1/4的位置,您看看对吗?  谢谢array给我的启发

该用户从未签到

发表于 2009-11-4 08:24:58 | 显示全部楼层
投影变换和屏幕变换是两个概念,这一点您一定要分清!相机的投射内容是否对应全屏幕,这取决于屏幕矩阵的设置,也就是视口glViewport的值。

在OpenGL中(DX与此类同),一个大概的坐标变换过程为:
OCS(物体局部坐标系,右手)->WCS(世界坐标系,右手)->VCS(观察坐标系,右手)->CCS(裁切坐标系,右手)->NDCS(规格化设备坐标系,左手)->DCS(设备坐标系,左手)

其中,模型视点矩阵MV用于WCS->VCS的变换,投影矩阵P用于VCS->CCS的变换,裁切矩阵(即glClipPlane)用于CCS->NDCS的变换,屏幕矩阵W(glViewport)用于NDCS->DCS的变换。这就是MVPW级联矩阵的由来。

如果您还是不太明白,可以期待我的新书里面所讲的内容。我尽可能详细地介绍了这个十分重要,但是历来被国内书籍所忽视的内容。不过可能还要等一段时间

该用户从未签到

 楼主| 发表于 2009-11-4 11:54:53 | 显示全部楼层
22# array
期待中,这些矩阵变换很麻烦,期待 详细讲这些的书, 谢谢array给我的解答  
预祝您新书进展顺利!

该用户从未签到

 楼主| 发表于 2009-11-9 21:34:26 | 显示全部楼层
array,用独立摄像机做 hud 显示时, 有个问题就是遮挡怎么处理呢?
// draw subgraph after main camera view.
    _camera->setRenderOrder(osg::Camera:OST_RENDER);
这个(全屏幕)渲染出来之后,把主场景里的东西遮挡了,有什么好方法能解决这个问题呢?

该用户从未签到

 楼主| 发表于 2009-11-9 21:38:24 | 显示全部楼层
22# array

这几个矩阵还是不太明白,尤其是怎么变的,期待新书 是《最长的一帧》吗?

该用户从未签到

发表于 2009-11-9 22:57:18 | 显示全部楼层
HUD就是要后置渲染并且挡住主场景,不然怎么能叫做HUD呢(Head-Up Display)?不知道您到底想做什么

《最长的一帧》在论坛就可以免费下载;它和新书没有直接关系。新书由清华大学出版社拥有版权并发行,不可以发到网络之上

该用户从未签到

 楼主| 发表于 2009-11-10 10:20:56 | 显示全部楼层
26# array

我就是想让场景里的东西 固定不动,且无遮挡? 除非做成透明的吗?


那新书啥时候出版啊?

该用户从未签到

发表于 2009-11-10 12:06:01 | 显示全部楼层
抱歉我现在完全不知道您到底要做什么了。除非您仔细地阐述自己要做的每一件事情,否则我无法再提供任何有用的信息。

说实话这样让人很累也很沮丧;与您讨论了很久,然后发现您根本就打算做另一件事情……需要您谅解的是:我不是您肚子里的虫,当您想当然地把自己需要的功能用短短几个字说出来的时候,大多数时候我是无法想象它到底是什么模样的——如果您见过相关软件的实现,那么请贴图;如果这个功能是您自己设计的,请先设法给出足够清晰的解释或图示;否则的话论坛就成了您浪费时间的地方——我相信您如果自己去研究的话,这么长的时间,十个功能也搞出来了——然而您却一直在这里被误导着。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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