注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fruity的共享空间

各种蛋疼

 
 
 

日志

 
 

MAX Script第一弹:解决人物运动时关节网格塌陷的方法  

2007-04-13 22:32:17|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
搞CG的都知道,用传统方法绑定的角色在运动的时候关节处(肘部和膝盖处)容易出现模型网络塌陷进去的情况,这是由于关节处的顶点受两边骨骼拉扯造成形变过度的原因,因此一般需要对关节处的顶点进行调整,传统的方法是用skin morph修正,不过在3ds max中使用这个方法不但工作量巨大(要对每个关节分别作morph),而且很不稳定,经常会报错退出,因此我选择了使用添加关节处控制骨骼的方法来解决这个问题,用这根骨骼分配一部分权重,来减弱关节处顶点的变形。
具体的思路就是第一幅图所示啦,原理很简单,保证新添加的骨骼的指向线是上臂和前臂夹角的平分线(法线)即可。
这根骨骼的旋转自然就需要用脚本来控制了,思路就是先计算出大臂和前臂的夹角,然后将新添加的骨骼旋转到他们夹角一半的位置即可。
听上去很简单的思路,但是做起来却很复杂,因为在3ds max内部,计算物体的位移旋转等信息是放在一个4*4的矩阵里头的,由这个矩阵读出的物体在空间的角度是用四元数的形式表示的,查了一下四元数的计算方法……超级复杂,已经超过本人智商可以接受的范围(本来数学学的就烂),没办法,只好转换成欧拉角计算,这个倒比较好理解,就是物体XYZ的角度,不过由于欧拉角的转换范围是-90~+90,不能识别钝角——角度只要超过90度就按锐角处理……就是说会出现反转的问题……所以只好最后加了个条件判断语句,超过90度就要用180度减一下(忘记数学里怎么称呼了),还有就是最后的结果要转换成弧度,不然你就看那个骨骼在疯狂的转圈吧^_^
代码如下,先要定义变量ru和rf分别为上臂、前臂骨骼的旋转控制器:
zz1=inverse ru.transform.rotation
zzz1=quattoeuler zz1
zz2=rf.transform.rotation
zzz2=quattoeuler zz2
k=(degtorad (180+zzz2.z-zzz1.z)/2)+pi
case of
(
(k>pi):n=k-pi
default:n=k
)
n
对了,你可以在脚本的开头再加上一句:dependsOn ru rf
通知脚本每次上臂或者前臂更改时重新求值,这样视图就可以一直刷新了。
调试成功后就可以在Skin修改器中添加这根骨骼,给肘部的顶点分配合适的权重,这样效果就OK了(见第4张图)
嗯,自己是非常不满意写了这么多垃圾代码,数学好的话就直接用四元数解决了,也没必要这样转来转去,不过毕竟是自己第一次尝试嘛,而且执行速度还挺快,总算是尝到了编写脚本的好处,解决了一个非常头痛的问题。嘿嘿,这个比某胖子天天写一些让人家不知道可以拿来做什么的脚本强多了。
MAX Script第一弹:解决人物运动时关节网格塌陷的方法 - fruityman - fruityman 的博客MAX Script第一弹:解决人物运动时关节网格塌陷的方法 - fruityman - fruityman 的博客MAX Script第一弹:解决人物运动时关节网格塌陷的方法 - fruityman - fruityman 的博客MAX Script第一弹:解决人物运动时关节网格塌陷的方法 - fruityman - fruityman 的博客
  评论这张
 
阅读(188)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017