现在的位置: 首页 > 综合 > 正文

3dmax脚本教程 5

2013年10月11日 ⁄ 综合 ⁄ 共 2882字 ⁄ 字号 评论关闭

本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/

方便以后需要时候使用


1:addmodifier()语句
addmodifier()语句的作用是给场景中的某一个物体添加指定的修改器。譬如我们如果想给一个BOX添加一个UVW Map的修改器,就可以通过使用这个addmodifier()语句来实现。在3D MAX脚本字典中给出了它的标准使用方式为
addModifier <node> <modifier> [before:index] 
图片点击可在新窗口打开查看
观察图例:第一个窗口中给出了一条为:
-- Unable to convert: Taper to type: Modifier 
的报错返回值,现在我们来分析一下这句话的意思:他说不知道 Taper修改器的子类别参数,也就是说在taper导边修改器下面有那一个参数起作用?导边的片段数?还是圆滑程度?在现阶段的3DMAX中,使用addmodifier()语句这个参数是不能省的。如果我们只想添加一个修改器,不想去设置这个修改器,那么我们就可以添加一个:()
圆括号来解决这个问题。

如图第二次,我们添加了一个() 园括号,里面不写任何表达试和参数,他表示:不修改任何修改器中的指令。
图片点击可在新窗口打开查看
如图,在第二段代码进行了编译后,就得到了这张图中的BOX了
在这里我要特别的说一下UVWMap修改器的添加,这个比较特别。
图片点击可在新窗口打开查看
观察如图的内容,第一个窗口返回了一段报错提示:
-- Error occurred in anonymous codeblock 
-- Frame: 
-- uvwmapping: undefined 
-- Type error: Call needs function or class, got: undefined 
他的意思是说uvwmapping这个语句没有定义,这是为什么?为什么uvwmapping会没有定义,仔细观察我们3DMAX的修改器下拉菜单如下图。
图片点击可在新窗口打开查看
如果我们直接用鼠标来添加这个UVWMap修改器,那么在添加之前,他的名称是——UVWMap,但在添加个一个物体后,他的名称就变成了UVW Mapping。也就是说我们书写表达式的时候要使用UVWMap被添加给物体前的名称——“UVWMap”,添加后如果想对这个修改器进行什么参数设置的话,我们就要使用他被添加给一个物体后的名字“UVW
Mapping”。 

2: distance() 用来计算2物体间的距离
标准使用方法为: distance <point3> <point3>
读高中的时候碰到一道超级爆难几何题,要用空间向量求2个点之间的距离,想了一个下午还没有头绪。呵呵,后来晚上急了,我就拿3DMAX的distance()语句把这道题目给搞定了。
图片点击可在新窗口打开查看
distance()语句的使用方法很简单只要在distance这个单词后根上2个<Point 3>坐标点就OK了。来举一个比较简单的例子:有两个坐标点:a = [10,20,30], b = [100,30.5,41.3],现在a和b已经代表的是2个坐标点的数值了,我们只要直接输入distance
a b然后回车,系统就会返回点a和点b之间的距离了。

图片点击可在新窗口打开查看3:if
和case of语句

if 表达式用于有条件地执行一个表达式,这个表达式以布尔测试表达为结果为基础
if语句的使用方法为:
if <expr> then <expr> [else <expr> ]
if <expr> do <expr>
  
第一个<expr>是测试表达式,他的值一定要是true或者false,如果在这第一个<expr>测试表达式这里返回的值是true的话,那么就程序就回继续执行then或者do语句,然后结束。而如果第一个<expr>返回了一个false,则后面的else语句将会被执行。
注意:如果表达式中没有else语句,或者你编写的是第二中 if , do的格式,那么在第一个<expr>表达试返回false后,系统会自动中断程序编译,并返回一个undefined值。
例如:
mybox=box()
if mybox.height==25 
then mybox.width=40 
else mybox.width=100
他的意思是创建一个名称为mybox的BOX几何体,如果mybox的高为25那么,他的宽就为40,否则宽等于100。
在这里要特别理解我前面说的那句话:第一个<expr>是测试表达式,他的值一定要是true或者false。怎么理解?来看看下面这短代码为什么出错了:
图片点击可在新窗口打开查看
第一个窗口中返回了一句为:
-- Type error: if-test requires BooleanClass, got: 25
的报错,他的意思是说第一个<expr>测试表达式需要布尔函数类(真或假)。自己的体会一下这句话的意思,然后我们再来看看第一个<expr>测试表达式的代码:
if mybox.height=25
你能看出什么问题吗?系统说缺少布尔函数类这句话为什么会缺少布尔函数类呢?其实问题出在这个“=”等于号上面,在这里,等于号没有判断性,不能判断这个BOX的高度是否等于25。如果我们想让一句代码有布尔性质,那么我们就要使用“==”双等号,他表判断。这样程序就可以判断第一个<expr>测试表达式的真或者假,然后,把真或假的值传递给下一句代码。
如图,第2个窗口中使用了“==”双等号,使得程序按我们的表意进行正确的返回。
接下来我们就刚才的“==”双等号的问题来谈谈if语句中比较表达式,他可以是以下形式中的任何一种:
== 等于判断
!=不等于判断
>大于判断
>=大于或者等于判断
<小于判断
<=小于或者等于判断
其实我们可以发现,只要牵扯到了有关大于小于号的表达式,他们就已经具有了判断性了。
此外If语句还可以作为表达式的一部分,例如:x if a>b then else d
3.2:case of 表达试
case of表达式你可以把他看做是if语句的一个高级形式,你可以给出一组条件,这一组条件中可以有多个测试表达试,还可以为这多个测试表达式分别去定义他们的返回值,相比较if语句而言,他的选择不会局限于then 或者else的概念,case语句的选择可以是多个的。
个人观点:3DMAX的if语句设计的没有C++的更科学,不管从格式上说,还是执行方式来说,或许C++中if语句的设计,是为了更适合大型的复杂程序使用,但总的来说3DMAX的if语句并不是一个很好的编程风格,尤其是让别人阅读你程序的时候,程序思路就显的不如C++那么整洁和清晰。
他的标准语法是:
case [ <expr> ] of ( <cases> )
在这里<expr>是测试表达式,<cases>是表达失序列,譬如:
<factor>:<expr>
default:<expr>
default是一个标记,在case语句中是可以进行选择的,如果你给出一个组的条件都没有一条能和测试表达式匹配,default可以选择继续case 表达式。如果没有default标记,而且前面的一组条件中也都没有一条和测试表达式匹配,case表达式将返回一个undefined值。
以下是一个小例子
图片点击可在新窗口打开查看

抱歉!评论已关闭.