这几天把物理模拟框架移植到maya之中了。

maya编程有一点比较关键,就是要让自己的程序逻辑适应maya的节点求值机制。在物理模拟中,往往需要进行时间积分,对此我的解决办法是,写一个节点rigSimulator,存放模拟的状态数据(例如: 位置、速度、加速度、过去模拟的结果),再写一个mel命令rigSimulate,让指定的节点进行求值。模拟的主循环是一个mel 脚本,伪代码如下

int $t = 0;
for ($t = $begTime; $t < $begTime + $length; $t++)
{
// 设置当前时间
currentTime $t; // 对指定节点执行计算,结果存在节点内部
int $res = `rigSimulate -step -name $nodeName`;
if($res == 0)
break;
}

节点的属性如下:

Rigged Mesh为受到参数控制的网格

Mesh Transform为网格变换矩阵

Rig Parameter为控制网格变形的参数,是一个数组

节点的属性编辑器面板如下:

用法是先设置好物理参数,点Initialize,然后设置模拟的长度,点Simulate开始模拟,模拟过程中可以按ESC退出。

前两个参数控制四面体网格化的精细程度。

Young Modulus 为杨氏模量,与模型硬度有关。

Nu是不用轴向变形的影响程度。

Density是密度。

Step Time为每步的时间间隔,初始设置为1/24秒。

节点进行模拟时,需要获得给定参数下的网格形状。具体的做法是先设置Rig Parameter,然后读取Rigged Mesh,此时Maya便会对节点求值,返回一个被参数控制的网格。

模拟后的结果存在节点内部,一旦节点的draw函数被调用,节点会首先根据当前帧查找对应的模拟结果,再显示出来。

下图显示一个体网格化之后的圆柱体。

我给这个圆柱体加了一个平移动画,以及一个弯曲变形器。希望做出圆柱体移动的时候弯曲的效果。

节点求值网络如下:

这个是原来节点的动画

这个是模拟之后的动画。

最后说一点,就是模拟过程中按ESC退出功能的实现。这个功能虽然不是核心功能,但是却对程序调试带来方便。下面贴出代码:

global proc execSimulator(string $nodeName)
{
// 获取模拟长度
int $length = `intSliderGrp -query -value simLengthSlider`; // 设置进度条属性, -isInterruptable 表示能用ESC终止
global string $gMainProgressBar; // 这个全局变量由Maya定义,表示界面左下角的进度条
progressBar -edit
-beginProgress
-isInterruptable true
-status "Simulating... "
-maxValue $length
$gMainProgressBar; int $begTime = `currentTime -q`;
int $t;
for ($t = $begTime; $t < $begTime + $length; $t++)
{
// 若发现ESC被按下,中止模拟
if(`progressBar -query -isCancelled $gMainProgressBar`)
break;
progressBar -edit -step 1 $gMainProgressBar; // 否则继续模拟
currentTime $t; // 移动时间滑块到下一帧
int $res = `rigSimulate -step -name $nodeName`; // 执行模拟命令
if($res == 0)
break;
} // 模拟结束,不再显示进度条,同时鼠标指针回复正常
progressBar -edit -endProgress $gMainProgressBar;
}

估计有人会说“你这个只用Maya也能做到啊”,没错,而且这个插件现在还不完善。

其实,下一步还有功能要实现,例如给某些自由参数一些指导,而不是让它们完全自由。我把代码移植到maya的目的是在实现这些下一步的功能时,有个方便调试的平台(其中一个好处就是,不用自己实现maya的各种变形器)。

当前的问题,以及下一步的改进有如下几点:

1. 发现多个控制参数的时候模拟结果存在问题。不知道是不是雅可比矩阵的导数算错了的缘故。下一步需要检查。

2. 不能处理有洞的网格,估计自相交的也不行。

3. 暂时只支持corotational模型,不支持其他本构模型,例如NeoHookean。

4. 没有使用BFGS算法。

5. Rig Space Physics文中提及的硬度控制、反向运动学没有实现。

6. 把模拟出来的参数转成动画曲线,这一步估计用mel可以完成。

接下来几天可能要转向Python、Lua学习了。等这两个任务搞定了,再接着完成这些改进,到时候可以考虑尝试在maya用python编程。

Maya FEM节点框架完成的更多相关文章

  1. 实现Maya FEM节点

    准备实现FEM节点. 发现一种让自定义的Locator以及它的变换节点自动命名的方法.代码如下: void FEMSimulationNode::postConstructor() { MFnDepe ...

  2. Maya编程——节点&命令

    代码写完出现问题: 查了一下原因:

  3. CG资源网 - Maya教程

    Maya中mentalray灯光渲染终极训练视频教程 http://www.cgtsj.com/cg/f/vx3627/index.html Maya无人机建模制作训练视频教程第一季 http://w ...

  4. 不可错过的Node.js框架

    前言 Node.js是由Ryan Dahl于2009年创建的.它是一个开源的跨平台运行时环境,用于开发服务器端和网络应用程序,它是基于Google Chrome V8 JavaScript引擎构建的. ...

  5. 70部MAYA灯光材质渲染教程合集

    MAYA灯光材质渲染教程合集 教程格式:MP4和flv 两种格式 使用版本:教程不是一年出的教程,各个版本都有 (教程软件为英文版) 清晰度:可以看清软件上的文字 语言:部分中文字幕,其他英文(通过看 ...

  6. cg tut

    Gesture Drawing with Alex Woo Gesture Drawing with Alex Woo and Louis Gonzales http://eisneim.com/?p ...

  7. .Net魔法堂:log4net详解

    一.作用 提供一个记录日志的框架,可以将日志信息记录到文件.控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 二.先看看示例,感受一下吧   c ...

  8. JavaScript高级程序设计31.pdf

    其它方面的变化 DOM的其他部分在“DOM2级核心”中也发生了一些变化,这些变化与XML命名空间无关,而是确保API的可靠性及完整性 DocumentType类型的变化 DocumentType类型新 ...

  9. U3D——Unity3D的脚本-script入门

     Unity3D的基本操作非常easy就能掌握了,接下来就是游戏系统的核心部分:脚本. 什么是Script(脚本)?简而言之,就是使用代码来运行一系列动作命令的特殊文本,它须要编译器来从新解读.U ...

随机推荐

  1. How to upgrade workflow assembly in MOSS 2007

    This problem generally start when you are having an existing custom workflow and there are instances ...

  2. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  3. 卸载openfire

    首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...

  4. IOS SizeClasses 详解

    SizeClasses 详解 iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes.对于任何设备来说,界面的宽度和高度都只分为三种描述:紧凑,任意和宽松.这样开发者便可以无视 ...

  5. 静态代码检查工具-PMD初学者入门篇

    前言: PMD是一款静态代码分析工具,它能够自动检测各种潜在缺陷以及不安全或未优化的代码. PMD更多地是集中在预先检测缺陷上,它提供了高度可配置的丰富规则集,用户可以方便配置对待特定项目使用那些规则 ...

  6. 在js中获取get参数(仿PHP)

    复制粘贴即可..然后就可以在js中像PHP用$_GET['name']这样子获取get参数了!! /*--------------------(返回 $_GET 对象, 仿PHP模式)-------- ...

  7. JavaScript Patterns 3.6 Regular Expression Literal

    1. Using the new RegExp() constructor // constructor var re = new RegExp("\\\\", "gm& ...

  8. 编写一个Java项目,定义包,在包下定义包含main方法的类,在main方法中声明8种基本数据类型的变量并赋值,练习数据类型转换。

  9. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

  10. nginx中使用srcache_nginx模块构建缓存

    nginx中可以将lua嵌,让nginx执行lua脚本,可以处理高并发,非阻塞的处理各种请求,openresty项目中可以使用nignx可以直接构建 srcache_nginx + redis 缓存, ...