Maya FEM节点框架完成
这几天把物理模拟框架移植到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节点框架完成的更多相关文章
- 实现Maya FEM节点
准备实现FEM节点. 发现一种让自定义的Locator以及它的变换节点自动命名的方法.代码如下: void FEMSimulationNode::postConstructor() { MFnDepe ...
- Maya编程——节点&命令
代码写完出现问题: 查了一下原因:
- CG资源网 - Maya教程
Maya中mentalray灯光渲染终极训练视频教程 http://www.cgtsj.com/cg/f/vx3627/index.html Maya无人机建模制作训练视频教程第一季 http://w ...
- 不可错过的Node.js框架
前言 Node.js是由Ryan Dahl于2009年创建的.它是一个开源的跨平台运行时环境,用于开发服务器端和网络应用程序,它是基于Google Chrome V8 JavaScript引擎构建的. ...
- 70部MAYA灯光材质渲染教程合集
MAYA灯光材质渲染教程合集 教程格式:MP4和flv 两种格式 使用版本:教程不是一年出的教程,各个版本都有 (教程软件为英文版) 清晰度:可以看清软件上的文字 语言:部分中文字幕,其他英文(通过看 ...
- cg tut
Gesture Drawing with Alex Woo Gesture Drawing with Alex Woo and Louis Gonzales http://eisneim.com/?p ...
- .Net魔法堂:log4net详解
一.作用 提供一个记录日志的框架,可以将日志信息记录到文件.控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 二.先看看示例,感受一下吧 c ...
- JavaScript高级程序设计31.pdf
其它方面的变化 DOM的其他部分在“DOM2级核心”中也发生了一些变化,这些变化与XML命名空间无关,而是确保API的可靠性及完整性 DocumentType类型的变化 DocumentType类型新 ...
- U3D——Unity3D的脚本-script入门
Unity3D的基本操作非常easy就能掌握了,接下来就是游戏系统的核心部分:脚本. 什么是Script(脚本)?简而言之,就是使用代码来运行一系列动作命令的特殊文本,它须要编译器来从新解读.U ...
随机推荐
- CSS3边框温故
1.简介:border属性在CSS1中就已经定义了,用来设置元素边框风格,设置不同的边框.颜色.粗细 2.基本属性,包括三个类型值:(1)border-width:设置元素边框的粗细,默认3~4px( ...
- 实验12:Problem J: 动物爱好者
#define null ""是用来将字符串清空的 #define none -1是用来当不存在这种动物时,返回-1. 其实这种做法有点多余,不过好理解一些. Home Web B ...
- 初识UIScrollView
RootView.m #import "RootView.h" #define YHColor [UIColor colorWithRed:arc4random() % 256 / ...
- JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API
一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的 ...
- (ios实战) UINavigationBar 返回按钮 文本自定义实现
在实际开发过程, 我们使用navigationController时,上一个标题过长,导致下一个界面的返回按钮文本过长,比较难看,如果标题取名过短,又不能完全表达含义. 下面时如何实现返回按钮的Tit ...
- 3.输入三个整数,xyz,最终以从小到大的方式输出。利用嵌套。
<body>请输入a的值:<input type="numbe" id="a" value=""/>请输入b的值:& ...
- SQL Server服务器名称与默认实例名不一致的修复方法
SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql ser ...
- Eclipse 启动Tomcat 超时报错的解决方案
在用eclipse开发项目 用tomcat发布项目的时候 会提示超时, Server Tomcat v7.0 Server at localhost was unable to start wit ...
- Linux之存储及文件系统管理
一.存储管理 1.各种存储设备在Linux系统中对应的文件名 2.硬盘结构及分区 1).硬盘结构 2) .为什么要进行硬盘分区: a) 更容易管理和控制系统,因为相关的文件和目录都放在一个分区中. b ...
- NSThread基础使用
1.创建和启动线程 一个NSThread对象就代表一条线程; 创建,启动线程 NSThread *thread = [[NSThread alloc] initWithTarget:self ...