热烈欢迎新会员,新手报到帖maxscript BUG和技巧收集场景助手3.0下载飞浪脚本零起点入门
返回列表 发帖

欢迎捐助本站:支付宝账号 cgplusplus@qq.com,谢谢支持!

[原创]飞浪脚本零起点入门系列(十一)样条线编辑Editable Spline

声明:本教程为CG++原创,转载请注明,谢谢合作:)

查看上一节:飞浪脚本零起点入门系列(十)macroscript编写快捷方式

飞浪脚本零起点入门系列(十一)样条线编辑Editable Spline

本节关键词: SplineShape

-----------我是废话的分割线---------------
当我点开飞浪脚本零起点入门系列第一节时,发现发表日期为2008年9月2号。到如今已近两年了。两年,足以恋个爱生个娃了。不知道两年前跟我们一起学脚本的人如今是否还在坚持...
-----------我是正题的分割线---------------
线条塌陷后,用classof $检查会发现有两种类型,SplineShape和line,line是由线条创建面板里面的line创建的,塌陷后还是line。这里,本人主要讲SplineShape。这节里,我会讲如何创建样条线以及如何利用样条线工作。后面用到的样条线函数,在帮助里面搜索SplineShape和shape都可以找到。

创建样条线
创建一条线段:
  1. ss=SplineShape ()
  2. addNewSpline ss
  3. addKnot ss 1 #corner #line [0,0,0]
  4. addKnot ss 1 #corner #line [100,0,0]
  5. updateshape ss
复制代码
运行以上所有代码,就创建了一条线段,线段一个点在[0,0,0],另一个点在[100,0,0]。以上代码包涵了创建样条线的最基本流程,下面逐步解析:
ss=SplineShape ()
--首先创建一个spline并赋给变量ss,注意,此时此线条是空的,什么都没有。
addNewSpline ss
--然后在此线条里面加一条线spline,此时线条还是空的,因为没有点。
addKnot ss 1 #corner #line [0,0,0]
addKnot ss 1 #corner #line [100,0,0]
--再在线条里面加点,1表示在第一个spline里面加点,#corner表示角点,有#smooth | #corner | --#bezier | #bezierCorner 可供选择。#line表示是直线,有#curve | #line可供选择。
updateshape ss
--最后更新线条,注意这一步必须要,否则MAX会挂的。
创建一个矩形:
  1. ss=SplineShape ()
  2. addNewSpline ss
  3. addKnot ss 1 #corner #line [0,0,0]
  4. addKnot ss 1 #corner #line [100,0,0]
  5. addKnot ss 1 #corner #line [100,100,0]
  6. addKnot ss 1 #corner #line [0,100,0]
  7. close ss 1
  8. updateshape ss
复制代码
观察上面的代码,首先把矩形的四个点加入到线条中,这样只会形成一个U字形的线框,最后用close关闭线条就可以。
画多条线:
  1. ss=SplineShape ()
  2. addNewSpline ss
  3. addKnot ss 1 #corner #line [0,0,0]
  4. addKnot ss 1 #corner #line [100,0,0]
  5. addNewSpline ss
  6. addKnot ss 2 #corner #line [0,20,0]
  7. addKnot ss 2 #corner #line [100,20,0]
  8. addNewSpline ss
  9. addKnot ss 3 #corner #line [0,40,0]
  10. addKnot ss 3 #corner #line [100,40,0]
  11. updateshape ss
复制代码
上面一共用了3次addNewSpline,画了3条线
合并两个线条:
  1. a=Rectangle()
  2. b=Circle()
  3. convertToSplineShape a
  4. convertToSplineShape b
  5. addAndWeld a b 0
复制代码
创建一个矩形和一个圆塌陷成样条线,将b合并到a里面。addAndWeld 最后的0表示焊接的阈值,如果合并后a,b线条的终点距离在此范围之内就将焊接到一起。
关于splineshape的函数请看这里:
http://www.cgplusplus.com/online-reference/maxscript-reference/source/splineshape_shape.htm
沿路径复制:
画一条曲线并保持选中,运行以下脚本:
  1. for i in 0 to 1 by 0.1 do
  2. (
  3. p=pathInterp $ 1 i
  4. sphere pos:p
  5. )
复制代码
可以看到沿着此线条创建了球体
pathInterp 路径插值,根据路径控制的比例(基于点),用0.0到1.0之间数值返回线条上的一个对应点坐标。
对线条的一些操作方法:
http://www.cgplusplus.com/online-reference/maxscript-reference/source/shape_common_properties_operators_and_methods.htm
下面这个实例是分离样条线里面的线条,里面对一些常用函数作了说明:
  1. fn fl_detachSplines ss =
  2. ( --分离线条,By feilang ,from CG++
  3. numsp = numsplines ss --获取线条spline数量
  4. sp=#()--用于收集分离后的线条
  5. if numsp > 1 then
  6. ( --遍历每个spline,然后记录每一个点的信息,根据这些信息重新生成线条
  7. for i in 1 to numsp do
  8. ( tempS = splineShape pos:(getKnotPoint ss i 1) --创建一个空样条线
  9. addNewSpline tempS --增加一个线条spline
  10. for k in 1 to numKnots ss i do --遍历原样条线中某个spline上的所有点,并增加到新创建的线条中
  11. --addKnot是加点,getKnotType获取原线条点的点类型,getKnotPoint获取原线条点的坐标
  12. --getInVec和getOutVec是获取原线条点的手柄坐标,这些信息都添加到对应的新点上面
  13. addKnot tempS 1 (getKnotType ss i k) #curve (getKnotPoint ss i k) (getInVec ss i k) (getOutVec ss i k)
  14. if isclosed ss i then close tempS 1 --判断原线条是否关闭,如果是关闭的,新线条也要关闭
  15. updateShape tempS --更新线条,必不可少!!!
  16. append sp tempS
  17. )
  18. )
  19. delete ss --删除原线条
  20. sp
  21. )
复制代码
运行后,直接使用 fl_detachSplines $
下面把分离后的线条选中,运行代码:
  1. fn fl_collapseSplines ssarr =
  2. ( --合并线条,By feilang, from CG++
  3. ss=for s in ssarr where classof s == splineshape or classof s == line collect s
  4. for i in 2 to ss.count do addAndWeld ss[1] ss 0
  5. if ss.count!=0 then updateshape ss[1]
  6. ss[1]
  7. )
复制代码
再运行fl_collapseSplines $ ,没错,它们又合并到一起了。
认真理解上述代码,你对spline的操作概念应该会有个了解,其实可以把splineshape简单的看作一个多维数组,splineshape下面有spline1,spline2,spline3...每个spline下面又有点1,2,3...所以要知道一个点knot,就要知道它是属于哪个spline。更多实用的函数躺在帮助文档里面,期待你去唤醒它们。
本节结束!
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

欢迎捐助本站:支付宝账号 cgplusplus@qq.com,谢谢支持!

终于有这方便的教程了,学习一下!!!

 

借问,如果在一条曲线上平均排列几个BOX(间隔工具效果),其对应旋转的角度如何求得?

[此贴子已经被作者于8/11/2010 6:09:22 AM编辑过]

TOP

欢迎捐助本站:支付宝账号 cgplusplus@qq.com,谢谢支持!

糗百上的分割线,在这里也有呀~~


你怎么不先写POLY的呀?

TOP

顶起。。。。。浪兄好久没有出系列了。。。。

有好的技术才有更好的明天!身体好重要*^_^*哦!

TOP

QUOTE:
以下是引用yrandommen在8/11/2010 9:04:37 PM的发言:

终于有这方便的教程了,学习一下!!!

 

借问,如果在一条曲线上平均排列几个BOX(间隔工具效果),其对应旋转的角度如何求得?

[此贴子已经被作者于8/11/2010 6:09:22 AM编辑过]

pathTangent 可以获取线条上某个位置的切线向量,你查下帮助~~

TOP

QUOTE:
以下是引用kevin在8/12/2010 3:11:29 PM的发言:

顶起。。。。。浪兄好久没有出系列了。。。。

是好好久没写了,一晃两年了,鸭梨大啊~~~

TOP

路过,顶起

TOP

以下是引用feilang在8/12/2010 3:21:40 PM的发言:
       
         
是好好久没写了,一晃两年了,鸭梨大啊~~~
       
难道是俺嘀提问燃起了飞浪大嘀欲望?:-o罪过啊 感谢大大的解疑

TOP

一直关注,顶啊~~~~~~~~~~~~~

TOP

QUOTE:
以下是引用feilang在8/12/2010 3:17:06 PM的发言:

pathTangent 可以获取线条上某个位置的切线向量,你查下帮助~~

感谢浪哥“指点江山,激扬脚本”!!!

 

TOP

返回列表