继上文继续写。有了顶点迭代器之后就可以利用MItMeshVertex类的getConnectedVertices方法来获取相连点并代入平滑算法。

选择什么样的平滑算法呢?本人比较懒,直接打开了计算机图形学(第四版)322页直接用bezier样条曲线的方法来做平滑。该算法的公式比较复杂,有大量阶乘计算,考虑到执行效率的问题,我决定简化这个式子,即在三点相连形成一条线的情况下,中间点的位置式子如下:

x(u) = x0 *(2!/(0!*2!) )*(u^0)*((1-u)^2)

+ x1 *(2!/(1!*1!) )*(u^1)*((1-u)^1)

+ x2 *(2!/(2!*0!) )*(u^2)*((1-u)^0)

y(u) = y0 *(2!/(0!*2!) )*(u^0)*((1-u)^2)

+ y1 *(2!/(1!*1!) )*(u^1)*((1-u)^1)

+ y2 *(2!/(2!*0!) )*(u^2)*((1-u)^0)

z(u) = z0 *(2!/(0!*2!) )*(u^0)*((1-u)^2)

+ z1 *(2!/(1!*1!) )*(u^1)*((1-u)^1)

+ z2 *(2!/(2!*0!) )*(u^2)*((1-u)^0)

考虑到当前只需要调整中间点的位置,该式子的线性关系可以忽略,于是直接设u = 0.5,中间点的位置式子即可简化为:

x = x0  * 0.25 + x1 * 0.5 + x2 * 0.25

y = y0  * 0.25 + y1 * 0.5 + y2 * 0.25

z = z0  * 0.25 + z1 * 0.5 + z2 * 0.25

该式子只是针对曲线上两点相邻的情况得。

考虑到利用顶点迭代器MItMeshVertex的getConnectedVertices方法得到的相连点一般都是四个(生产中大量使用四角面),所以需要对该式子拓展一下。又由于相连点数量不确定,因为会有三角面,也可能当前中间点在模型边缘上,导致相连点不会一直是四个。所以本人干脆删繁就简以性能为先,将式子转为求中值的形式:

x = (x0 + x1 + ... + xn) / connectedlist.length()

y = (y0 + y1 + ... + yn) / connectedlist.length()

z = (z0 + z1 + ... + zn) / connectedlist.length()

这样就省事了,当然这样的结果就是顶点特征不会明显,模型彻底平滑了。但考虑性能至上,就不纠结了。收工了~

maya中的顶点平滑算法(vertex smooth algorithm)的更多相关文章

  1. SRILM Ngram 折扣平滑算法

    关于n-gram 语言模型,大部分在这篇博客里 记过了,   SRILM 语言模型格式解读 , 其实看完了,ngram的大概用法都比较清楚了, 但是关于平滑算法,一直很模糊,就晓得一个"劫富 ...

  2. Ngram折扣平滑算法

    本文档翻译自srilm手册ngram-discount.7.html     NAME ngram-discount – 这里主要说明srilm中实现的平滑算法   NOTATION a_z      ...

  3. 原地算法(in-place algorithm)

    原地算法(in-place algorithm) 在计算机科学中,一个原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法.当算 ...

  4. maya中MFnMesh.h使用说明的翻译

    由于最近要修改一个maya中的deformer脚本,于是开始系统学习openMaya的一些知识,当然少不了得把一堆头文件说明看一遍.首先把MFnMesh.h这个文件翻译一下吧,不废话,上译文: 首先M ...

  5. 从Maya中把模型搬运至网页的过程

    虽然利用threejs来在网页中渲染3d模型不是第一次折腾了,但是还是遇到了各种问题.总结下我所遇到的问题,希望能给正在使用threejs的小伙伴一个帮助. 一.所使用的软件与开发环境 Maya201 ...

  6. 基于Vivado HLS在zedboard中的Sobel滤波算法实现

     基于Vivado HLS在zedboard中的Sobel滤波算法实现 平台:zedboard  + Webcam 工具:g++4.6  + VIVADO HLS  + XILINX EDK + ...

  7. 【Unity Shader】一、顶点函数(vertex)和片元函数(fragment)

    学习资料:http://www.sikiedu.com/course/37/task/430/show 学习Shader中顶点函数(vertex)和片元函数(fragment)的基本用法. Shade ...

  8. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

  9. unity3d 资源文件从MAX或者MAYA中导出的注意事项

    unity3d 资源文件从MAX或者MAYA中导出的注意事项     1.首先,Unity3d 中,导出带动画的资源有2种导出方式可以选择:    1) 导出资源时,只导出一个文件,保留模型,骨骼和所 ...

随机推荐

  1. java8中的时间处理

    java8中关于时间的处理整理 package com.xb.utils; import java.time.*; import java.time.format.DateTimeFormatter; ...

  2. grpc(二)记一次grpc debug--io.grpc.StatusRuntimeException: UNKNOWN

    1.起初是dingding一直报错: instance:服务器名 err:GrpcClient#placeOrder: io.grpc.StatusRuntimeException: UNKNOWN ...

  3. Makefile 宏定义 -D

    一.GCC编译器中使用:        -D macro=string,等价于在头文件中定义:#define   macro   string. 例如:-D TRUE=true,等价于:#define ...

  4. linux软件管理 源码包

    源码包安装位置 安装在指定位置当中,一般是 /usr/local/软件名/ ​ 注意: 需要指定安装路劲为了便于卸载,因为源码包的是没有卸载命令的,它的的卸载方式就是把对应安装文件夹删除了. 所以如果 ...

  5. linux curl http get 请求中带有中文参数或者特殊字符处理

    在使用c++去请求http服务的时候,使用的是著名的curl工具提供的类库 libcurl,但是在使用的过程中发现,如果请求的参数值带了空格或者是参数是中文,会导致响应的回调函数没有被执行,虽然cur ...

  6. 查看selinux与关闭方法

    查看当前用户selinux 状态 [root@o- ~]# getenforce Disabled [root@o- ~]# setenforce usage: setenforce [ Enforc ...

  7. python安装pip管理工具

    (1)安装python2.7.5,这里我选择安装在C盘根目录下. (2)安装完毕后C盘会生成一个叫“python27”的文件夹. (3)打开python27,会发现该目录下存在一个叫Scripts的文 ...

  8. msfvenom生成各类Payload命令

    Often one of the most useful (and to the beginner underrated) abilities of Metasploit is the msfpayl ...

  9. 触发移动App崩溃的测试场景

    验证在有不同的屏幕分辨率,操作系统和运营商的多个设备上的App行为. 用新发布的操作系统版本验证App的行为. 验证在如隧道,电梯等网络质量突然改变的环境中的App行为. 通过手动网络从蜂窝更改到Wi ...

  10. LINUX系统配置

    LINUX系统配置 Linux 安装jdk方法; Linux Tomcat 安装与配置 Linux redis 安装与配置 (例1) Linux redis安装配置(例2) NGINX 安装 Linu ...