地形平滑算法

2023-11-04

2013-06-20 18:33  2486人阅读  评论(0)  收藏  举报
  分类:
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

拉出来的地下不平滑怎么办,笨办法就是美工一个顶点一个顶点的调整,而且效果还不好。实际上程序只要实现一个完美平滑算法,随便一刷,地形就平滑了。

平滑算法最重要的就是不能改变原来的地形的大概结构,

基本思路,就是和相邻的点取一个混合值。混合公式和alpha混合公式一样。



海滩边岩石的平滑效果非常好。

[cpp]  view plain  copy
  1. #include "SmoothHeightAction.h"  
  2. #include "SceneManipulator.h"  
  3. #include "HitIndicator.h"  
  4. namespace WX {  
  5.   
  6.     //  
  7.   
  8.     SmoothHeightAction::SmoothHeightAction(SceneManipulator* sceneManipulator)  
  9.         : TimeBasedHeightAction(sceneManipulator)  
  10.     {  
  11.     }  
  12.   
  13.     const String& SmoothHeightAction::getName(voidconst  
  14.     {  
  15.         static const String name = "SmoothHeightAction";  
  16.         return name;  
  17.     }  
  18.   
  19.     void SmoothHeightAction::_onBegin(const Point& pt)  
  20.     {  
  21.         TimeBasedHeightAction::_onBegin(pt);  
  22.   
  23.         //computeAverageHeight();  
  24.     }  
  25.   
  26.     void SmoothHeightAction::_onDrag(const Point& pt)  
  27.     {  
  28.         TimeBasedHeightAction::_onDrag(pt);  
  29.   
  30.         //computeAverageHeight();  
  31.     }  
  32.   
  33.     void SmoothHeightAction::computeAverageHeight(void)  
  34.     {  
  35.         //Real totalHeight = 0;  
  36.         //Real totalWeight = 0;  
  37.         //JunctionSelection* selection = static_cast<JunctionSelection*>(  
  38.         //    getSceneManipulator()->_getSelection("JunctionSelection"));  
  39.         //const JunctionSelection::JunctionMap& junctions = selection->getJunctions();  
  40.         //JunctionSelection::JunctionMap::const_iterator it;  
  41.         //for (it = junctions.begin(); it != junctions.end(); ++it)  
  42.         //{  
  43.         //    const JunctionSelection::Junction& junction = it->second;  
  44.         //    totalWeight += junction.weight;  
  45.         //    totalHeight += getTerrainData()->getHeight(junction.x, junction.z) * junction.weight;  
  46.         //}  
  47.         //mAverageHeight = totalWeight ? totalHeight / totalWeight : 0;  
  48.     }  
  49.   
  50.     Real SmoothHeightAction::_computeHeight(const JunctionSelection::Junction& junction, Real seconds)  
  51.     {  
  52.         //Real height = getTerrainData()->getHeight(junction.x, junction.z);  
  53.         //Real diff = mAverageHeight - height;  
  54.         //Real secondsRequest = Ogre::Math::Abs(diff * junction.weight / getSceneManipulator()->_getHeightAdjustSpeed());  
  55.         //if (secondsRequest < seconds)  
  56.         //    return mAverageHeight;  
  57.         //else  
  58.         //    return height + diff * seconds / secondsRequest;  
  59.         return 0;  
  60.     }  
  61.   
  62.     void SmoothHeightAction::_onUpdate(const Point& pt, Real seconds)  
  63.     {  
  64.         // 控制每秒平滑的次数  
  65.         static Real time = 0;  
  66.         time += seconds;  
  67.         if (time > 0.1)  
  68.         {  
  69.             smooth();  
  70.             time = 0;  
  71.         }  
  72.   
  73.         getSceneManipulator()->getHitIndicator("JunctionPoints")->refresh();  
  74.         getSceneManipulator()->getHitIndicator("IntersectPoint")->setHitPoint(pt);  
  75.     }  
  76.   
  77.     void SmoothHeightAction::smooth(void)  
  78.     {  
  79.         // 2012.9.16 luoyinan 实现新的平滑算法,基本思路是和相邻的点取  
  80.         // 一个混合值.再通过多次采样实现完美平滑效果  
  81.   
  82.         JunctionSelection* selection = static_cast<JunctionSelection*>(  
  83.             getSceneManipulator()->_getSelection("JunctionSelection"));  
  84.         //_prepareUpdate(*selection, seconds);  
  85.   
  86.         const JunctionSelection::JunctionMap& junctions = selection->getJunctions();  
  87.         JunctionSelection::JunctionMap::const_iterator it;  
  88.         std::vector<TerrainInfo> terrainInfo;  
  89.   
  90.         float k = 0.98;  
  91.   
  92.         // 从左到右  
  93.         for (it = junctions.begin(); it != junctions.end(); ++it)  
  94.         {  
  95.             const JunctionSelection::Junction& junction = it->second;  
  96.             mModifiedJunctions->add(junction.x, junction.z, 1);  
  97.   
  98.             //  
  99.             if (getTerrainData()->isValidJunction(junction.x-1,junction.z))  
  100.             {  
  101.                 float oldHeight = getTerrainData()->getHeight(junction.x,junction.z);  
  102.                 float newHeight = getTerrainData()->getHeight(junction.x-1,junction.z) * (1-k) + oldHeight * k;  
  103.   
  104.                 TerrainInfo terrInfo;  
  105.                 terrInfo.x = junction.x;  
  106.                 terrInfo.z = junction.z;  
  107.                 terrInfo.oldHeight = junction.height;  
  108.                 terrInfo.nowHeight = newHeight;  
  109.                 terrainInfo.push_back(terrInfo);  
  110.   
  111.                 getTerrainData()->setHeight(junction.x, junction.z, newHeight);  
  112.             }  
  113.         }     
  114.         // 从右到左  
  115.         for (it = junctions.begin(); it != junctions.end(); ++it)  
  116.         {  
  117.             const JunctionSelection::Junction& junction = it->second;  
  118.             mModifiedJunctions->add(junction.x, junction.z, 1);  
  119.   
  120.             //  
  121.             if (getTerrainData()->isValidJunction(junction.x+1,junction.z))  
  122.             {  
  123.                 float oldHeight = getTerrainData()->getHeight(junction.x,junction.z);  
  124.                 float newHeight = getTerrainData()->getHeight(junction.x+1,junction.z) * (1-k) + oldHeight * k;  
  125.   
  126.                 TerrainInfo terrInfo;  
  127.                 terrInfo.x = junction.x;  
  128.                 terrInfo.z = junction.z;  
  129.                 terrInfo.oldHeight = junction.height;  
  130.                 terrInfo.nowHeight = newHeight;  
  131.                 terrainInfo.push_back(terrInfo);  
  132.   
  133.                 getTerrainData()->setHeight(junction.x, junction.z, newHeight);  
  134.             }  
  135.         }     
  136.         // 从上到下  
  137.         for (it = junctions.begin(); it != junctions.end(); ++it)  
  138.         {  
  139.             const JunctionSelection::Junction& junction = it->second;  
  140.             mModifiedJunctions->add(junction.x, junction.z, 1);  
  141.   
  142.             //  
  143.             if (getTerrainData()->isValidJunction(junction.x,junction.z+1))  
  144.             {  
  145.                 float oldHeight = getTerrainData()->getHeight(junction.x,junction.z);  
  146.                 float newHeight = getTerrainData()->getHeight(junction.x,junction.z+1) * (1-k) + oldHeight * k;  
  147.   
  148.                 TerrainInfo terrInfo;  
  149.                 terrInfo.x = junction.x;  
  150.                 terrInfo.z = junction.z;  
  151.                 terrInfo.oldHeight = junction.height;  
  152.                 terrInfo.nowHeight = newHeight;  
  153.                 terrainInfo.push_back(terrInfo);  
  154.   
  155.                 getTerrainData()->setHeight(junction.x, junction.z, newHeight);  
  156.             }  
  157.         }     
  158.         // 从下到上  
  159.         for (it = junctions.begin(); it != junctions.end(); ++it)  
  160.         {  
  161.             const JunctionSelection::Junction& junction = it->second;  
  162.             mModifiedJunctions->add(junction.x, junction.z, 1);  
  163.   
  164.             //  
  165.             if (getTerrainData()->isValidJunction(junction.x,junction.z-1))  
  166.             {  
  167.                 float oldHeight = getTerrainData()->getHeight(junction.x,junction.z);  
  168.                 float newHeight = getTerrainData()->getHeight(junction.x,junction.z-1) * (1-k) + oldHeight * k;  
  169.   
  170.                 TerrainInfo terrInfo;  
  171.                 terrInfo.x = junction.x;  
  172.                 terrInfo.z = junction.z;  
  173.                 terrInfo.oldHeight = junction.height;  
  174.                 terrInfo.nowHeight = newHeight;  
  175.                 terrainInfo.push_back(terrInfo);  
  176.   
  177.                 getTerrainData()->setHeight(junction.x, junction.z, newHeight);  
  178.             }  
  179.         }     
  180.   
  181.         getSceneManipulator()->_fireTerrainHeightChanged(terrainInfo);  
  182.         selection->notifyModified();  
  183.     }  
  184.   
  185. }  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

地形平滑算法 的相关文章

  • Ubuntu运行rviz报错:OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext

    写在前面 笔者的测试环境 xff1a Ubuntu20 04 xff0c ROS noteic 一 问题描述 运行rviz时出现报错 xff1a span class token punctuation span WARN span cla
  • Ogre-渐变背景色(gradient background)的实现

    转载自 xff1a http blog csdn net hefee article details 6287341 背景色在ogre里面是通过ViewPort类中的setBackgroundColour xff08 xff09 这个成员函
  • 纹理(Textures)

    纹理 Textures 原文 Textures 作者 JoeyDeVries 翻译 Django 校对 Geequlim BLumia 我们已经了解到 我们可以为每个顶点使用颜色来增加图形的细节 从而创建出有趣的图像 但是 如果想让图形看起
  • 可编程渲染管线与着色器语言

    可编程渲染管线与着色器语言 Programming pipeline shading language Sampler Direct3D 9 asm ps A sampler is a input pseudo register for a
  • [OGRE]基础教程来四发:来谈一谈地形系统

    OGRE 基础教程来四发 来谈一谈地形系统 标签 OGRE 2013 10 09 17 22 2238人阅读 评论 1 收藏 举报 分类 OGRE 11 版权声明 本文为博主原创文章 未经博主允许不得转载 英文链接如下 http www o
  • 如果XML文件太大(10M),打开方式选择

    用UltraEdit打开 其他的例如Editplus和notepad 根本打不开上百M的文件 一打开就死了
  • tinyxml开发入门

    概述 tinyxml和xercesc一样 提供了完整的dom操作api tinyxml相对比较简单好用 编译连接也不容易出问题 xercesc比较麻烦 非常完整庞大 编译有点麻烦 有内存泄漏 我认为在一般需求完全可以使用tinyxml ti
  • ogre引擎0.12.0抄写记录

    惊喜地发现 文档齐全 可以参考类图抄 C Users Legion Desktop ogre v0 12 0 ogrenew Docs api html hierarchy html 先进行 1 OgreMain 然后 2 RenderSy
  • Ogre学习记录

    Ogre学习记录 Posted on 2008 07 09 15 36 RichardHe 阅读 839 评论 2 编辑 收藏 引用 所属分类 OGRE 1 设计初衷 它设计初衷是完全跨平台的 抽象的接口隐藏了平台相关的细节 它设计初衷是大
  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而
  • Terrain Splatting

    Terrain Splatting 标签 网格优化2010 2011 05 16 16 17 1157人阅读 评论 0 收藏 举报 分类 OGRE 541 图形图像 746 游戏引擎 1651 图形引擎 1594 技术理论 1005 引擎开
  • 地形纹理Splatting技术(翻译)

    地形纹理Splatting技术 翻译 文章来源 http www gamedev net reference articles article2238 asp Texture Splatting in Direct3D Introducti
  • Axiom3D:Ogre地形代码解析

    Axiom3D Ogre地形代码解析 作者 天天不在 发布日期 2014 09 01 20 52 05 我来说两句 0 Tag标签 地形 代码 大致流程 这里简单介绍下 Axiom中采用的Ogre的地形组件的一些概念与如何生成地形 先说下大
  • 转:Ogre TerrainGroup地形赏析

    转 Ogre TerrainGroup地形赏析 1 1 参考 http www ogre3d org tikiwiki tiki index php page Ogre Terrain System http www ogre3d org
  • hlsl register

    https msdn microsoft com en us library dd607359 v VS 85 aspx register Optional keyword for assigning a shader variable t
  • lod地形

    lod地形 2014 05 17 23 29 1471人阅读 评论 0 收藏 举报 分类 图形学 17 OGRE相关 75 目录 http blog sina com cn s blog 5e3213f30100zxet html 最近在看
  • 学习笔记:多重纹理

    学习笔记 多重纹理 2009 09 01 14 20 52 转载 分类 学习笔记 多重纹理 多重纹理就是在渲染一个多边形的时候可以用到多张纹理图 把多张纹理图进行一些颜色的操作 可以达到一些效果 但是多重纹理必须是在显卡支持的情况下 但是还
  • 2021年11月6日-11月12日(ogre抄写+ue4视频,本周35小时,共1035小时,剩8965小时。)

    这周还不错 不但完成了本周学习任务 还完成了本月学习任务 方法就是 拼命抄源码 抄到吐时就再看看Ue4视频教程 内外兼修 可以在未来的日子里这么进行 每天5小时学习 还是进入状态的 5 7 35小时 共1035小时 剩8965小时 另外 去
  • Ogre/Mogre:相机两点透视

    我正在显示一个场景 其中有一些立方体 相机采用的是透视法 一切都很好 但我希望垂直线是平行的 两点透视 http en wikipedia org wiki Perspective graphical 两点透视 从正面观察立方体时 我想要的
  • Ogre g++ 编译时错误

    在ubuntu上 我已经编译并安装了所有的ogre库 但是 当我尝试使用此命令编译教程时 g o otest ogre cpp I pkg config libs cflags OGRE OIS lOgreMain lOI 它输出 tmp

随机推荐

  • IntelliJ IDEA+SpringBoot+Tomcat部署404问题

    因为并行开发 后端一直拿不出接口 我不得不自己做Mock 为了完成网络请求逻辑 我使用Idea做模拟接口 后来发现 使用Idea创建的SpringBoot项目在软件内部的虚拟Tomcat上面可以正常运行 但是因为要做一些WebSocket和
  • 苹果笔记本计算机管理员删除,如何删除一个管理员?

    注销要删除的管理员帐户 再以管理员帐户登入 然后跟下面方法 如果您是管理员 则可以删除您不再想让其可访问电脑的用户 删除用户时 您可以存储该用户的个人文件夹 包含用户的文件和设置 或删除该个人文件夹 选取苹果菜单 gt 系统偏好设置 然后点
  • Python反反爬之JS混淆---动态Cookie(持续更新详细教程)

    写在前面 第一题JS混淆 源码乱码 经过上一题的练习JS混淆 源码乱码 我们已经对JS混淆有了大致的了解 这次我们再来练习一道同类型的题目 只不过这次是动态Cookie 首先 让我们了解一下什么是Cookie Cookie 并不是它的原意
  • lua中的常用字符串处理方法

    对lua中string类库中常用方法总结一二 1 数字和字符串相加减lua自动转换 2 得到字符串的长度 3 string byte 返回字符的内部数字编码 ASCII码 4 string char 返回和参数数量相同长度的字符串 其中每个
  • LeetCode202.快乐数(Python)

    题目 解题思路 运用哈希表 将各个位数进行平方 将得到的数进行判断 如果为1输出True 如果不为1 判断是否重复了 如果重复输出False 如果没有重复 进行各个位数平方 反复以上操作 class Solution def isHappy
  • [转]Smartgit :Remove Discard Delete

    Smartgit Remove Discard Delete https blog csdn net u010272085 article details 85039801 Remove 从仓库中移除选中的文件或目录 可通过Discard还
  • C# this.Invoke()的作用与用法、不阻塞UI界面线程的延时函数

    一 this Invoke 的作用与用法 不阻塞UI界面线程的延时函数 Invoke 的作用是 在应用程序的主线程上执行指定的委托 一般应用 在辅助线程中修改UI线程 主线程 中对象的属性时 调用this Invoke 在多线程编程中 我们
  • CH9-网络编程

    目标 了解HTTP协议通信简介 能够说出什么是HTTP协议 掌握HttpURLConnection的使用方法 能够使用HttpURLConnection访问网络 掌握WebView控件的使用方式 能够使用WebView控件加载不同的网页 掌
  • 机器学习(七):主成分分析PCA降维_Python

    六 PCA主成分分析 降维 github地址 https github com lawlite19 MachineLearning Python 全部代码 1 用处 数据压缩 Data Compression 使程序运行更快 可视化数据 例
  • 【目标检测-YOLO】YOLOv5-5.0v-数据处理(第三篇)

    前文链接 YOLOv5 v5 0 yolov5s网络架构详解 第一篇 星魂非梦的博客 CSDN博客 YOLOv5 5 0v yaml 解析 第二篇 星魂非梦的博客 CSDN博客 1 性能分析 YOLOv5 P6 models 4 outpu
  • 数据隐私与安全在大数据时代的挑战与应对

    文章目录 数据隐私的挑战 数据安全的挑战 应对策略和方法 1 合规和监管 2 加密技术 3 匿名化和脱敏 4 安全意识培训 5 隐私保护技术 结论 个人主页 程序员 小侯 CSDN新晋作者 欢迎 点赞 评论 收藏 收录专栏 大数据系列 文章
  • 国内“风口”转变,中国游戏公司纷纷“外逃”,东南亚是个好去处

    中国游戏开发商正在加强对国际市场 特别是东南亚市场的承诺 因为他们的国内公司正在努力应对更困难的中国市场 以便实施在下一阶段发展布局 根据移动应用市场情报公司Sensor Tower的一份报告 按收入排名的前100名全球移动游戏中 有39款
  • String类型的时间转换成BigDecimal类型

    private BigDecimal timeformat String time throws ParseException SimpleDateFormat formatter new SimpleDateFormat yyyy MM
  • Eureka中的服务状态显示UNKOWN(1)

    Spring cloud在加入Config配置中心后 Eureka中的服务状态显示为UNKOUNW 1 Eureka的client端显示如下注册状态为204 重新注册 Eureka服务端 Eureka client端 2018 11 02
  • pom文件解读

    一 pom文件解读
  • Visio+Latex 插入EPS等矢量图

    Latex插入单栏 或者跨栏 的图片 在figure后面加个 即可 即figure begin figure h centering includegraphics width linewidth Figure1 caption Whate
  • CentOS 7通过samba实现与Windows共享文件夹

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 SMB Server Messages Block 信息服务块 是一种在局域网上共享文件和打印机的一种通信协议 它为局域网内的不同计算机之间提供
  • 【数据结构与算法——TypeScript】树结构Tree

    数据结构与算法 TypeScript 树结构 Tree 认识树结构以及特性 什么是树 真实的树 相信每个人对现实生活中的树都会非常熟悉 我们来看一下树有什么特点 树通常有一个根 连接着根的是树干 树干到上面之后会进行分叉成树枝 树枝还会分叉
  • OpenCV实现人脸识别

    该程序对头像很小的图片效果不是很好 VS2017 OpenCV3 5 主要步骤 1 读取图像 2 转为灰度图 3 直方图均衡化 增加对比度 4 载入分类器 5 检测关于脸部位置 include
  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而