查看: 3606|回复: 14

怎么样得到节点物体各顶点坐标

[复制链接]

该用户从未签到

发表于 2009-12-25 14:40:34 | 显示全部楼层 |阅读模式
node = osgDB::readNodeFile("box.ive");

接下来用什么函数能够得到读进来的那物体的各顶点呢?

该用户从未签到

发表于 2009-12-25 15:27:05 | 显示全部楼层
用节点访问器,遍历各个Geode,并获取每个Geode下的Geometry对象,进而得到各个几何部件的顶点数组

该用户从未签到

发表于 2009-12-25 15:45:26 | 显示全部楼层
binggo~~

该用户从未签到

 楼主| 发表于 2009-12-25 16:17:53 | 显示全部楼层
本帖最后由 back 于 2009-12-25 16:21 编辑

osg::Node* node = new osg::Node();
        
        node = osgDB::readNodeFile("box.ive");

        osg::NodeVisitor *nv = new osg::NodeVisitor();

        osg::Geode *gd = new osg::Geode();
        
        osg::Geometry *gm = new osg::Geometry();        

        node->asGeode(gd);
        
        nv->apply(gd);

        gd->getDrawable(1)->asGeometry(gm);

        osg::Array ar = new osg::Array();

       ar=gm->getVertexArray();

好乱  不知道具体怎么弄

该用户从未签到

发表于 2009-12-26 15:21:27 | 显示全部楼层
您应该先看一看Paul Martz的《快速入门指导》,然后再考虑用OSG开发具体的程序。看起来您并没有形成一个用OSG进行程序开发的完整概念

该用户从未签到

 楼主| 发表于 2009-12-28 20:30:20 | 显示全部楼层
本帖最后由 back 于 2009-12-28 20:32 编辑

node->asGeode()->getDrawable(1)->asGeometry()->getVertexArray()

有谁知道具体怎么写么~~~

另外返回的是osg::Array格式的  怎么获取这样的顶点数组呢?怎么输出到命令窗口?

该用户从未签到

发表于 2009-12-29 08:25:15 | 显示全部楼层
您到底想做什么呢?

想得到顶点数组的话,用dynamic_cast<Vec3Array*>(getVertexArray())就可以了

该用户从未签到

 楼主| 发表于 2009-12-29 14:10:40 | 显示全部楼层
不好意思~~  目标: 对一个导入的物体进行切割,用平面切割,完了分成两部分。  方法:得到该物体的顶点,用平面方程把这些点分在平面两侧,对两侧的点进行重新构造几何体,实现任意平面对复杂物体的切割。

不知道运算量大不大,方法土不土。

该用户从未签到

发表于 2009-12-29 14:31:24 | 显示全部楼层
运算量可能不小,不过如果想要获得分割后的几何体数据的话,这是唯一的方法——注意法线和图元信息可能要重新计算

如果只是想显示切割后的图形,那么用模板缓存或者ClipPlane也是不错的选择

该用户从未签到

 楼主| 发表于 2009-12-29 15:43:48 | 显示全部楼层
screen_shot_0.jpg

嗯 应该使用ClipPlane比较方便,  但是切割完之后会有两个问题,
第一:物体会留下一个空洞, 这样需要补起来, 使用物体与平面的交点连接起来绘制新的几何体;
第二:被切掉的那块怎么不见了,被切掉的那块我也要需要对它进行位姿控制。怎么找回?

该用户从未签到

发表于 2009-12-29 16:29:41 | 显示全部楼层
1、如果需要补洞的话,那么没的选择了,必须使用重新计算几何体的方法,呵呵。
2、也是那句话,必须使用重新计算几何体的方法,因为您不仅仅想看到渲染结果,还希望对顶点数据进行控制

该用户从未签到

 楼主| 发表于 2009-12-29 16:53:33 | 显示全部楼层
screen_shot_0.jpg


谢谢array

第二个问题貌似解决了,我采用了两个平面进行切割,这两个平面只是法线不一样而已,这样看上去就像切完的两块都在。

osg::ClipPlane* cp1 = new osg::ClipPlane();
cp1->setClipPlane(-1,-1,-1,-1);              //
cp1->setClipPlaneNum(0);
osg::ClipPlane* cp2 = new osg::ClipPlane();
cp2->setClipPlane(1,1,1,1);                   //与上面的符号相反
cp2->setClipPlaneNum(1);

该用户从未签到

 楼主| 发表于 2009-12-30 14:31:48 | 显示全部楼层
关于得到几何体 顶点 法线 颜色 三角网等信息  参见array的《OpenSceneGraph三维渲染引擎设计与实践》第113页-115页的例子:使用仿函数遍历几何体

该用户从未签到

发表于 2016-11-8 14:30:36 | 显示全部楼层
array 发表于 2009-12-29 08:25
您到底想做什么呢?

想得到顶点数组的话,用dynamic_cast(getVertexArray())就可以了

这个我得到了array,但是要怎么得到里面的每个顶点,我想把这些顶点写入文件?谢谢!

该用户从未签到

发表于 2016-12-8 15:12:59 | 显示全部楼层
得到array后
,使用迭代器可以访问数组,也可以使用下标访问数组元素,如:array.at(i).x();   array.at(i).y();
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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