查看: 1614|回复: 0
打印 上一主题 下一主题

Maya用Expression实现让鸡蛋自己翻滚的效果

[复制链接]
.    

3797

主题

11

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
32328
精华
41

活跃会员 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2013-1-11 16:05:12 |只看该作者 |倒序浏览
本文的目的是探讨一下用Expression等方法来实现不规则圆的物体(如鸡蛋,变形的轮胎)在平面上无滑动的滚动效果,由于不用关键桢key,而且速率可调,这样重用率高,从而效率也提高了。  源代码  我希望提供这样的思路,能起到抛砖引玉的作用,让更多的人来关注,研究maya,MEL,Expression,来实现更好的效果,进而促进这一领域的范围更广,层次更深的应用,交流和合作。唯愿如此  //************** eggVer2.txt ***********************
  // Egg rolling motion ---- Version 2.0
  // Author: Luonaldo
  // First create date: about March, 2003
  // Last updated: 2003/09/10 ---->add looptimes.
  // Last updated: 2003/09/17 ---->delete unused content.debug passed.
  //to keep two curves vertical.
  verCurve.rotateY = tanCurve.rotateY + 90;
  float $times = eggBasePoint.loopTimes;
  //NECESSARY CONDITION 1: rotateZ *************
  EggBody.rotateZ = sign($times) * verCurve.rotateY;
  //NECESSARY CONDITION 2: translateY *************
  EggBody.translateY = distPivPointShape.distance + eggBasePoint.translateY;
  float $distance;
  $distance=distPivTouchShape.distance;
  motionPath1.uValue = abs(($times % 1));
  float $arclen;
  $arclen=curveInfo1.arcLength * motionPath1.uValue;
  // Now compare whether the pivotPoint is in front of or
  // behind the touchPoint.
  float $verRy;
  float $refRy;
  float $sign1;
  float $alpha;
  $verRy = (verCurve.ry > 0) ? verCurve.ry : (360 + verCurve.ry);
  $refRy = (refCurve.ry > 0) ? refCurve.ry : (360 + refCurve.ry);
  //to make 0< alpha <180
  $alpha = (($verRy - $refRy) + 360) % 180;
  //-1:behand, 1:front, begin:uvalue=0
  $sign1= ($alpha > 90)? (-1) : 1;
  //NECESSARY CONDITION 3: translateX *************
  EggBody.translateX = -($arclen + $sign1*$distance)
  * sign($times)
  //times sign decide direction
  - (curveInfo1.arcLength) * ***nc($times)
  //full times Length
  + eggBasePoint.translateX;
  //egg base offset
  //egg&#39;s tz is based on eggBasePoint.tz
  EggBody.translateZ = eggBasePoint.translateZ;
  //The end.
  
  这是一个二维的模型,O是curve的pivot,D是垂足,T是鸡蛋和平面的接触点,C是曲线模型的起始点,直线dt代表地面,线段od代表物体中心离地面的距离,弧线ct的长度可以由curveInfo.arcLength给出。物体滚动的距离其实就是(架设从c点接触地面开始):弧ct + 线段dt。(或者减,看垂足d是在滚动方向的前方还是后方)。图中线段od和dt是用MAYA自带的measureTools/distanceTool直接测量的。我想这样比自己计算两点间距或者勾股定理套公式要省事一些,也好理解一点吧。  由于有的物体边缘内凹,所以在滚动的时候内凹的部分接触不到地面,在物体翻滚之前,需要做一个二维的轮廓模型,在凹陷的地方取直线,微微有一点点外凸最好,用这个模型取得位移和旋转的坐标,而用真实的物体做动画。在motionPath的uValue中调节曲线,这里还是要key几个关键帧的。但是比起全手动要简单,还能随时更改快慢。  用一个静态的模型,实现对动态运动的控制。图中的鸡蛋受一个locator控制它的基准坐标,这样即使做过动画,也能很方便的移动到另一个位置。graph Editor中是loopTimes的曲线,% 1 后给uValue, 用来控制快慢和方向。【来源:互联网】
更多精彩教程,尽在web3D纳金网http://www.narkii.com/college/
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-12 10:59 , Processed in 0.087759 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部