OSG学习:几何体的操作(一)——交互事件、简化几何体
发布日期:2025-05-01 06:29:16 浏览次数:2 分类:技术文章

本文共 2229 字,大约阅读时间需要 7 分钟。

以下内容来自: 

1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社 

2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社

3、自己的总结

创建C++项目后,首先需要配置OSG环境,具体步骤看第六步:新建OSG项目测试。

 

首先重新来看一下场景的构成:基本的绘图基元——场景:

基本的绘图基元——简单的几何体——复杂的几何体——复杂的场景。

对几何体进行适当地修改,可以提高渲染效率。这些操作都由osgUtil库提供,主要有、生成法线osgUtil::SmoothingVisitor()、、条带化osgUtil::TriStripVisitor等。

 

本篇文章解析简化几何体的方法:

osgUtil::Simplifier类继承自osg::NodeVisitor类,以访问器的方式遍历几何体并对其进行简化处理。

这个简化方法使用边塌陷算法,该算法我没有详细了解,可以看一看这篇文章:。

 

根据代码来了解使用方法:

// stdafx.h #include 
//节点类#include
//是个几何节点,可以说是一个几何Group节点,一般的可绘制几何体都是通过它来传向root进行渲染,是OSG几何绘制的最高管理节点#include
//对节点起到组织作用,一般作为父节点或者根节点出现#include
//位置变换节点类,提供模型的位置变换、大小缩放、原点位置的设置、坐标系的变换#include
#include
#include
#include
//事件监听#include
//事件响应类,对渲染状态进行控制#include
//优化器#include
//简化几何体
//.cpp/*加载一个模型深拷贝该模型到其他地方对深拷贝的模型进行简化将两个模型添加到叶节点对场景进行优化显示模型按w键显示网格化模型,可以看出网格密度不同按t键显示去表皮模型,可以看出模型相同*///读取模型osg::Node *readModel(){	osg::ref_ptr
node = osgDB::readNodeFile("cow.osg"); return node.release();}//深拷贝并简化新模型osg::Node *deepCopy(osg::Node *node){ /* 创建简化对象 simplifier(sampleRatio, maxError) 参数:样本比率、点的误差或边的长度 样本比率<1 设置点的误差 样本比率>1 设置边的长度限制 比率越大,简化越少 使用的是边塌陷算法 */ float sampleRatio = 0.3f; float maxError = 4.0f; osgUtil::Simplifier simplifier(sampleRatio, maxError); //深拷贝 osg::ref_ptr
deepnode = (osg::Node *)(node->clone(osg::CopyOp::DEEP_COPY_ALL)); //创建一个位置变换节点,将之设置为新位置,将深拷贝的模型移到新位置 osg::ref_ptr
pat = new osg::PositionAttitudeTransform(); pat->setPosition(osg::Vec3(10.0f, 0.0f, 0.0f)); pat->addChild(deepnode); pat->accept(simplifier); return pat.release();}int main(){ //创建一个叶节点对象并添加节点 osg::ref_ptr
root = new osg::Group(); osg::ref_ptr
node1 = readModel(); osg::ref_ptr
node2 = deepCopy(node1); root->addChild(node1); root->addChild(node2); //优化场景数据 osgUtil::Optimizer optimizer; optimizer.optimize(root.get()); //显示模型 osg::ref_ptr
viewer = new osgViewer::Viewer(); //切换网格模式,方便比较 viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet())); viewer->setSceneData(root.get()); viewer->realize(); return viewer->run();}

查看效果:

按w键显示网格模型,可以看出格网密度不同;

按t键显示去皮模型,可以看出无差别。

 

 

上一篇:OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
下一篇:OSG学习:人机交互——普通键盘事件:着火的飞机

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月28日 14时58分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章