我给模型加了材质后 渲染动画 发现动画时 材质出现流动的现象 这是怎么回事啊 ?

看完不过瘾?点此向作者提问

maya api的问题:关于MPxContextr的开发

maya api的问题:我知道mpxcontext类用于开发maya视图界面的响应工具,但是我发现好象只能在model viewer窗口中起作用,现在我想写一个在graph editor窗口里操作关键帧的工具,比如移动、缩放关键帧等,但没有找到相应的类和方法,各位高手能否有解决办法?

看完不过瘾?点此向作者提问

曲线转骨骼 【MEL 小工具】

问题
一个朋友问:
我想先创建一条曲线,然后在创建几段骨骼并吸附到曲线上,并且可以自定义骨骼的数目,也就是按照曲线的弧长来平分骨骼之间的距离,想请问,用MEL怎么实现?
思路
我的想法是这样的:
根据NURBS曲线的U参数,获得曲线上的任意一点的坐标,就可以在此创建骨骼了。
不过一般NURBS曲线的U向参数并没有归一化,骨骼并不会根据弧长均匀分布。
所以如果想要骨骼均匀沿着曲线分布,最好把NURBS曲线Rebuild一下,就可以解决问题了。
具体代码如下,希望有点用。
核心命令有两个,pointOnCurve和joint
结果

////////////////////////////////////////////////////////////
//created by hmaya at May24 2008
//MEL Command: Curve2Joints(int $pSpan, string $CurveName)
//www.cg-discovery.com
//Usage:
//1在脚本编辑器中执行该代码
//2指定骨骼段数和NURBS曲线名称
//例如:输入Curve2Joints(6,"curve2")并运行
//注意:为了获得更好的效果,建议运行该MEL之前,把BURBS曲线Rebuild一下
//////////////////////////////////////////////////////////////////
proc Curve2Joints(int $pSpan, string $CurveName){
if($pSpan < 0){ error "Please reassign the number of joints, it should be positive!"; } float $u; if($pSpan <= 0) $u = 0; if($pSpan > 0)
$u = 1.0/$pSpan;
int $i;
for($i = 0; $i <= $pSpan; $i++){ float $parameter = $i*$u; float $pos[] = `pointOnCurve -top 1 -pr $parameter -p $CurveName`; joint -p $pos[0] $pos[1] $pos[2]; } }

看完不过瘾?点此向作者提问

请教一个问题:按照曲线创建骨骼

对MEL基本不懂,有想学的欲望
现在在工作当中遇到一些问题,想请教一下
就是我想先创建一条曲线,然后在创建几段骨骼并吸附到曲线上,并且可以自定义骨骼的数目,也就是按照曲线的弧长来平分骨骼之间的距离
想请问,用MEL怎么实现,大概的一个原理是什么,谢谢
第一次上这个网站发问题

看完不过瘾?点此向作者提问

可视化Ocean Shader

可视化Ocean Shader
在MAYA中,Ocean Shader内置了Displacement、波浪等效果。即使把Ocean Shader赋予一个纯平面,一样可以表现海洋的波澜起伏的效果。要在视图中直接预览Ocean Shader,MAYA提供了预览平面(Preview Plane)。这里的Preview Plane是使用高场节点(Height Field)生成的。但由于Height Field的局限性,这里的Preview Plane不是一般意义上的模型,无法与NURBS模型作相交运算。
我们可以使用ColorAtPoint命令把Ocean Shader可视化,得到波澜起伏的NURBS海洋表面。这个MEL的实用性很强,最经典的用途是NURBS海洋表面可以与海洋上漂浮、游动的NURBS模型求交,得到相交的轮廓线。例如海洋上轮船在疾驰,轮船四周要溅出浪花。如果得到NURBS海洋表面,则可以与轮船模型(NURBS模型)求交,得到轮廓线。这样再在轮廓线上建立离子发射器,发射离子,即可得到轮船四周浪花飞溅的效果。远镜头不用这么麻烦,但给轮船近镜头或者船身特写时,要制作浪花就用上这个MEL了。当然,在MAYA里,我们还可以把流体转换为多变形,不过这样的转换对静帧还可以,但对动画来说用途不大。但我们的这个MEL则适用于动画。
这个MEL的核心命令是ColorAtPoint。其原理是提取NURBS表面上点的X和Z坐标,然后使用ColorAtPoint命令将相应点的Ocean Shader的Alpha值提取出来,传递给NURBS表面,作为对应点的Y坐标。这样就使用NURBS表面表现出了海洋,如图9.24。

图9.24 NURBS海洋
该MEL代码如下
//////////////////////////////////////////////////////////////
//Create by hmaya
//Date: 2005.10
//第一步:新建场景
//第二步:在Hypershade中创建一个Oceanshader,默认名称为Oceanshader1,不要再改了.
//第三步:再创建一个NURBS平面,修改其名称为model,注意修改其大小和UV段数.
//第四步:在Script Editor中输入如下代码执行即可。
//第五步:要得到动态的NURBS海洋,可以在Hypershade中选择Oceanshader1,
//然后执行Window | Animation Editors | Expression Editor,
//为Oceanshader1添加下面的代码执行即可。
//////////////////////////////////////////////////////////////
for ($i=0;$i<169;$i++) //设NURBS平面的UV段数是10*10,则共有13*13=169个CV { float $pos[]=`xform -q -ws -t model.controlPoints[$i]`;//得到NURBS平面的坐标 float $pos_ocean[]=`colorAtPoint -o A -u $pos[0] -v $pos[2] oceanShader1`; //获取Oceanshader的Alpha值 string $YY="modelShape.controlPoints["+$i+"].yValue"; setAttr $YY $pos_ocean[0]; // 将Oceanshader的Alpha值传递为NURBS平面上对应点的Y坐标 } 添加MEL表达式后的Ocean Shader节点网络如图9.25。
图9.25 Ocean Shader的节点网络

看完不过瘾?点此向作者提问

Maya的卡通材质[Toon Shader]

渲染物体的轮廓线
前段时间,英国一个教授有个小问题让我帮忙解决,他有个关于八叉树的图例,需要把物体的轮廓线渲染出来,如图这样。

面对这样的问题,若在以前版本的MAYA中,也许还要费些周折,笔者甚至想过在BMRT中自己动手写物体轮廓Shader。但当时笔者手头上有MAYA7.0,而且MAYA7.0新增了Toon Shader,而Toon Shader带有边线功能,这样一来,完成图例便简单多了。
下面笔者介绍解决方法。
选择要添加轮廓线的物体,在Rendering模块下执行Toon | Assign Outline | Add New Toon Outline,如图。

如图,MAYA已经使用画笔特效的方式为物体添加了轮廓线。按Ctrl + a,打开轮廓线的属性窗,可以通过设定Line Width来调整轮廓线的粗细,可以通过设定Profile Color、Crease Color、Border Color等,来调整轮廓线的色彩。

渲染,如图,我们得到了物体的轮廓线。

卡通材质(Toon Shader)
前面我们尝试了Toon Shader的描绘边线功能。而卡通材质一般由两部分组成,描绘轮廓线和填充色。MAYA的Toon Shader中提供了这两部分的命令,如图,分别是Fill Shader和Outline。

如图,选择要赋予卡通材质的模型,在Rendering模块下执行Toon | Assign Fill Shader | Light Angle Two Tone,为模型添加一个与灯光相关的填充色Shader。当然大家也可以尝试其他的填充色Shader。

如图,在属性编辑器中编辑该填充色Shader的Color参数,可以改变明暗色调,也可以增加色彩过渡,大家可以自由编辑渐变色。

渲染当前的卡通材质效果,如图。

使用上面 “渲染物体的轮廓线”中介绍的方法,为模型添加边线(选择模型,执行Toon | Assign Outline | Add New Toon Outline),设定边线宽度和色彩,渲染,如图。

把头发也赋予卡通材质,最后得到的卡通材质效果如图。

看完不过瘾?点此向作者提问

Shading | Shader | Shading Group | Node

Shading | Shader | Shading Group | Node
大家可能经常看到Shading、Shader、Shading Group这三个词,它们有何联系有何区别呢?
下面笔者解释一下:
Shading,动词,有光影的意思,可以理解为着色。
Shader,转化为名词,可以理解为着色器,是一系列为了着色和光影而连接起来的材质节点组合。通俗理解为材质,不过Shader比材质的概念要大。
MAYA中还有个概念叫Shading Group,位于材质球的上游,而且与灯光和模型的Shape节点连接,可为最后的渲染输出提供信息,如图。

图 Shading Group
除此之外呢,大家在MAYA中最常见的名词就是节点(Node)了。下面笔者再详细介绍一下Node的概念。
从底层来说,MAYA中的节点(Node)主要是存储数据并对数据做某种方式的修改或处理。一般的节点含有输入(Input)属性、输出(Output)属性和一个计算函数。当前节点通过输入(Input)属性接收上游节点传递进来的数据,并通过计算函数处理数据,然后使用输出(Output)属性将数据输出给下游的节点,然后下游的节点同样再通过Input属性接收数据并处理,再通过Output属性输出,依次类推。这样一个一个的节点连接起来,就构成了MAYA的工作流程。如果大家对物理比较熟悉的话,不难想象,MAYA的节点就像电阻一样,接收电流(数据),经过一定消耗(计算)然后再输出电流。这样一个一个电阻就构成了电路(工作流程)。
从表面来看,MAYA的节点有:
构造节点——负责片面、曲线的创建,如放样(Loft)、旋转(Revolve)等。
Shape节点——形状节点,决定模型的形状是方块还是圆球,记录着一堆顶点坐标等数据。
Transform节点——变换节点,专门负责物体的旋转、缩放、移动等属性。
Shading节点——着色节点或者叫材质节点,好多类型的节点,负责物体的材质。
其他的诸如灯光、摄像机、骨骼等等大同小异,都可以看成节点,只不过这些节点的属性比较多。

看完不过瘾?点此向作者提问

C++基础知识–多态【For Maya plugin】

C++基础知识–多态
什么是向上映射
将派生类的对象、引用或指针转变为基类对象、引用、指针的活动被称为向上映射。
为什么被称作向上映射,而不是向下、向左、向右映射?
类继承关系图的传统画法中通常都是将基类画在上层,将派生类画在下层。例如:
Base
|
Derived
为什么能够向上映射
向上映射总是安全的。因为是从更专门的类型映射到更一般的类型——对于这个类接口可能出现的唯一的情况是它失去成员函数或者成员变量,而不会增加它们。这就是编译器允许向上映射而不需要显式说明或者作标记的原因。
向上映射的危机
看例子:
class base{
public:
void print(){
cout<<"base class"<print();
}
在上面的代码中,我们希望得到派生类指针所指内容print(),但是编译器却以指针的类型为主要参考依据,返回了基类的print()。如何避免这样的危机,而让指针能够根据地址取值而不是根据类型取值呢?
为什么会存在向上映射的危机?
因为:早绑定(静态绑定)
解决之道:晚绑定(动态绑定)|虚函数
Polymorphism allows a client to treat different objects in the same way even if they were created from different classes and exhibit different behaviors.
动态绑定的实现机制(三步)
1为每一个包含虚函数的类设置一个虚表(VTABLE)
每当创建一个包含有虚函数的类或从包含虚函数的类派生一个类时,编译器就会为这个类创建一个VTABLE。在VTABLE中,编译器放置了这个类中,或者它的基类中所有已经声明为 virtual 的函数的地址。如果在这
个派生类中没有对基类中声明为 virtual 的函数进行重新定义,编译器就使用基类的这个虚函数的地址。而且所有VTABLE中虚函数地址的顺序是完全相同的。
2初始化虚指针(VPTR)
然后编译器在这个类的各个对象中放置VPTR。VPTR在对象的相同的位置(通常都在对象的开头)。VPTR必须被初始化为指向相应的VTABLE。
3为虚函数调用插入代码
当通过基类的指针调用派生类的虚函数时,编译器将在调用处插入相应的代码,以实现通过VPTR找到VTABLE,并根据VTABLE中存储的正确的虚函数地址,访问到正确的函数。

看完不过瘾?点此向作者提问