01Sprites型粒子可以在每一个粒子上贴图或者贴序列图片, 有大量的例子从一个点发射器发出,注意上图中,箭头的方向没有指向它们各自的速度方向,下面就讲讲怎样改变它们 02首先在Hypershader里面建一个 vector product 节点,把他命名为"camera_to_world" 它将要把在摄像机空间里的UP vector转化为世界坐标系里面的 03设置"input1" 为 <<0,1,0>>,选择 "Vector Matrix Product" 作为运算方法 04连接渲染摄像机得 Xform Matrix 到vector product节点得"Matrix" 05注意两点 看清上面的连接编辑器的连接方向!(红框标注) 选择outliner里面的persp(透视图摄像机),不要选Hypershade里面的perspShape,要不你找不到 Xform Matrix 这一项 outliner persp 06给粒子添加“spriteTwistPP“属性 07添加Runtime 表达式 vector $up=<<0,1,0>>; vector $cameraup=<<camera_to_world.outputX,camera_to_world.outputY,camera_to_world.outputZ>>; vector $ref = cross($up,$cameraup); float $ang=acos(dot($up,unit(particleShape1.worldVelocity)))/3.14*180; if(dot($ref,particleShape1.worldVelocity)>0) particleShape1.spriteTwistPP=$ang; else particleShape1.spriteTwistPP=-$ang; 就可以了 08下面简单解释一下表达式得意思 最开始的vector product 节点,把在摄像机空间里的UP vector转化为世界坐标系里面的 maya help里面解释的摄像机得Xform Matrix和 Matrix包含同样的信息 ( Contains the same information as the matrix attribute on dagNode but it is stored in a format that can be interpolated easily.——maya help ) vector product 节点得input 1是<<0,1,0>>,就是y轴得方向,这个矢量应该是摄像机坐标系得 通过vector product 节点得Vector Matrix Product运算把 input 1变为世界坐标系 下面试着分析一下这个表达式(如有不对得,请指出,呵呵) vector $up=<<0,1,0>>; 定义一个矢量 vector $cameraup=<<camera_to_world.outputX,camera_to_world.outputY,camera_to_world.outputZ>>; 再定义一个矢量,分别取刚才vector product 节点算出的output vector $ref = cross($up,$cameraup); 定义矢量,矢量 $ref 等于$up,$cameraup这两个矢量得差乘 上面定义了三个矢量,下面 float $ang=acos(dot($up,unit(particleShape1.worldVelocity)))/3.14*180; $ang得到是一个角度,他是$up 和粒子速度(worldVelocity)的一个夹角 dot——点乘,由于$up是一个单位矢量(0,1,0),速度矢量也单位化了(unit),所以点乘得到两个矢量得余弦值——cos X 通过acos,求反余弦,得到角度,也就是夹角 这时候求得的夹角是用弧度制的 所以要转化为角度制——后面的: /3.14*180 画个图,可能好理解一些! 09红色的坐标系代表的是世界坐标系 深蓝色的是摄像机坐标系 这里我们的两个坐标系的关系,据了个最简单的: 世界坐标系得xy平面和摄像机坐标系zy平面是共面的,所以世界坐标系z和摄像机坐标系x轴自然平行 棕色的矢量是摄像机坐标系得一个矢量 也就是我们在 vector product 里面的input 1 通过 vector product 的运算,就把input 1转化为了紫色的矢量 这是在世界坐标系得,也就是 vector product 得output 这个output得值赋给了$cameraup 也就是$cameraup等于output了, 矢量$ref是$up点乘$cameraup的结果(就试图中得浅绿色的矢量,哦我这个可能画翻了,应该是z轴向相反的,不好意思,影响不大) 深蓝色得是速度矢量,它和$ref求夹角德余弦cos 因为从y轴顺时针,逆时针旋转相同角度得到的余弦值真好是相反数 来判断spriteTwistPP应该旋转的角度, 这个角度就是变量$ang,只不过是由个角度问题,这个偏向角要和速度方向吻合,也达到最开始我的说的目的了——————箭头的方向指向它们各自的速度方向 完了 呵呵~~~ 我都有点晕了 有不对的地方,请大家指出,谢谢 |
欢迎光临 征集码头论坛_LOGO_广告语_名字_征文_歌曲_包装_景观_文创征集网 (http://zhengjimtcn.com/) | Powered by Discuz! X3.2 |