查看: 3648|回复: 7

关于在bullet建立模型btTriangleIndexVertexArray

[复制链接]

该用户从未签到

发表于 2013-3-25 17:10:42 | 显示全部楼层 |阅读模式
  最近使用osgbullet做一个将osg模型导入bullet的实验,发现osgbullet提供的方式并不精确,于是打算使用btGImpactMeshShape来建立碰撞模型。但是,这个借口依赖于btTriangleIndexVertexArray,这个接口的使用实在是看不懂。
btTriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,btScalar* vertexBase,int vertexStride);
参数分别是
numTriangles: number of triangles
triangleIndexBase: the array of vertex indices that makes up the triangles
triangleIndexStride: the number of bytes to skip in the vertex indices array to go from the start of one triangle to the start of the next triangle. Typically this is 3 times the sizeof the vertex index type.
numVertices: number of vertices
vertexBase: the array of vertex positions
vertexStride: the number of bytes to skip in the vertex position array to go from the start of one vertex to the start of the next vertex. If the vertex position is composed of 3 floats for example, then this would be 3*sizeof(float). If it is 3 doubles with 1 double as padding, then 4*sizeof(double), for example.
(在网上找到的)

我看下来大概意思是需要三角面片和顶点的数量,还有他们的索引,以及2个3倍数的值,这样理解对吗?。

而且不清楚这些索引怎么提取。我看了array大神在4年前回复中提到使用getPrimitiveSet,但是得到这个结构之后呢?

还有,如果建立geometry的时候没有设置索引,osg会自动建立索引吗?

求知道的大神指点,或者给我一个相关的资料,我实在是找不到了TAT

该用户从未签到

发表于 2013-3-26 08:00:42 | 显示全部楼层

该用户从未签到

 楼主| 发表于 2013-3-26 12:09:07 | 显示全部楼层
liuzhiyu123 发表于 2013-3-26 08:00
这里有您需要的 http://bbs.osgchina.org/forum.php?mod=viewthread&tid=9230&extra=page%3D1

嗯,我就是沿着您的代码路线做的开发,但是您的代码里面没有注释,有些地方看不明白,主要是 ComputeTrianglesVisitor这个类的功能,里面的方法void ComputeTrianglesVisitor::apply( osg::Geode& node )和void ComputeTrianglesVisitor::applyDrawable( osg:rawable* drawable )也看不懂。

该用户从未签到

发表于 2013-3-26 12:14:06 | 显示全部楼层
Arturia 发表于 2013-3-26 12:09
嗯,我就是沿着您的代码路线做的开发,但是您的代码里面没有注释,有些地方看不明白,主要是 ComputeTria ...

哦,那个文件是直接使用osgPhysics中的,应该没什么太大的难度吧?遍历到的matrixtrnasform 进行累计,然后对访问到的Geometry使用仿函数获得顶点数据,然后让累计的矩阵数据与之相乘,其实就是把局部坐标系下的点 全部 转换到顶层 坐标系

该用户从未签到

 楼主| 发表于 2013-3-26 22:35:14 | 显示全部楼层
liuzhiyu123 发表于 2013-3-26 12:14
哦,那个文件是直接使用osgPhysics中的,应该没什么太大的难度吧?遍历到的matrixtrnasform 进行累计,然 ...

osg::TriangleIndexFunctor<CollectTriangleIndicesFunctor> functor;
            functor.indices = _indices.get();
            functor.base = numVertices;
            drawable->accept( functor );这一步是什么原理呢?我猜到应该是给functor内部的索引传值,但是原理是什么,我搞不清楚,还有osg::TriangleIndexFunctor<CollectTriangleIndicesFunctor>也看不懂。CollectTriangleIndicesFunctor里面的那个函数是根据base的值来入栈索引吧。但是,那个函数是被谁调用的?

我实在搞不清楚这些原理,感觉和visitor相似,但是,却又有些不一样。

还有就是,假如我在创建geometry的时候没有设置索引,还能提取的索引么?


这个是我的建立geometry函数
osg::Geometry* CreatGeometry(
        vaar_data::Component* component,
        const osg::Vec4f color
) {
        osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
       
        geometry->setVertexArray(component->GetRefPtrTriangles().get());得到三角面片的顶点数组
        geometry->setNormalArray(component->GetRefPtrNormals().get());法线
        geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);包围盒

        osg::ref_ptr<osg::Vec4Array> color_array = new osg::Vec4Array;颜色
        color_array->push_back(color);
        geometry->setColorArray(color_array.get());
        geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
        //color_array->push_back(osg::Vec4(1.0, 0.0, 0.0, 1.0));
        //color_array->push_back(osg::Vec4(0.0, 1.0, 0.0, 1.0));
        //color_array->push_back(osg::Vec4(0.0, 0.0, 1.0, 1.0));
        //geometry->setColorArray(color_array.get());
        //geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

        geometry->addPrimitiveSet(
                new osg:rawArrays(osg:rimitiveSet::TRIANGLES, 0, component->GetRefPtrTriangles()->size())
        );
        osg::PrimitiveSet* gg=geometry->getPrimitiveSet(0);
       我想在这里建立一个bullet的碰撞模型,这个怎么做好呢,请务必给我个方向。


        //osg::DrawElements* ee=gg->getDrawElements();
        return geometry.release();
} // CreatGeometry

            

该用户从未签到

发表于 2013-3-27 07:43:49 | 显示全部楼层
Arturia 发表于 2013-3-26 22:35
osg::TriangleIndexFunctor functor;
            functor.indices = _indices.get();
            fu ...

建议您还是看一下源码,里面已经写得很清楚了osg::TriangleIndexFunctor 没什么难度

该用户从未签到

 楼主| 发表于 2013-3-28 21:29:57 | 显示全部楼层
liuzhiyu123 发表于 2013-3-27 07:43
建议您还是看一下源码,里面已经写得很清楚了osg::TriangleIndexFunctor 没什么难度

我已经看完了那些源码,不过我是个新手(刚开始做不到3个月),可能很多问题很傻,请多多包涵。
我还有个想问的就是,如果我在建立模型的时候没有使用索引,而是直接使用顶点数组进行渲染的话,是不是不能提取到索引呢?OSG会不会自己建立默认索引?

如果OSG没有建立索引,那么是不是我可以自己建立索引,这样是不是可以跳过osg::TriangleIndexFunctor这一步,直接调用bullet函数建立碰撞模型?

该用户从未签到

发表于 2013-3-29 07:41:51 | 显示全部楼层
Arturia 发表于 2013-3-28 21:29
我已经看完了那些源码,不过我是个新手(刚开始做不到3个月),可能很多问题很傻,请多多包涵。
我还有个 ...

当然可以,创建物理模型 就需要顶点 和相应的 索引 既然您都知道 那么就没必要在处理一遍模型了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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