热烈欢迎新会员,新手报到帖招聘3DMAX脚本软件开发场景助手3.0下载飞浪脚本零起点入门
返回列表 发帖

[原创]飞浪脚本零起点入门系列(十二)多边形编辑 Editable Poly

声明:本教程为CG++原创,请尊重作者劳动,转载请注明,谢谢:)
上一节:飞浪脚本零起点入门系列(十一)样条线编辑Editable Spline

飞浪脚本零起点入门系列(十二)多边形编辑 Editable Poly
本节关键词:Editable_Poly Method, EditablePoly,bitarray

在此系列教程中,本人一直试图把自己学习maxscript的经验奉献给读者,当然我的方法肯定不是最好的,但是只要这些经验能帮助更多喜欢maxscript的人,本人的目的就达到了。前面的所有章节中,不是所有的地方100%正确,比如第八节,我建议大家在变量名前面加前缀,后来我在其他书上看到说这个命名方法早就过时了。本人并不是计算机科班出身,对于程序的理解描述有些地并不专业,甚至还会出纰漏,如果你发现有些地方有问题请不要惊讶,还请不吝指教。
maxscript的语法就像英语的语法,内置函数就像单词,而编写maxscript就是把内置函数按照语法写成句子,再按照一定的逻辑排版出来,出来的就是一个完整的代码。这些内置函数全部在maxscript reference里面,它就是一部牛津词典。查词典大家都会,不认识的可以用金山词霸,而造句需要有想法。在maxscript里面,这些想法并没有程序专业讲的数据结构那么高深,简单的组织一下就可以完成高效的工作。本节涉及到的主要函数在下面两个网页:
Editable_Poly Methods
http://www.cgplusplus.com/online-reference/maxscript-reference/source/editable_poly_methods.htm
Interface: EditablePoly
http://www.cgplusplus.com/online-reference/maxscript-reference/source/interface_editablepoly.htm
下面跟我一起来走近Editable_Poly吧!
创建一个茶壶保持选中,运行以下代码:
  1. polyOp.getNumVerts $
复制代码
咦?出错啦,得到如下结果:
-- Runtime error: EPoly operation on non-Editable Poly: Teapot
它说EPoly的操作运行在非Editable Poly的物体上导致出错,所以本节所讲的操作全部要在Editable Poly下运行啊。
那我们就把它转成EPoly:
  1. convertTo $ Editable_Poly
复制代码

再运行第一个代码polyOp.getNumVerts $
得到结果530,这个是此茶壶的点的总数量。看上面那句代码,polyOp是一个已经编写好的结构,里面包括了许许多多的EPoly操作函数,运行一下polyOp得到如下结果:
#Struct:polyop(
  getEDataChannelSupport:<fn>,
  getMapFace:<fn>,
  makeEdgesPlanar:<fn>,
  capHolesByFace:<fn>,
  makeVertsPlanar:<fn>,
  setSlicePlane:<fn>,
  getEdgeVerts:<fn>,
  getDeadVerts:<fn>,
  getNumVerts:<fn>,
  ......
调用这些函数只需要用点语法即可。函数的说明在本文开头介绍的网页里面。polyOp.getNumEdges $是获取边的总数,polyOp.getNumFaces $是获取面的总数。下面我用场景助手里面的随机选择点、线、面、元素来说说EPoly的基本操作。
选择茶壶的一些点,运行代码:
  1. polyOp.getVertSelection $
复制代码
得到类似于下面的结果:
#{61..65, 129..132, 193..196, 246..247, 517..518}
这些是什么东东?getVertSelection的作用是获取选中的点,返回的就是这些点的信息了,那这结果有什么意义呢?其实我们得到的结果是一个bitarray,它是另一种数据常量,前面没有细讲。这里顺带讲一下。bitarray字面意思是位数组,我们知道数组#(1,2,3)用的是中括号,而位数组用的是大括号:#{1,2,3};数组里面的元素可以是任何数据,而位数组里面只能是正数。bitarray里面的数字只是一个开关,
表示在此bitarray里面,此位置是true还是false。怎么理解呢?bitarray对子元素的访问跟array一样,如有以下代码:
  1. bitarr=#{1,3,5,6,7}
  2. for i in 1 to 7 do print bitarr[i]
复制代码
得到的结果是true,false,true,false...,上面的#{1,3,5,6,7}表示1,3,5,6,7这四个位置是开启的,所以为true,用在EPoly可以表示选中了第1,3,5,6,7个点。而其他的数字在上面的bitarray里面都是false在EPoly里面可以表示这些点没有选中。可以用两个小点表示两个及以上的连续数字,如上面的bitarr可以写成#{1,3,5..7}。现在再回头看看上面得到的点的信息:#{61..65, 129..132, 193..196, 246..247, 517..518},这个bitarray在61到65的位置是true,所以这些点是选中的,后面类推。下面是对bitarray一个直观的解释:
  1. bitarr=#{1,3,5..7} --假设有一排灯,分别以1,2,3,...编号,这个数组就表示只打开了1,3,5,6,7号灯
  2. bitarr.count --表示此bitarr中的最大的数字(打开的灯中最大的编号),在这里是7,注意这里跟array不同
  3. bitarr.numberset --表示此bitarr中所有为true的元素的数量(所有打开的灯的数量),这里才是array里面的count
  4. bitarr[1]=false --把1号位的灯关掉
  5. bitarr[12]=true --把12号位的灯打开
  6. bitarr.count --此时打开的灯中最大的编号变成了12
  7. bitarr as array --把bitarr转变成了array,自己观察一下结果
  8. #(1,2,3,55,57,98,99,100) as bitarray --当然array也可以转变成bitarray,但是array里面的元素必须为正数
复制代码
回到EPoly中来,怎么样选中自己设定的点呢?执行如下代码:
  1. polyOp.setVertSelection $ #{1..100} --选中EPoly的第1到100个点,切换到点层级就能看到效果
复制代码

(转二楼)
3

评分人数

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

@feilang
能不能得到 一条Edge的长度呢

TOP

不知现在流行的命名方法是怎么样了??刚开始学脚本,所以问问,,,这里有挖坟一说吗..
linkvebo 发表于 2013-6-4 17:18



   自己习惯就行,可以google一下变量命名法,挑一个你自己喜欢的就行。

TOP

比如第八节,我建议大家在变量名前面加前缀,后来我在其他书上看到说这个命名方法早就过时了


不知现在流行的命名方法是怎么样了??刚开始学脚本,所以问问,,,这里有挖坟一说吗..

TOP

支持飞浪的教程简单易懂!我喜欢!

TOP

浪哥威武啊!等你的书

TOP

太牛了,学习中!!!!

TOP

看过一些关于MAXSCRIPT的教程,王华的书我买了,好多看不懂,就是直接翻译帮组文件。

有本老虎工作室的书看过,懂了,写的还好,就是量太少。

希望浪哥可以继续写下去,如果您方便的话。浪哥的教程我很喜欢。

谢谢

TOP

经过昨天的摸索,发现可以不塌陷也能取到顶点等信息了!
的确想写好脚本就要满Reference到处找,无限的搜索...
我爱游戏,我爱编程!

TOP

飞浪你好,我最近在尝试自己写模型导出脚本,但是看了你的文章之后有一个疑问!
我目前在用的许多导出插件,功能都不错,不过格式都和我程序中的多少有些出入都需要再次转换!
所以我想自己写一套脚本!
但是在你的文章中介绍方法都是对现有模型的操作!
可是我并不想对现有模型做任何修改,比如一个我建了一个BOX,也许给它赋了材质,也许还给它绑了骨骼!
但是我并不需要先塌陷它才能取得点面等信息,像Panda的插件一样直接导出信息!
而且因为我的程序中对各物体的名称以及层级关系要求比较严格,所以克隆一套塌,陷取数据,再删除的办法也不太好!
那还有什么办法嘛?

TOP

返回列表