• 3D脚本 maxscript入门教程(4)


    3D脚本 maxscript入门教程(4)

     (2013-05-23 18:26:25)
    标签: 

    3dmax

     

    maxscript

     

    建模

     

    it

    分类: 脚本
     
    4、流程控制

    通过以前的学习,我们知道使用构造器来创建单个的对象,现在就来大量创建对象,轻松地完成手工要费很大的力气才能完成的事。

    for 循环

    输入 :
    for i in 1 to 4 do box pos:[i*50,0,0]
    看看下面的flash动画可以形象的理解for循环。
    for循环动画

    if 条件

    x=20
    y=65
    if x>y then print x else print "x没有y大"
    --第三句的中文意思是:如果 x 大于 y 那么 打印 x 否则 打印 "x没有y大" ,结果返回 "x没有y大"。继续输入:
    x=70
    if x>y then print x else print "x没有y大"
    --结果返回70

    综合使用

    fc=freecamera pos:[-100,0,0]
    rotate fc (EulerAngles 90 0 -90)
    move fc [-100,0,0]
    for i in 1 to 6 do sphere pos:[i*30,0,0] segments:16 radius:10

    输入上面代码,生成场景对象备用  。


    现在根据物体离摄影机的距离调整物体的分段数,摄影机在X轴-100位置上,离它最近的一个球体在X轴30的位置上。测量两个对象之间距离的函数是distance,输入:distance fc $sphere01 返回130.0,说明摄影机和左边的第一个球体之间的距离是130。输入:
    for i in $sphere* do
         if distance fc i>160 then i.segs=4
    距离摄影机大于160的球体分段数精简到4。


    输入:
    for i in $sphere* do (
    if distance fc i>180 then i.segs=8
    if distance fc i>240 then i.segs=4
    )
    注意,代码块要用( )包起来,不然程序只执行第一个if语句。这段代码使距离摄影机大于180的球体分段数精简到8,大于240的球体分段数精简到4 。

    4、动画原理

    设置两个不同的关键帧就可以动画了。输入下面的代码创建球体没X轴的运动的动画:
    s=Sphere pos:[-50,0,0] radius:10
    animate on
    (
    at time 0 s.pos.x=-50
    at time 100 s.pos.x=50
    )



    四、换一角度——从大家熟悉的操作流程来学习脚本
    这是对前面知识的总结,前面是对语法基本概念的学习,现在是从大家操作流程的角度来学习,一纵一横,让我们对脚本有个相对全面的了解,理论和实际相互联系。 有了前面的基础才好学下面的内容。
    第一步:创建物体

    创建目标摄影机

    方法见示例栏目中《地面和树-混合材质的用法》一文

    第二步:选择物体

    这里说的是广义上的选择,即操作指定的对象。以前要改变场景中的对象,首先要选择这个对象。在MAXScript中可以在对象没有被选中的情况下改变对象。这要综合运用前面讲到的路径名,选择集,内置对象集,流程控件等等。

    遍历选择集

    先随便创建几个对象,然后选择它们,例如输入:
    box()
    box()
    sphere()
    cylinder()
    sphere()


    先用手工把它们全部选择,此时这些被选择的对象被称为选择(selection),这是对象集之一。输入下面的代码进行遍历选择的第一个对象,把它们的名字显示出来:
    for i in selection do print i.name
    返回结果如下:
    "Box02"
    "Cylinder01"
    "Box01"
    "Sphere02"
    "Sphere01"
    输入 selection.count,结果返回5,说明选择的总数是5个。
    输入 selection[1],结果返回$Box:Box02 @ [0.000000,0.000000,0.000000],说明第一个元素是Box02。

    这和前面的for循环有什么区别?前面的是for i in 1 to 4 do box pos:[i*50,0,0] , 变量i的范围在1到4,这里是对象集合selection,集合已经存在变量的范围了,这个变量 i 就是那些对象本身,遍历的次数就是选择的总数5,当第一次循环时,程序就找到选择集中的第一个元素Box02,相当于 selection[1],其它以此类推。下面的代码进行更复杂的操作,把它们沿X轴间隔为40个单位进行分开:
    for i in 1 to selection.count do selection.pos.x=selection.pos.x+i*40


    这里的i是数目,selection是元素,是元素的索引,根据 i 的值指向对应的元素,在这里是指向那五个对象之一。

    根据指定条件选择

    继续使用上面创建的对象。

    示例1:根据对象是否具备某种属性来选择

    for i in geometry where hasProperty i "radius" do i.pos=10
    在创建的几何体中把具有半径属性的物体选择出来,并改变半径大小。结果那两个球体和一个圆柱体的半径变成10。where是表示指定的条件, hasProperty i "radius" 是条件,用来判断对象 i 是否具有 radius 属性,返回true或者false。


    示例2:根据对象是否符合指定类来选择

    for i in Geometry where classOf i = = box do i.pos = i.pos+[0,30,0]

    示例3:根据对象的属性值是否符合指定值来选择

    for i in Geometry where i.pos.y ==0 do i.pos = i.pos+[0,30,0]
    Y轴坐标为0的对象都向Y轴移动了30。

    第三步:变换物体
    1、变换方法:postion,move,scale,rotate,前面已经讲过。

    2、变换坐标系和变换中心

    变换坐标系统:coordsys关联表达式

    [ in ] coordsys world 使用世界空间坐标系统

    [ in ] coordsys local 使用对象自身的坐标系统

    [ in ] coordsys parent 使用对象的父坐标系统

    [ in ] coordsys grid 使用网格坐标系统

    [ in ] coordsys screen 使用屏幕坐标系统

    [ in ] coordsys 使用指定的节点对象坐标系统,相当于在界面中以拾取的对象作为坐标系统


    变换中心: about关联表达式

    about selection 以选择集为变换中心

    about pivot 以对象的基准点为变换中心

    about coordsys 以当前使用的坐标系统的原点为变换中心  

    about 以拾取的节点对象的基准点为变换中心

    示例一:基本功
    先创建两个对象作为示例物体:
    cy=cylinder()
    b=box length:10 50 pos:[100,0,0]

    然后分别执行下面的代码:
    rotate b (EulerAngles 0 0 90)
    --box旋转了自身90度。


    in coordsys world rotate b (EulerAngles 0 0 90)
    --box旋转了自身90度,和上面相同,这是因为变换中心默认是使用对象自身的基准点。

    in coordsys world about coordsys rotate b (EulerAngles 0 0 45)
    --围绕世界坐标系旋转了45度,变换中心是世界坐标系中心。


    in coordsys cy about coordsys rotate b (EulerAngles 0 0 90)
    --变换坐标系是圆柱体cy,b以圆柱体cy坐标系原点为变换中心旋转了90度。


    示例二:小应用--一张桌子四条凳
    zhuozi=cylinder radius:80 height:60 wirecolor:white
    for i in 1 to 4 do (
    dengzi=box length:50 height:40 pos:[100,0,0] wirecolor:white
    in coordsys zhuozi about coordsys rotate dengzi (EulerAngles 0 0 (90*i))
    )
  • 相关阅读:
    Httpclient5工具类
    temp
    《On Java 8》笔记 2
    《On Java 8》笔记
    《Effective Java》笔记 4~5
    Oracle数据库对比MySQL
    《Effective Java》笔记
    [BUAA2021软工]结对第一阶段博客作业小结
    Spring Boot入门
    MyBatis入门
  • 原文地址:https://www.cnblogs.com/superjn/p/6179438.html
Copyright © 2020-2023  润新知