fraction else none
matrix for [1][3] for [1][3] none for [1][3] perfect matrix or matrix or matrix or smaller, smaller, smaller, length of length of perfect with matrix matrix remaining without elements 0 fraction
一个标量类型(scalar type)是一个非阵列型。从阵列到标量或从标量到阵列型没有转换。 int $ski = 1.8; // 赋值:1
vector $crads = 1.7; // 赋值:<<1.7, 1.7, 1.7>> int $wild = \赋值:3
vector $wrd = \赋值:<<8, 2.2, 0>> int $my = <<1, 2, 3>>; // 赋值:3
string $oo = <<6, 2.2, 1>>; // 赋值:\matrix $so[1][3] = $wrd; // 赋值:<<8, 2.2, 0>> float $mole = <<0.3, 0.4>>; // 赋值:0.5 vector $ole = <<2, 7.7>>; // 赋值:<<2, 7.7, 0>> 自动转换
Maya的自动类型转换使我们可以不考虑它们的状态以及不考虑是否是能接受的类型。以下是它们的规则: --Strings 支配其他所有类型。 --Vectors 支配floats。 --Floats 支配ints。
--如果一个算子为整型,另一个为浮点型,MEL将整型转换为浮点型。 --在vector和matrix之间,左边的类型起支配作用。 --赋值时,有左边的类型支配。
在一个赋值操作中,右边的类型被转换到左边的类型。前四条规则在右手的计算期间施用于子表达式; 最终的转换发生在给左边赋值时。 下表是自动类型转换的规则。
运算 结果的数据类型
int 运算子 float float float 运算子 int float int 运算子 vector vector vector 运算子 float vector vector 运算子 matrix vector matrix 运算子 vector matrix matrix 运算子 string string string 运算子 int string
$var1 = 7 + 1.3; // 类型: float (8.3) $var2 = 7.9 + 2; // 类型: float (9.9)
$var3 = 2 + <<4, 5, 6>>; // 类型: vector <<6, 7, 8>> $var4 = 0007 + \类型: string (\
在最后的例子中,0007是值7的整型,它被转换为一个字符串并与\合并。 结果是一个字符串,它显式声明var4为值是\的字符串类型。 显式转换
16
有两个显式方法把一个类型的值转换给另一个。最常用的方法是在该值前面用括号说明: $Z = (vector) \$cools = (float) 7; // Type: float (7)
$ools = (string) 47.554; // Type: string (\你也可以采用跟随括号来实现显式转换:
$ly = vector(\$ooly = int(3.67); // Type: int (3) 4、限制 整数除法的舍弃
当Maya对常数和没有声明数据类型的变量运行算术运算时,它按照表现形式推测数据类型。如以下指令: float $where = 1/2; // Result: 0
Maya推测1和2是整型数,因为它们没有小数点。该表达式用整数1除以整数2。 其整数结果是0而余数是1。 Maya不保留该余数。
由于变量是浮点的,Maya将整数值0转换为浮点数0 (相同值)。 为得到该值的小数成分,需要将一个整数转换为浮点: float $there = 1/2.0; // 结果: 0.5 或
float $youGo = float(1)/2; 精度和最大数长
对于一个字串、矩阵或阵列,最大尺寸仅取决于你的计算机的存储器的有效容量。 但是,浮点和整型有精度和最大长度的限制。
一个整数的最大长度与C 语言中是一样的,决定于机器。 大部分计算机中它的范围是-2,147,483,648到2,147,483,647。
一个浮点数的最大长度和精度与C语言中的双精度数是一样的,也取决于机器。
浮点有精度限制,在长计算里会积累取舍误差。但它的精度很高(大约15位的精度), 取舍通常不会成问题。 超限折返(Range wrap-around)
变量有范围限制。如果超出这个范围,会产生不期望的后果。 int $mighty = 2147483647 + 1; // Result: -2147483648 int $radical = -2147483648 - 1; // Result: 2147483647 int $buddy = 2147483648; // Result: -2147483648 int $man = 2147483647 + 2; // Result: -2147483647
当超出了变量的最大范围,变量的值转折为变量的最小值;反之,若超出最小范围,会转为最大值。 float $GG = 1.5 + 1000000000 * 3; // Result: -1294967294.5
在这个例子中,按照优先顺序先做乘法。因为是两个整数相乘,所以其结果还是一个整数。 因为它的值超过了整型数的最大范围,所以该值被折返。 另一个例子:
$GG = 1.5 + 1000000000 * 3;
$GG = 1.5 + 3000000000; // 超出整型最大范围
$GG = 1.5 + 3000000000 + (2147483648) - (2147483648.0); $GG = 1.5 + 3000000000 + (-2147483648) - (2147483648.0); $GG = 1.5 + 3000000000 - 4294967296; $GG = 1.5 + -1294967296; $GG = -1294967294.5;
编写语句
17
语句说明程序如何发挥运算作用。本章内容有:1、了解指令和运算;2、赋值;3、算法;4、比较;5、条件;6、运算顺序;7、成组运算。
1、了解指令和运算
指令用运算作用或比较数据。有四种运算类型: --赋值 --运算 --比较 --条件
大部分运算使用一个值在运算的左边,一个值在右边。如果这两个值的类型不同,如果可能,一个值将被转换为另一个值。 运算在同类间进行。 2、赋值
赋值运算用等号(=)表达。左边的变量将被赋予右边的值: float $counter = 5.3;
声明一个浮点变量,赋给它一个值5.3。
赋值运算的结果是类型和值赋予等号左边的变量。其结果可被当作同值同类型的常数。 float $owl;
float $hotdog = ($owl = 5.3) + 6;
第而行中浮点$owl被赋值为5.3而$hotdog被赋值为11.3。 赋值链
int $i1, $i2, $i3, $i4;
$i1 = $i2 = $i3 = $i4 = 6; // 所有变量都被赋值为6 3、算法
可以使用以下运算符号进行加、减、乘、比较以及完成变量的其他作用。 符号 意义 数据类型
+ plus int, float, string, vector, matrix - minus或negation int, float, vector, matrix * for int, float, matrix : multiply for vector
: dot product int, float, vector, matrix / divided by int, float, vector
% remainder of division int, float, vector ^ cross product vector
矩阵型可以用于取模modulus(%)和除divide?(/)运算。但是右边必须是个整型或浮点作为算子。更多信息看Matrices。 整数和浮点数
对于整型和浮点属性和变量,遵循基本的数学运算规则。取模(%)运算在编程语言中通常有效。 int $card = 7 % 3; // Result: 1 float $bus = 0.5 % 3; // Result: 0.5 字串
对字串可使用+运算,见Strings。 矢量
矢量变量间的运算,算法^计算矢量的叉积,算法*计算点积。对所有其他的运算,一个矢量的每个分量与其他矢量的各个成分进行运算。
18
vector $Vo = <<3, 9, 5>> + <<9, 2, 3>>; // <<12, 11, 8>> vector $Vu = <<2, 3, 4>> - <<1, 2, 3>>; // <<1, 1, 1>> vector $me = <<2, 3, 2>> / <<1, 2, 5>>; // <<2, 1.5, 0.4>> vector $rf = <<12, 3, 9>> % <<4, 2, 5>>; // <<0, 1, 4>>
点积返回一个浮点。点积常常概念化为两个变量矢量被它们之间角度的余弦所乘之积的长度的积。 vector $V1 = <<4, 6, 8>>; vector $V2 = <<2, 2, 2>>;
float $F1 = $V1 * $V2; // 36 (点积) 点积运算(*)的结果可用以下方程进行计算:
$F1 = ($V1.x * $V2.x) + ($V1.y * $V2.y) + ($V1.z * $V2.z);
一个矢量与一个整型或一个浮点间的运算把整型或浮点转换为矢量,* 运算是不同的。 *运算的结果是矢量的每个成分被整数或浮点数相乘。 vector $tak = 3.2 * <<1, 3, -5>>; // <<3.2, 9.6, -16>> vector $sak = <<0, 1.2, 9.1>> * 5; // <<0, 6, 45.5>> 运算^只能运算于矢量类型。它表达了叉积运算,返回一个矢量。 vector $V3 = <<2, 0, 0>>; vector $V4 = <<0, 3, 0>>;
vector $V5 = $V3 ^ $V4; // <<0, 0, 6>> (叉积)
叉积矢量的方向是法线指向两个变量矢量。该矢量的幅度是两个矢量的长度之积。可用如下方程计算结果: $V5 = <<(($V3.y * $V4.z) - ($V3.z * $V4.y)), (($V3.z * $V4.x) - ($V3.x * $V4.z)), (($V3.x * $V4.y) - ($V3.y * $V4.x))>>; 矩阵
可以在每个矩阵的相应元素之间只进行加或减。矩阵必须具有相同的行数和列数。 matrix $Va[1][4] = <<2, 0, 0, 2>>; matrix $Vb[1][4] = <<6, 3, 7, 5>>;
matrix $Vc[1][4] = $Va + $Vb; // <<8, 3, 7, 7>> matrix $Vd[1][4] = $Va - $Vb; // <<-4, -3, -7, -3>>
矩阵相乘时,左矩阵的列数应该等于右矩阵的行数。结果的矩阵具有与左矩阵相同的行数和与右矩阵相同的列数。
matrix $Ve[2][4] = <<4, 1, 1, 2; 3, 4, 5, 8>>;
matrix $Vf[4][3] = <<7, 6, 0; 7, 5, 4; 2, 1, 6; 2, 0, 2>>; matrix $Vg[2][3] = $Ve * $Vf; // <<41, 30, 14; 75, 43, 62>>
当右边的项是一个标量时,取模和除法算符使用该标量作为右边的项对矩阵的每一个元素进行运算。以下的例子展示出了这一点:
matrix $Vh[1][4] = <<4, 9, 5, 2>> % 3; // <<1, 0, 2, 2>> matrix $Vi[1][4] = <<1, 2, 8, 4>> / 2; // <<0.5, 1, 4, 2>> 略写
在语句描述中你常常会分配一个变量,它的值与其它一些值进行了运算。略写运算提供了一种简单而又快速的方法。
你可以对int, float和vector数据类型的运算进行略写。
这些算符并没有提供附加的功能或者提高运算速度,但是可以节省你宝贵的输入时间。 例如,可以不写成: $bus = $bus + 3.5;
19
而可以写成: $bus += 3.5;
这两条语句做相同的事情,但是第二条输入的少。对于任何计算符,可以将以下格式: 变量 = 变量 算符 值 写成: 变量 算符= 值
下表示出了这种形式的所有的略写算符、它们的扩展格式和它们的值。
这些算符只对int、float和vector类型定义。但是, += 算符也对string类型定义。 略写格式 扩展格式 值
变量 += 值 变量 = 变量 + 值 变量 + 值 变量 -= 值 变量 = 变量 - 值 变量 - 值 变量 *= 值 变量 = 变量 * 值 变量 * 值 变量 /= 值 变量 = 变量 / 值 变量 / 值 变量 %= 值 变量 = 变量 % 值 变量 % 值 float $mice = 25.3;
$mice -= 6; // $mice = $mice - 6; $mice %= 4; // $mice = $mice % 4; $mice /= 3; // $mice = $mice / 3; vector $kick = <<2, 3, 4>>;
$kick += <<7, 5, 1>>; // $kick = $kick + <<7, 5, 1>>
也有一个 ^= 算符,它仅仅是对vector定义的。该运算计算一个做矢量和右矢量operand的点积。 vector $ice = <<1, 2, 3>>;
$ice ^= <<2, 4, 4>>; // $ice = $ice ^ <<2, 4, 4>> 增量和减量
有一些略写算符可以用于对floats和ints进行加1和减1的运算。下表列出了这些算符、它们的扩展格式以及值。
略写格式 扩展格式 值 变量++ 变量= 变量+ 1 变量 变量-- 变量= 变量- 1 变量 ++变量 变量= 变量+ 1 变量+ 1 --变量 变量= 变量- 1 变量- 1
当增量或减量略写算符加到变量前面时,想象该增量或减量发生在该语句执行之前。 但是,当该算符加到了变量的后面,想象该增量或减量发生在该语句被执行之后。 float $eel = 32.3;
float $crab = $eel++; // $crab = 32.3; $eel = 33.3; $crab = $eel--; // $crab = 33.3; $eel = 32.3; $crab = --$eel; // $crab = 31.3; $eel = 31.3; $crab = ++$eel; // $crab = 32.3; $eel = 32.3;
注意:如果有多个增量或减量略写算符作用在同一语句的相同的变量上,则算符的运算顺序是无法预知的。应当避免这种情况。 4、比较
比较运算用于逻辑和关系表达式。 逻辑运算
逻辑的基础是语句是否为真或者假。逻辑算符决定一个语句是真还是假,然后执行相应的语句。
20