OpenSceneGraph 笔记–如何导出三角形数据
在OpenSceneGraph开发中,为了方便会经常使用到一些不是三角形片的数据,比如四边形等数据。例如画一个管子用四边形带比用三角形片好计算得多。比如现在我们要画一个由两个平面组成的面,我可以这样做:
osg::Geometry* polyGeom = new osg::Geometry;
osg::Vec3 myCoords[]=
{
osg::Vec3(0,1,0),
osg::Vec3(0,0,0),
osg::Vec3(1,1,0),
osg::Vec3(1,0,0),
osg::Vec3(2,1,0),
osg::Vec3(2,0,0)
};
int numCoords = sizeof(myCoords)/sizeof(osg::Vec3);
osg::Vec3Array* vertices = new osg::Vec3Array(numCoords,myCoords);
polyGeom->setVertexArray(vertices);
polyGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUAD_STRIP,0,numCoords));
geode->addDrawable(polyGeom);
这样就用6个点,用OpenGL提供的QUAD_STRIP方式画出了两个平面。
但是如果要把这个平面用于碰撞检测等技术,那么就需要把这六个点所表示的四边形带转换成三角形片才行。这些三角形定点如下:
0 1 0
0 0 0
1 1 0
0 0 0
1 0 0
1 1 0
1 1 0
1 0 0
2 1 0
1 0 0
2 0 0
2 1 0
可以看出两个平面由4个三角形组成,而且都是逆时针排列(朝向一致)。
以前我自己做过转换,但是感觉很麻烦。OpenSceneGraph的Example osggeometry中提供了一个printTriangles函数,它可以打印出一个drawable所有的三角形片,不管最初的数据结构如何:
{
void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const
{
osg::Vec3 normal = (v2-v1)^(v3-v2);
normal.normalize();
std::cout << "\t("<<v1<<") ("<<v2<<") ("<<v3<<") "<<") normal ("<<normal<<")"<<std::endl;
}
};
// decompose Drawable primtives into triangles, print out these triangles and computed normals.
void printTriangles(const std::string& name, osg::Drawable& drawable)
{
std::cout<<name<<std::endl;
osg::TriangleFunctor<NormalPrint> tf;
drawable.accept(tf);
std::cout<<std::endl;
}
核心的思想就是利用osg::TriangleFunctor这个模版。这个模版会让你重载()运算符,然后让Drawable去visit它。在这个过程中,所有原始的数据(不管是三角形片的,还是四边形的)都转换成了三角形片数据。
那么如何把三角形数据导出哪?只需要修改一下借助这个思路,将NormalPrint修改成我们需要的就对了。
{
void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const
{
vertexList->push_back(v1);
vertexList->push_back(v2);
vertexList->push_back(v3);
}
osg::Vec3Array* vertexList;
};
void getTriangles(osg::Drawable& drawable)
{
osg::TriangleFunctor<GetVertex> tf;
tf.vertexList=new osg::Vec3Array;
drawable.accept(tf);
for(osg::Vec3Array::iterator itr=tf.vertexList->begin();
itr!=tf.vertexList->end();
itr++)
{
osg::Vec3 vertex=*itr;
std::cout<<vertex<<std::endl;
}
std::cout<<std::endl;
}
以下是完整的示例文件:
// PrimitiveSet.cpp : 定义控制台应用程序的入口点。
//
#include " stdafx.h "
#include < iostream >
struct GetVertex
{
void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const
{
vertexList->push_back(v1);
vertexList->push_back(v2);
vertexList->push_back(v3);
}
osg::Vec3Array* vertexList;
};
void getTriangles(osg::Drawable& drawable)
{
osg::TriangleFunctor<GetVertex> tf;
tf.vertexList=new osg::Vec3Array;
drawable.accept(tf);
for(osg::Vec3Array::iterator itr=tf.vertexList->begin();
itr!=tf.vertexList->end();
itr++)
{
osg::Vec3 vertex=*itr;
std::cout<<vertex<<std::endl;
}
std::cout<<std::endl;
}
osg::Node* createGeode()
{
osg::Geode* geode=new osg::Geode;
osg::Geometry* polyGeom = new osg::Geometry;
osg::Vec3 myCoords[]=
{
osg::Vec3(0,1,0),
osg::Vec3(0,0,0),
osg::Vec3(1,1,0),
osg::Vec3(1,0,0),
osg::Vec3(2,1,0),
osg::Vec3(2,0,0)
};
int numCoords = sizeof(myCoords)/sizeof(osg::Vec3);
osg::Vec3Array* vertices = new osg::Vec3Array(numCoords,myCoords);
polyGeom->setVertexArray(vertices);
polyGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUAD_STRIP,0,numCoords));
geode->addDrawable(polyGeom);
getTriangles(*polyGeom);
return geode;
}
int _tmain(int argc, _TCHAR* argv[])
{
//Set up viewer
osgViewer::Viewer viewer;
osg::ref_ptr<osg::GraphicsContext::Traits> traits=new osg::GraphicsContext::Traits;
traits->x=200;
traits->y=200;
traits->width=800;
traits->height=600;
traits->windowDecoration=true;
traits->doubleBuffer=true;
traits->sharedContext=0;
osg::ref_ptr<osg::GraphicsContext> gc=osg::GraphicsContext::createGraphicsContext(traits.get());
osg::ref_ptr<osg::Camera> camera=new osg::Camera;
//osg::Camera camera=new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new osg::Viewport(0,0,traits->width,traits->height));
camera->setDrawBuffer(GL_BACK);
camera->setReadBuffer(GL_BACK);
osgGA::TrackballManipulator* tm=new osgGA::TrackballManipulator;
viewer.setCameraManipulator(tm);
viewer.addSlave(camera.get());
//Set up root node
osg::ref_ptr<osg::Group> root=new osg::Group;
root->addChild(createGeode());
//Start show!
viewer.setSceneData(root.get());
viewer.realize();
while(!viewer.done())
{
viewer.frame();
}
}
OpenSceneGraph 笔记–如何导出三角形数据相关推荐
- OpenSceneGraph 笔记--如何导出三角形数据
在OpenSceneGraph开发中,为了方便会经常使用到一些不是三角形片的数据,比如四边形等数据.例如画一个管子用四边形带比用三角形片好计算得多.比如现在我们要画一个由两个平面组成的面,我可以这样做 ...
- oracle 11g dul,学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中
试验模拟导出Oracle 11G数据库中数据文件坏块中表中的数据 以前一直以为dul对应的版本只能恢复最高的数据库版本一致,今天测试发现dul 10可以恢复11g最新版的数据库. 模拟环境SQL> ...
- 数据导不进oracle数据库,学习笔记:Oracle逻辑导出/导入 数据逻辑导出时跳过指定表不进行导出...
天萃荷净 Oracle数据库逻辑exp导出时,跳过指定某些表,对其表中数据不进行导出 有一个需求,某个用户有很多张表,但是只能使用exp导出,而且想跳过其中某几张表,其他对象包括依赖关系都需要.针对这 ...
- Neo4J入门笔记[2]---导出数据为CSV
在上一节<Neo4J入门笔记[1]-安装以及Cypher基本语法> 笔者主要分享了Neo4J的安装已经常用的命令.这个章节笔者分享从Neo4j里面导出数据到CSV.一个简单的方法,就是调用 ...
- php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例
这篇文章主要为大家详细介绍了PHP导出MySQL数据到Excel文件简单示例,具有一定的参考价值,可以用来参考一下. 对phpPHP导出MySQL数据到Excel文件简单示例感兴趣的小伙伴,下面一起跟 ...
- mysql dump hbase_导出mysqldump数据
mysql备份,备份数据,数据库,表结构 mysql mysqldump 这里我的数据库先叫做xmen; 备份数据库 代码如下: #mysqldump 数据库名 >数据库备份名 #mysqld ...
- R学习笔记(4): 使用外部数据
来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...
- oracle11g 使用数据泵导出导入数据
oracle11g 使用数据泵导出导入数据 终于搞定了 快写个笔记 记录下. 删除用户的时候提示已经登录了不能删除,这个需要把登录的session结束掉. select username,sid,se ...
- Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法
Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...
最新文章
- 为什么batchnormalize 有效
- verilog for循环_HDLBits:在线学习 Verilog (二十四 · Problem 115-119)
- 并行批处理多个文件 matlab
- Java并发编程之ConcurrentHashMap原理解析
- ahp层次分析法软件
- .NET Core全面扫盲贴
- C/C++[codeup 1962]单词替换
- 渤海银行天津分行计算机笔试,关于渤海银行笔试经验分享
- 完全支持双层PDF 开源的PDF分离与合并软件 C 版本 转自codeproject
- 北京邮电大学计算机院专业录取分数线,2017年北京邮电大学计算机科学与技术专业在北京录取分数线...
- html、css 实现网页弹出层
- 怎样批量给pdf文件添加水印?
- 后台管理系统项目整体流程
- 在位6年,谷歌GO语言负责人离职!曾带MongoDB、Docker走向辉煌
- 报名信息填写完成! 您的报名号请牢记!
- 为什么嵌入式有趣_为什么眼动如此有趣
- 杰信项目第五天(合同复制+合同查看+出货表)
- nginx 上传文件漏洞_文件上传漏洞,解析漏洞总结
- VirtualBox 错误代码0x80004005解决办法
- 大机群作战态势保障_无人机与巡航导弹自主协同作战模式及关键技术
热门文章
- php去除英文和标点,php 过滤英文标点符号及过滤中文标点符号代码_php技巧
- centos7 zookeeper3.5.6单机伪集群部署
- vs2010编写的net3.5用vs2008打开
- 苹果ipadwps_ipad可以用wps吗?
- html文本框样式大全,HTML文本框样式大全
- java openssl dgst_(7) openssl dgst(生成和验证数字签名)
- 无法确定当前的订阅失效日期_元器件失效率与失效分布
- 在ASP.NET MVC中实现Select多选
- Visual Studio 2005 Tip:编辑项目文件
- Torque2D MIT 实战记录: 塔防进度(1)