查看: 2389|回复: 19

新人求助相机移动

[复制链接]

该用户从未签到

发表于 2012-10-11 09:49:09 | 显示全部楼层 |阅读模式
房子1.jpg
求教大神,如何实现点击门时,相机移动到房子里面。谢谢~~

该用户从未签到

发表于 2012-10-11 10:01:18 | 显示全部楼层
找到门的节点,然后得到门的坐标,最后移动摄像机的位置就行了

该用户从未签到

 楼主| 发表于 2012-10-11 10:09:07 | 显示全部楼层
sy2178668 发表于 2012-10-11 10:01
找到门的节点,然后得到门的坐标,最后移动摄像机的位置就行了

门是在房子上的,导入的是一个3dsmax画的一个模型,这样也能查找门的节点吗?

该用户从未签到

发表于 2012-10-11 10:26:55 | 显示全部楼层
三叶侠客 发表于 2012-10-11 10:09
门是在房子上的,导入的是一个3dsmax画的一个模型,这样也能查找门的节点吗?

你的模型把门和房子画一起了??那好像就不行了。如果分开的话,你可以用NodeVisitor遍历找到门的节点,然后再做操作就可以了

该用户从未签到

发表于 2012-10-11 10:27:01 | 显示全部楼层
您需要遍历找到这个模型节点(例如通过名字)然后动画改变它的位置

该用户从未签到

 楼主| 发表于 2012-10-11 10:29:35 | 显示全部楼层
sy2178668 发表于 2012-10-11 10:26
你的模型把门和房子画一起了??那好像就不行了。如果分开的话,你可以用NodeVisitor遍历找到门的节点,然 ...

门,窗都是分开的,没有连在一起。

该用户从未签到

 楼主| 发表于 2012-10-11 10:32:34 | 显示全部楼层
array 发表于 2012-10-11 10:27
您需要遍历找到这个模型节点(例如通过名字)然后动画改变它的位置

不知道节点名字怎么办?这个模型是3dsmax导出的osg格式,现在就想实现点击门然后相机切换到房子里。刚学习osg,谢谢大神了。

该用户从未签到

发表于 2012-10-11 10:54:07 | 显示全部楼层
不知道名字,谁知道这个是门还是墙啊,计算机没有那么高智能的说。。。

该用户从未签到

 楼主| 发表于 2012-10-11 10:55:35 | 显示全部楼层
array 发表于 2012-10-11 10:54
不知道名字,谁知道这个是门还是墙啊,计算机没有那么高智能的说。。。

请问是不是可以通过文档编辑器打开osg格式文件查看?

该用户从未签到

发表于 2012-10-11 14:06:37 | 显示全部楼层
可以

该用户从未签到

发表于 2012-10-11 16:01:38 | 显示全部楼层
三叶侠客 发表于 2012-10-11 10:29
门,窗都是分开的,没有连在一起。

门节点的名字就是3Dmax里面起的名字

该用户从未签到

 楼主| 发表于 2012-10-11 19:39:27 | 显示全部楼层
sy2178668 发表于 2012-10-11 16:01
门节点的名字就是3Dmax里面起的名字

请问这个节点是Node节点还是Geode节点呢?我用文本编辑器打开osg模型,发现是似乎是Geode节点,该怎么遍历查找,美国海军教程只有Node节点的查找。
附件是房子的osg文件

house.osg

130.31 KB, 下载次数: 8, 下载积分: 威望 1

该用户从未签到

发表于 2012-10-12 08:13:52 | 显示全部楼层
跟Node或者Geode有什么区别么,getName就可以了
还有一般的节点都是以MT进行管理的,应该不是Geode

该用户从未签到

 楼主| 发表于 2012-10-12 09:51:04 | 显示全部楼层
liuzhiyu123 发表于 2012-10-12 08:13
跟Node或者Geode有什么区别么,getName就可以了
还有一般的节点都是以MT进行管理的,应该不是Geode

额,是MT节点,MT节点能同样用NodeVisitor类查找吧?

该用户从未签到

发表于 2012-10-12 10:21:43 | 显示全部楼层
三叶侠客 发表于 2012-10-12 09:51
额,是MT节点,MT节点能同样用NodeVisitor类查找吧?

of course

该用户从未签到

发表于 2012-10-12 10:53:13 | 显示全部楼层
三叶侠客 发表于 2012-10-11 19:39
请问这个节点是Node节点还是Geode节点呢?我用文本编辑器打开osg模型,发现是似乎是Geode节点,该怎么遍历 ...

刚看了下,house.osg里的节点有Line01,Pivot01,CasementWindow01,CasementWindow02。然后你自己用写个遍历器getName查找下就行了。遍历器查找的代码海军教程里有

该用户从未签到

 楼主| 发表于 2012-10-12 20:46:07 | 显示全部楼层
sy2178668 发表于 2012-10-12 10:53
刚看了下,house.osg里的节点有Line01,Pivot01,CasementWindow01,CasementWindow02。然后你自己用写个 ...

好的,谢谢了,我去试试。

该用户从未签到

 楼主| 发表于 2012-10-12 21:41:47 | 显示全部楼层
本帖最后由 三叶侠客 于 2012-10-12 21:54 编辑
sy2178668 发表于 2012-10-12 10:53
刚看了下,house.osg里的节点有Line01,Pivot01,CasementWindow01,CasementWindow02。然后你自己用写个 ...


我参考海军教程,把里面的Switch节点改为MatrixTransform节点,写了以下代码找到了门的节点。请问接下来该怎么做,实现点击门后相机切换到房子里?是获取门的坐标吗?谢谢~~
  1. #include<osg/PositionAttitudeTransform>
  2. #include<osg/Group>
  3. #include<osg/Node>
  4. #include<osgDB/ReadFile>
  5. #include<osgViewer/Viewer>
  6. #include <cstdlib>

  7. osg::Node*findNamedNode(const std::string&searchName,
  8.                                            osg::Node*currNode)
  9. {
  10.         osg::Group*currGroup;
  11.         osg::Node*foundNode;

  12.         //检查输入的节点是否是合法的,
  13.         //如果输入节点为NULL,则直接返回NULL。
  14.         if(!currNode)
  15.         {
  16.                 return NULL;
  17.         }
  18.         //如果输入节点合法,那么先检查该节点是否就是我们想要的结果。
  19.         //如果确为所求,那么直接返回输入节点。
  20.         if(currNode->getName()==searchName)
  21.         {
  22.                 return currNode;
  23.         }
  24.        
  25.         //如果输入节点并非所求,那么检查它的子节点(不包括叶节点)情况。
  26.         //如果子节点存在,则使用递归调用来检查每个子节点。
  27.         //如果某一次递归的返回值非空,说明已经找到了所求的节点,返回其指针。
  28.         //如果所有的节点都已经遍历过,那么说明不存在所求节点,返回NULL。
  29.         currGroup=currNode->asGroup();//returns NULL if not a group.
  30.         if(currGroup)
  31.         {
  32.                 for(unsigned int i=0;i<currGroup->getNumChildren();i++)
  33.                 {
  34.                         foundNode=findNamedNode(searchName,currGroup->getChild(i));
  35.                         if(foundNode)
  36.                                 return foundNode;//找到所求节点。
  37.                 }
  38.                 return NULL;//遍历结束,不存在所求节点。
  39.         }
  40.         else
  41.         {
  42.                 return NULL;//该节点不是组节点,返回NULL
  43.         }
  44. }

  45. int main()
  46. {
  47.         osg::ref_ptr<osg::Group>root=new osg::Group();
  48.         osg::ref_ptr<osg::Node>houseNode=osgDB::readNodeFile("\\mymodels\\house.osg");
  49.         root->addChild(houseNode.get());

  50.        
  51.         osg::MatrixTransform*mynode=NULL;
  52.         osg::Node*foundNode=NULL;
  53.        
  54.         foundNode=findNamedNode("Line01",root.get());
  55.         mynode=(osg::MatrixTransform*)foundNode;
  56.         if(!mynode)
  57.         {
  58.                 std::cout<<"matrixtransform node not found,quitting."<<std::endl;system("pause");
  59.                 return -1;
  60.         }
  61.         else std::cout<<"matrixtransform node found,quitting."<<std::endl;system("pause");

  62. }
复制代码

该用户从未签到

发表于 2012-10-13 00:24:02 | 显示全部楼层
使用遍历器得到门的坐标 ,然后将相机移过去 。
但是不知道你想怎么移动。。。
建议使用相机漫游功能(看书)

该用户从未签到

发表于 2012-10-13 10:00:06 | 显示全部楼层
同楼上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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