当前位置: 首页 > news >正文

专业建站策划餐饮品牌设计网站建设

专业建站策划,餐饮品牌设计网站建设,wordpress采集图片,android app1、简化几何体 在 OSG 中#xff0c;场景都是由基本的绘图基元构成的#xff0c;基本的绘图基元构成简单的几何体#xff0c;简单的几何体构成复杂的几何体#xff0c;复杂的几何体最终构造成复杂的场景。当多个几何体组合时#xff0c;可能 存在多种降低场景渲染效率的原…1、简化几何体 在 OSG 中场景都是由基本的绘图基元构成的基本的绘图基元构成简单的几何体简单的几何体构成复杂的几何体复杂的几何体最终构造成复杂的场景。当多个几何体组合时可能 存在多种降低场景渲染效率的原因。在很多 3D 引擎中都提供了对场景的几何体进行修改的操作以达到最优渲染效率。虽然最优渲染效率只是一个理想状态但一定的几何体操作在相当程度上可以提高渲染效率。   在 OSG 中为了获得所需的性能和渲染的效率osgUtil 库提供了一些通用的几何体运算这些几何体运算主要包括 osgUtil::Simplifier简化、osgUtil::SmoothingVisitor生成法线、osgUtil::DelaunayTriangulator生成 Delaunay 三角网工具和 osgUtil::TriStripVisitor条带化等。   下面就来介绍几种常用的几何体操作。 1.1 osgUtil::Simplifier类 简化几何体osgUtil::Simplifier类继承自 osg::NodeVisitor 类它采用访问器的方式遍历几何体并对其进行简化处理在后面的章节将会详细说明访问器的工作机制。osgUtil::Simplifier 类对几何体的简化主要需要设置两个方面的参数即当几何体样本比率小于 1时设置点的误差限制当几何体的样本比率大于 1 时设置边的长度限制。通过对点的误差或者边的长度的限制简化不必要的点和边然后通过平滑处理和条带化渲染几何体进而达到提高渲染效率的目的也可以用于自动生成低层次模型。一般来说样本比率越大简化越少样本比率越小简化越多。优化可以直接调用下面的函数 virtual void apply(osg::Geode geode) //应用于叶节点 void simplify(osg::Geometry geometry)//简化几何体这两个函数同样可用于 osg::Node 节点不过关联实例时需要使用 accept()方法。osgUtil::Simplifier 简化采用的是边塌陷算法。 1.2 实例 1.3 实例源码 // OSGExamples.cpp : 定义控制台应用程序的入口点。 //#include stdafx.h#include windows.h #include osgViewer/Viewer#include osg/Node #include osg/Geode #include osg/Geometry #include osg/Group #include osg/Billboard #include osg/Texture2D #include osg/Image #include osg/Vec3 #include osg/Vec2 #include osg/PositionAttitudeTransform #include osg/MatrixTransform #include osgDB/ReadFile #include osgUtil/Optimizer#include osgViewer/ViewerEventHandlers //事件监听 #include osgGA/StateSetManipulator //事件响应类对渲染状态进行控制 #include osgUtil/Simplifier //简化几何体#pragma comment(lib, OpenThreadsd.lib) #pragma comment(lib, osgd.lib) #pragma comment(lib, osgDBd.lib) #pragma comment(lib, osgUtild.lib) #pragma comment(lib, osgGAd.lib) #pragma comment(lib, osgViewerd.lib) #pragma comment(lib, osgTextd.lib)//读取模型 osg::Node *readModel() {osg::ref_ptrosg::Node 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_ptrosg::Node deepnode (osg::Node *)(node-clone(osg::CopyOp::DEEP_COPY_ALL));//创建一个位置变换节点,将之设置为新位置将深拷贝的模型移到新位置osg::ref_ptrosg::PositionAttitudeTransform 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_ptrosg::Group root new osg::Group();osg::ref_ptrosg::Node node1 readModel();osg::ref_ptrosg::Node node2 deepCopy(node1);root-addChild(node1);root-addChild(node2);//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());//显示模型osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer();//切换网格模式方便比较viewer-addEventHandler(new osgGA::StateSetManipulator(viewer-getCamera()-getOrCreateStateSet()));viewer-addEventHandler(new osgViewer::StatsHandler());//实现状态信息统计viewer-addEventHandler(new osgViewer::WindowSizeHandler());viewer-setSceneData(root.get());viewer-realize();return viewer-run(); }2、Delaunay 三角网绘制 在数字地形建模中不规则三角网TIN通过从不规则离散分布的数据点生成的连续三角面来逼近地形表面。就表达地形信息的角度而言TIN 模型的优点是它能以不同层次的分辨率来描述地形表面。与格网数据模型相比TIN 模型在某一特定分辨率下能用更少的空间和时间更精确地表示更加复杂的表面。特别是当地形包含有大量特征如断裂线、构造线时TIN 模型能更好地顾及这些特征从而能更精确合理地表达地表形态。 对于 TIN 模型其基本要求有以下 3 点 1TIN 是唯一的。 2力求最佳三角形几何形状。 3保证最邻近的点构成三角形。   在所有可能的三角网中狄洛尼Delaunay三角网在地形拟合方面表现最为出色常用于 TIN的生成。当不相交的断裂线等被作为预先定义的限制条件作用于 TIN 的生成当中时就必须考虑带约束条件的狄洛尼三角网。   目前狄洛尼三角网生成的算法比较多传统的算法主要包括两种即 Lawson 算法以及Bowyer-Watson 算法。后来经过该传统算法改进的算法就多了这里不专门对这些算法予以介绍可参考相关论文。上面介绍了狄洛尼Delaunay三角网的特性、生成算法及应用下面来看一下 OSG 中的狄洛尼三角网。 2.1 osgUtil::DelaunayTriangulator 类 osgUtil::DelaunayTriangulator 类直接继承自 osg::Referenced 类创建狄洛尼三角网有如下 3 个步骤 1创建顶点数组。 2创建一个 osgUtil::DelaunayTriangulator 对象并初始化顶点数组同时生成三角网**程序代码如下 bool triangulate()//开始生成三角网格3创建一个几何体对象把 osgUtil::DelaunayTriangulator 类对象生成的绘制图元加入到几何体中。在生成狄洛尼三角网时还可以添加一些限制条件限制条件可以是点、线或多边形例如 void addInputConstraint(DelaunayConstraint *dc)//添加限制条件2.2 三角带绘制 三角带绘制osgUtil::TriStripVisitor类继承自 osgUtil::BaseOptimizerVisitor 类它采用访问器的机制遍历场景中的几何体实现三角带绘制以提高渲染效率。   下面对 osgUtil::TriStripVisitor 的两个常用成员函数予以说明 void stripify(osg::Geometry drawable)//条带化几何体 virtual void apply(osg::Geode geode)//应用于叶节点从上面可以看出它同样可应用于叶节点。值得注意的是关联叶节点实例时需要调用 accept() 方法。   大多数图形卡并不直接支持索引三角网。在渲染三角形时一般是将 3 个顶点同时提交这样共享的顶点会多次提交三角形用到一次就提交一次。因为内存和图形硬件间的数据传输是瓶颈所以很多 API 和硬件支持特殊的三角网格式以减少传输量。基本思想是排序点和面使显卡中已有的三角形不需要再次传输。   这里我们只讨论三角带三角带是一个三角形列表其中每个三角形都与前一个三角形共享一边。在一种最理想的状态下三角带可以用 N2 个顶点表示存储 N 个面。N 很大时每个三角形平均发送一个顶点。在实践中很多情况下很多网格是一个三角带无法表达的此时就需要多个三角带来联合绘制。因为我们希望最小化发往图形卡的顶点数所以三角带的数目应该尽可能得少即三角带越长越好。从另一个方面来说分别渲染两个长度为 N 的三角带所需要的时间比渲染一个长度为2N 的三角带要长即使 2N 的三角带中三角形的个数多于两个分开的三角带中的三角形个数的和因为建立各三角带需要额外的处理时间。 2.3 实例效果 2.4 源码 #include windows.h #include osgViewer/Viewer#include osg/Node #include osg/Geode #include osg/Geometry #include osg/Group #include osg/Billboard #include osg/Texture2D #include osg/Image #include osg/Vec3 #include osg/Vec2 #include osg/PositionAttitudeTransform #include osg/MatrixTransform #include osgDB/ReadFile #include osgUtil/Optimizer#include osgViewer/ViewerEventHandlers //事件监听 #include osgGA/StateSetManipulator //事件响应类对渲染状态进行控制 #include osgUtil/Simplifier //简化几何体 #include osgUtil/DelaunayTriangulator #pragma comment(lib, OpenThreadsd.lib) #pragma comment(lib, osgd.lib) #pragma comment(lib, osgDBd.lib) #pragma comment(lib, osgUtild.lib) #pragma comment(lib, osgGAd.lib) #pragma comment(lib, osgViewerd.lib) #pragma comment(lib, osgTextd.lib)//Delaunay三角形 /* 创建顶点数组并添加数据 设置其他相关属性可选 创建osgUtil::DelaunayTriangulator类对象并生成三角网 创建几何体对象把三角网类对象生成的绘制图元添加到几何体中 按w键显示网格化模型可以看出网格密度不同 由于光照条件默认开启旋转模型可以看出不同部位亮度显示不同 按l键显示关闭光照旋转模型可以看出亮度不变 */int GetRandValue(int nMIN, int nMAX) {int nMax 1;nMax RAND_MAX;//rand()函数随机数的最大值return (int)(rand() * (nMAX - nMIN) / nMax nMIN); }osg::ref_ptr osg::Geode createTriangulate() {//创建顶点数组osg::ref_ptrosg::Vec3Array coords new osg::Vec3Array();//添加顶点数据int nMin -50;int nMax 100;for (int i -3000; i 3000; i 100){if (i -1000){nMin -100;nMax 100;}else if (i -1000 i 0){nMin -60;nMax 30;}else if (i 0 i 500){nMin -15;nMax 10;}else if (i 500 i 1000){nMin -10;nMax 10;}else if (i 1000 i 1500){nMin -20;nMax 10;}else if (i 15000){nMin -80;nMax 50;}for (int j -3000; j 3000; j 100){float nZ (float)GetRandValue(nMin, nMax);osg::Vec3 vertex(i, j, nZ);coords-push_back(vertex);}}//创建颜色数组osg::ref_ptrosg::Vec4Array color new osg::Vec4Array();//添加颜色数据 for (unsigned int i 0; i 6000; i){int nR rand() % 10 2;color-push_back(osg::Vec4(0.0f, (double)nR / 10.0, 0.0f, 0.5f));}//创建Delaunay三角网对象osg::ref_ptrosgUtil::DelaunayTriangulator dt new osgUtil::DelaunayTriangulator(coords.get());//生成三角网dt-triangulate();//创建几何体osg::ref_ptrosg::Geometry pGeometry new osg::Geometry();//设置顶点数组pGeometry-setVertexArray(coords.get());//设置颜色数组pGeometry-setColorArray(color.get());//设置颜色的绑定方式为单个顶点pGeometry-setColorBinding(osg::Geometry::BIND_PER_VERTEX);//添加到绘图基元pGeometry-addPrimitiveSet(dt-getTriangles());osg::ref_ptr osg::Geode pGNode new osg::Geode;pGNode-addChild(pGeometry);return pGNode.release(); }int main() {//添加到根节点osg::ref_ptrosg::Group root new osg::Group();root-addChild(createTriangulate());//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer();//方便查看在多边形之间切换以查看三角网viewer-addEventHandler(new osgGA::StateSetManipulator(viewer-getCamera()-getOrCreateStateSet()));viewer-addEventHandler(new osgViewer::StatsHandler());viewer-addEventHandler(new osgViewer::WindowSizeHandler());viewer-setSceneData(root.get());viewer-setUpViewInWindow(600, 600, 1000, 800);return viewer-run(); }3、自动生成顶点法向量 生成顶点法向量osgUtil::SmoothingVisitor类继承自 osg::NodeVisitor 类它采用访问器机制遍历场景中的几何体生成顶点法向量。 下面对 osgUtil::SmoothingVisitor 的一个常用成员函数予以说明 static void smooth(osg::Geometry geoset)该函数用于生成顶点法向量调用时需要注意这是一个静态函数。在很多应用程序中网格上的各点都需要一个表面法向量它的用处非常广泛例如 计算光照。 背面剔除。 模拟粒子系统在表面的“弹跳”效果。 通过只需要正面而加速碰撞检测。   通常我们在绘制几何体时都会指定法线。当得到一个模型它本身并没有法向量时则有必要通过现有的数据生成。通常表面法向量可能保存于三角形级或顶点级其中的一个技巧就是平均相邻三角形的表面法向量并将结果标准化。当然这要求知道三角形的法向量。一般可以这样假设三角形的顶点按逆时针排列通过叉积就可以计算外表面的法向量。当然在有些情况下顶点的顺序是未知且比较混乱的这样就比较麻烦了。这个笔者也没有仔细深入研究推荐读者看一下《计算非固定结构序列的多边形的顶点法线》这篇论文。通过平均三角形法向量求得顶点法向量是一种经验性的方法不具有通用性。虽然在很多情况下都可以正确地工作但有些情况下还是无法正常使用的在使用布告板时一定要注意这点这时生成顶点法线的方法就会失效。因为布告板由两个三角形背靠构造而成它的两个法向量是相反的其平均值为 0所以不能初始化这时只能采用别的方法来处理如“双面”三角形等。 4、OSG生成三维高程地形 结合以上知识我们可以加入纹理制作一个三维地形文件。 4.1 地形效果 4.2 源码 #include windows.h #include osgViewer/Viewer#include osg/Node #include osg/Geode #include osg/Geometry #include osg/Group #include osg/Billboard #include osg/Texture2D #include osg/Image #include osg/Vec3 #include osg/Vec2 #include osg/PositionAttitudeTransform #include osg/MatrixTransform #include osgDB/ReadFile #include osgUtil/Optimizer#include osgViewer/ViewerEventHandlers //事件监听 #include osgGA/StateSetManipulator //事件响应类对渲染状态进行控制 #include osgUtil/Simplifier //简化几何体 #include osgUtil/DelaunayTriangulator #include osgUtil/TriStripVisitor #include osgUtil/SmoothingVisitor#pragma comment(lib, OpenThreadsd.lib) #pragma comment(lib, osgd.lib) #pragma comment(lib, osgDBd.lib) #pragma comment(lib, osgUtild.lib) #pragma comment(lib, osgGAd.lib) #pragma comment(lib, osgViewerd.lib) #pragma comment(lib, osgTextd.lib)//Delaunay三角形 /* 创建顶点数组并添加数据 设置其他相关属性可选 创建osgUtil::DelaunayTriangulator类对象并生成三角网 创建几何体对象把三角网类对象生成的绘制图元添加到几何体中 按w键显示网格化模型可以看出网格密度不同 由于光照条件默认开启旋转模型可以看出不同部位亮度显示不同 按l键显示关闭光照旋转模型可以看出亮度不变 */int GetRandValue(int nMIN, int nMAX) {int nMax 1;nMax RAND_MAX;//rand()函数随机数的最大值return (int)(rand() * (nMAX - nMIN) / nMax nMIN); }osg::ref_ptr osg::Geometry createTriangulate() {//创建顶点数组osg::ref_ptrosg::Vec3Array verTexs new osg::Vec3Array();//添加顶点数据int nMin -50;int nMax 100;for (int i -3000; i 3000; i 100){if (i -1000){nMin -100;nMax 100;}else if (i -1000 i 0){nMin -60;nMax 30;}else if (i 0 i 500){nMin -15;nMax 10;}else if (i 500 i 1000){nMin -10;nMax 10;}else if (i 1000 i 1500){nMin -20;nMax 10;}else if (i 15000){nMin -80;nMax 50;}for (int j -3000; j 3000; j 100){float nZ (float)GetRandValue(nMin, nMax);osg::Vec3 vertex(i, j, nZ);verTexs-push_back(vertex);}}//创建颜色数组osg::ref_ptrosg::Vec4Array color new osg::Vec4Array();//添加颜色数据 for (unsigned int i 0; i 6000; i){int nR rand() % 10 2;color-push_back(osg::Vec4(0.0f, (double)nR / 10.0, 0.0f, 0.5f));}//创建Delaunay三角网对象osg::ref_ptrosgUtil::DelaunayTriangulator dt new osgUtil::DelaunayTriangulator(verTexs.get());//生成三角网dt-triangulate();//创建几何体osg::ref_ptrosg::Geometry pGeometry new osg::Geometry();//设置顶点数组pGeometry-setVertexArray(verTexs.get());osg::ref_ptrosg::Image sImagePath osgDB::readImageFile(D:\\Terrain.png);if (sImagePath.get()){osg::ref_ptrosg::Texture2D texture2D new osg::Texture2D;texture2D-setImage(sImagePath.get());//绑定纹理后释放内部的ref_ptrImage删除image图像texture2D-setUnRefImageDataAfterApply(true);//建立纹理顶点osg::ref_ptrosg::Vec2Array pVec2Array new osg::Vec2Array;for (int i -3000; i 3000; i 100){for (int j -3000; j 3000; j 100){osg::Vec2 textCoord(0.0, 0.0);textCoord.x() (double)(j 3000.0) / 6000.0;textCoord.y() (double)(i 3000.0) / 6000.0;pVec2Array-push_back(textCoord);}}//Texture类关联到渲染状态StateSetosg::ref_ptrosg::StateSet pStateSet pGeometry-getOrCreateStateSet();//将纹理关联给StateSet纹理单元0、osg::StateAttribute::OFF关闭纹理pStateSet-setTextureAttributeAndModes(0, texture2D.get(), osg::StateAttribute::ON);pGeometry-setTexCoordArray(0, pVec2Array.get());//建立法线数组normal,垂直于Z轴负方向//osg::ref_ptrosg::Vec3Array pVec3ArrayNormal new osg::Vec3Array;//pGeometry-setNormalArray(pVec3ArrayNormal.get());//pGeometry-setNormalBinding(osg::Geometry::BIND_OVERALL);//pVec3ArrayNormal-push_back(osg::Vec3(0.0, 0.0, 1.0));pGeometry-setStateSet(pStateSet);}else{//设置颜色数组pGeometry-setColorArray(color.get());//设置颜色的绑定方式为单个顶点pGeometry-setColorBinding(osg::Geometry::BIND_PER_VERTEX);}//添加到绘图基元pGeometry-addPrimitiveSet(dt-getTriangles());return pGeometry.release(); }int main() {//添加到根节点osg::ref_ptrosg::Group root new osg::Group();osg::ref_ptr osg::Geode pGNode new osg::Geode;//创建一个几何体对象osg::ref_ptrosg::Geometry geometry createTriangulate();//自动生成顶点法线osgUtil::SmoothingVisitor::smooth(*(geometry.get()));//对几何体进行条带化osgUtil::TriStripVisitor stripper;stripper.stripify(*(geometry.get()));pGNode-addChild(geometry.get());root-addChild(pGNode);//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer();//方便查看在多边形之间切换以查看三角网viewer-addEventHandler(new osgGA::StateSetManipulator(viewer-getCamera()-getOrCreateStateSet()));viewer-addEventHandler(new osgViewer::StatsHandler());viewer-addEventHandler(new osgViewer::WindowSizeHandler());viewer-setSceneData(root.get());viewer-setUpViewInWindow(600, 600, 1000, 800);return viewer-run(); }
http://www.pierceye.com/news/399791/

相关文章:

  • 洛阳专业网站设计开发制作建站公司零陵区住房和城乡建设局网站
  • 在哪里可以学做网站游戏开发大亨下载
  • 找人做ps的网站无锡 做公司网站
  • 云速建站可以建个人网站吗wordpress仿站难吗
  • 如何取外贸网站域名凡科h5制作教程
  • 蜘蛛不抓取网站的原因中山h5网站建设
  • 百度免费推广网站建网站用的免费软件
  • 网站建设西安哪里好广州做企业网站的公司
  • 汉中市网站建设爱墙 网站怎么做
  • 失物招领网站开发项目需求分析搭建外文网站
  • 免费网站空间免备案自学php做网站
  • 南宁网站建设nnit30郴州市第一职业中专
  • 想开个影视网站 那有做的莱芜信息平台
  • js做网站登录有服务器了怎么做网站
  • 郑州餐饮网站建设哪家好零基础网站建设教学在哪里
  • 讲述做网站的电影建设工程公司名字大全
  • 易语言可以做网站管理系统吗网站备案查询工信部手机版
  • 珠海建站论坛淘宝客网站做一种还是做好几种
  • 杭州公司的网站建设公司教育网站制作运营
  • 福州手游网站建设长春火车站停运了吗
  • wordpress仿站博客视频教程建筑模板哪种好
  • 手机配件网站模板雇主品牌建设
  • 列车营销网站怎么做网站 审批号
  • 嘉定公司网站设计游仙建设局官方网站
  • 青山做网站西安十大网站制作公司
  • 网站服务器租用一年多少钱啊seo优化检测
  • 北京网站建设联系电话长春市网络科技有限公司
  • 软件下载网站免费大全济宁医院网站建设
  • 龙岩到永定株洲网站推广优化
  • 个人网站建设研究意义朔州seo网站建设