maxscript吧 关注:113贴子:450

请求大佬们帮助

只看楼主收藏回复

aa = $* as array
ca=TargetCamera pos:[50,50,50] --设置摄像机位置
for i in aa do
(
bb= print i.name as string
move $92903A005 [50,50,50]
tobj=targetobject pos:[0,0,0] --设置摄像机目标点的位置(ca 和 tobj的连线其实就是照相的方向,决定着之后以何种角度给房子 拍照渲染)
ca.target=tobj
render camera:ca outputFile:
("D:\\3dmax_ls\\"+bb as string+".jpg") vfb:off ?
)
我的目的是把每一个模型都移到单独位置并用相机对着渲染。但是相机的坐标和模型的坐标不统一啊!
同样[50,50,50]出来后确是一个东一个西
请大佬们帮我看看 里面哪些有问题,move $i [50,50,50],无法运行。填入模型名是为了试坐标


IP属地:广东1楼2019-12-13 10:19回复
    原来move $* [*,*,*]是移动 不是置位置值
    请问大佬,置位置值怎么写?


    IP属地:广东2楼2019-12-13 10:48
    回复
      2025-05-17 21:04:53
      广告
      只能自己顶


      IP属地:广东3楼2019-12-13 13:34
      回复
        for i = 1 to 10 do
        (
        k=i*30
        mybox=box ()
        mybox.name=k as string
        mybox.pos=[k,0,0]
        )
        aa = $* as array
        for i in aa do
        (
        p= print i.name as string
        move $p [50,50,50]
        --move $30 [50,50,0]
        )
        到底是哪里除了问题 我不会语法


        IP属地:广东4楼2019-12-13 14:24
        回复
          4楼的问题
          直接 move i [50,50,50] 就行了, i 就代表来$Box:30 至 $Box:300
          上面那堆代码可以直接写在一起就是
          for i = 1 to 10 do
          (
          k=i*30
          mybox=box ()
          mybox.name=k as string
          mybox.pos=[k,0,0]
          move mybox [50,50,50]
          )
          不过既然用pos定位了,就没必要在做移动来吧
          可以直接 mybox.pos=[k+50,50,50]
          或者 move mybox [k+50,50,50]


          IP属地:广东5楼2019-12-21 00:10
          回复
            然之后1楼的问题有两个方法
            你有一部相机
            ca=TargetCamera pos:[0,50,50]
            tobj=targetobject pos:[0,0,0]
            ca.target=tobj
            还有一堆待渲染的对象
            如果每一对象都是一个整体用
            objs = selection as array
            如果每一对象都是一个组,里面包含若干物体,就用这个
            objs = for o in selection where not(isGroupMember o) or (isOpenGroupMember o) collect o
            1、可以通过循环让相机依次对准每一个对象进行渲染
            for o in objs do
            (
            ca.pos=o.pos+[0,50,50] --移动相机位置
            tobj.pos=o.center --移动相机目标位置
            render camera:ca outputsize:[400,400] quiet:true outputfile:("D:\\"+o.name+".jpg") --渲染
            )
            2、架好相机,然之后通过循环把对象移到相加位置渲染,然之后再移回去
            for o in objs do
            (
            oldpos = o.pos --记录原本位置
            o.pos = [0,0,0] --移到相机位置
            render camera:ca outputsize:[400,400] quiet:true outputfile:("D:\\"+o.name+".jpg") --渲染
            o.pos = oldpos --放回原本位置
            )


            IP属地:广东6楼2019-12-21 00:10
            收起回复
              非常感谢@sinxye 大佬的回答与帮助!
              大神,我的没有规范学习过编程。就是初中时喜欢,然后选择易语言进行自学。
              近期公司让我写一款清点出场景中所有模型中“相同模型”的各个“不同材质”的模型数量
              但我不会Maxscript,只能硬着头皮用易语言写了个脚本,但方式是通过模型名称。
              如 123456A、987654A;场景中复制模型即自动命名为123456A001、987654A001.
              以此取*A的格式在场景中搜索出同类配件来清点。
              由于需要配图,成千种配件加上十来种甚至更多种材质。人工一个材质一张图的渲和保存,实在工太大。
              所以来请教大神这个问题。语法我是一点都不懂,一部分在网上抄袭,一部分自己理解后乱写的,大神见笑了!
              大神,我发现的场景中模型,即使用o.pos = [0,0,0]仍无法全部归到同一个点上。
              是什么问题呢?本身建模的中心点问题吗?
              还有就是,请问大神,有没有办法通过外形遍历出所有相同外形的模型。不通过名称来寻找。
              因为外面搭建进来的通过转换后,名字都是混乱的。没办法做到名称格式规范。这个问题好费我的脑
              再次感谢大神的回答,膜拜一下大神!


              IP属地:广东7楼2019-12-21 11:20
              收起回复
                objs = $* as array
                ca=TargetCamera pos:[50.4,44.5,42.7]
                tobj=targetobject pos:[0,0,0]
                ca.target=tobj
                for o in objs do
                (
                oldpos = o.pos --记录原本位置
                text=o.name+o.Material.name
                --o.rotation = (quat -0 0 0 0)
                o.rotation = (quat 0.707107 0 0 0.707107)
                wz=o.max-o.min
                x=o.max.x-o.min.x
                if (wz.x>wz.y )then
                (
                if(wz.x>wz.z)then
                (
                ss=wz.x
                )
                else
                (
                ss=wz.z
                )
                )
                else
                (
                if(wz.y>wz.z)then
                (
                ss=wz.y
                )
                else
                (
                ss=wz.z
                )
                )
                y=ss/2.7*5.04
                y1=ss/2.7*4.45
                y2=ss/2.7*4.27
                ca.pos= [y,y1,y2]
                o.pos = [0,0,0] --移到相机位置
                --render camera:ca outputFile:
                --("D:\\3dmax_ls\\"+text+".png") vfb:off ?
                render camera:ca outputsize:[640,274] quiet:true outputfile:("D:\\3dmax_ls\\"+text+".png") vfb:off ?--渲染
                o.pos = oldpos --放回原本位置
                )
                暂时调整成这样,有一些我觉得应该是不可抗力因素,导致渲染效果不理想。
                模型大小不同,又要实现图占比最大化。不然拖进Excel表格空间又有限,太多空白位置导致图片缩的太小。
                所以目前个别件腾出渲染区域外。
                大神,请问改为渲染视口怎么写?这样就可以通过系统自带的最大化选定对象来实现。
                @sinxye


                IP属地:广东8楼2019-12-21 16:49
                回复
                  2025-05-17 20:58:53
                  广告
                  objs = geometry as array
                  sortObjs = #()
                  while objs.count != 0 do
                  (
                  a = objs[1]
                  deleteItem objs 1
                  temp = #(a)
                  if objs.count > 0 then
                  (
                  Size = nodeGetBoundingBox a a.transform as string
                  Count = getPolygonCount a as string
                  for o in objs do
                  (
                  oSize = nodeGetBoundingBox o o.transform as string
                  oCount = getPolygonCount o as string
                  if oSize == Size and Count == oCount do append temp o
                  )
                  if temp.count > 1 then
                  (
                  for o in temp do
                  (
                  n = findItem objs o
                  if n != 0 do deleteItem objs n
                  )
                  sortMats = #()
                  while temp.count != 0 do
                  (
                  b = temp[1]
                  deleteItem temp 1
                  temp2 = #(b)
                  if temp.count > 0 then
                  (
                  for o in temp do if o.mat == b.mat do append temp2 o
                  if temp2.count > 1 do
                  (
                  for o in temp2 do
                  (
                  n = findItem temp o
                  if n != 0 do deleteItem temp n
                  )
                  )
                  append sortMats temp2
                  )
                  else append sortMats temp2
                  temp2 = #()
                  )
                  append sortObjs sortMats
                  )
                  else append sortObjs #(temp)
                  )
                  else append sortObjs #(temp)
                  temp=#()
                  )
                  format "本场景中有%类物体\n总计%个\n" sortObjs.count geometry.count
                  for i=1 to sortObjs.count do
                  (
                  format "\t第%类物体:\n" i
                  c = 0
                  for j=1 to sortObjs[i].count do
                  (
                  format "\t材质 % 小计%个\n" sortObjs[i][j][1].mat sortObjs[i][j].count
                  c += sortObjs[i][j].count
                  )
                  format "\t共计%个:\n" c
                  )
                  这个脚本能清点出场景中相同的模型及相同模型里不同材质的数量
                  其实深奥的编程我也不会,用来比较笨点方法,所以写的比较长点
                  大概点思路就是用来两个嵌套的While...do...循环,第一个先依据大小及点面数分分类出不同的物体,然之后再在相同点物体里面分类出不同的材质,最终得到一个套了三层的集合


                  IP属地:广东9楼2019-12-22 12:16
                  回复
                    要单独渲染每一模型(一个单一的网格物体,如果是一个组点话就复杂点了)的话,我觉得下面这个思路也可以
                    首先先隐藏所有模型,当然也可以手动操作
                    for o in objects do o.isHidden=true
                    然之后通过循环一个个显示出来--最大化--渲染(直接渲染窗口,不架相机)--再隐藏起来
                    其中 geometry 只是指的几何体,上面点 objects 指的是所有点物体,包括灯光、相机之类点
                    for o in geometry do
                    (
                    o.isHidden=false
                    max tool zoomextents all
                    render vfb:false outputsize:[400,400] quiet:true outputfile:("D:\\"+o.name+".jpg")
                    o.isHidden=true
                    )
                    完成之后再将所有模型显示出来
                    for o in objects do o.isHidden=false


                    IP属地:广东11楼2019-12-22 12:27
                    回复
                      在我眼里您就是大神。
                      谢谢指点,我回去后去学习一下,有问题再厚脸皮向大神求救。
                      还有顺便问一下大神,取字符串部分格式怎样操作?如 123456A、123456A001、123456A002等取得123456A,或者G1-01-01、G1-01-011、G1-01-012取得G1-01-01。
                      以及数组在Maxscript中怎么写?
                      定义,附量,遍历。
                      我曾用数组遍历方式记录是否存在重复,不做重复记录。但是来到Maxscript完全不会表达
                      大神见笑了。
                      还有,今天是冬至,祝大神开心,发财,得意,妹纸集群。


                      IP属地:广东来自Android客户端12楼2019-12-22 15:08
                      收起回复
                        objs = geometry as array ---obj=取所有几何物
                        sortObjs = #()---定义新变量 sortObjs为数组
                        while objs.count != 0 do--判断循环 条件:场景中有几何物
                        (
                        a = objs[1] --附量a取首个几何物
                        deleteItem objs 1--删除obj成员中此次拿出来对比的a
                        temp = #(a)--定义储存结果的新变量temp并加入a
                        if objs.count > 0 then--已经删除了对比几何物的场景中还存在几何物,假如不存在那场景中只有一个
                        (
                        Size = nodeGetBoundingBox a a.transform as string--这里不懂了,没有用过函数nodeGetBoundingBox
                        \\理解是大小,难道是模型的长宽高?
                        Count = getPolygonCount a as string--难道是包含模型的点数与面数?
                        for o in objs do --遍历场景中剩余的几何物并赋o
                        (
                        oSize = nodeGetBoundingBox o o.transform as string
                        oCount = getPolygonCount o as string--同上取其信息
                        if oSize == Size and Count == oCount do append temp o--对比,相同则temp数组加入新成员o
                        )--遍历结束
                        if temp.count > 1 then--不同来了,没加入说明a的相同外形只有一个,下面先开始有相同外形的程序
                        (
                        for o in temp do--以储存与a相同外形的数组为循环开始
                        (
                        n = findItem objs o--寄存器n寻找主体中temp的成员
                        if n != 0 do deleteItem objs n--逐个删除,使主体寄存器不存在与对比物a相同外形的模型
                        )--循环结束,主体变量中已不存在与对比物相同外形的模型。
                        sortMats = #()--新数组变量
                        while temp.count != 0 do--判断循环,以temp删除完成员结束,
                        \\这里temp储存着相同外形,结束意味着开始下一个外形
                        (
                        b = temp[1]--寄存器b赋量
                        deleteItem temp 1--后来重新理解,同第一步,删除自身使b作为对比物
                        temp2 = #(b)--新数组 阿2赋量b
                        if temp.count > 0 then--删除后小于或等于0则说明相同外形只有一个
                        \\上面已经通过判断,temp至少有2个,这里删除首个,应该还有1个以上
                        \\再往下看看
                        (
                        for o in temp do if o.mat == b.mat do append temp2 o--刚刚删除的是对比物b,以剩下的与a相同外形来循环
                        \\据理解o.mat是代表此模型材质。if 与b.mat相同 加入数组中
                        if temp2.count > 1 do--上面的循环已结束,此时temp2所有成员材质相同
                        (
                        for o in temp2 do--来来来,遍历材质相同的成员
                        (
                        n = findItem temp o--n再次出场,寻找开始
                        if n != 0 do deleteItem temp n--挨个删除相同外形中与首个材质相同的成员
                        \\此时temp中已去除首个材质(与temp2相同的材质),有可能剩下其他材质,也有可能已经完蛋。
                        )--遍历结束
                        )--如果.....呃,如果temp2的材质在temp中只有一个相同,temp2.count会=1,直接跳来这里
                        append sortMats temp2--先加储存相同材质的temp2赋入刚刚定义的新数组sortMat
                        )
                        else append sortMats temp2--删除temp中首个模型后temp没有数据会直接来到这里
                        temp2 = #()--这里咨询一下大神,为什么只有一个模型的情况下,要重置temp2
                        \\重新理解了一下,重置无论只有一个或多个,都会执行,这么说重置为了下一条循环到这里不会混乱
                        )
                        append sortObjs sortMats--大神,这里我没找到sortObjs的定义命令,难道直接赋入语句中相等于定义了?
                        )
                        else append sortObjs #(temp)--前面主体删除首个后等于0会直接来这里,也就是说场景中只有一个模型
                        )
                        else append sortObjs #(temp)---好像对应前面的while,这不是一个循环判断语句吗?为什么还有否向?
                        \\我印象中循环语句不符合则直接不在循环内,这个else是语句的结束语吗?
                        temp=#()
                        )
                        format "本场景中有%类物体\n总计%个\n" sortObjs.count geometry.count
                        for i=1 to sortObjs.count do
                        (
                        format "\t第%类物体:\n" i
                        c = 0
                        for j=1 to sortObjs[i].count do
                        (
                        format "\t材质 % 小计%个\n" sortObjs[i][j][1].mat sortObjs[i][j].count--这里是我惊奇的地方
                        \\数组竟然可以[a][b][c]多个子成员
                        c += sortObjs[i][j].count--请问大神 !=不等于 +=自身再加,那-=是不是自身再减?==又是什么?大于并等于呢?
                        )
                        format "\t共计%个:\n" c--不明白\t的作用
                        )
                        \\最后,我用四个字就能概括这篇代码
                        \\大神牛逼!
                        @sinxye


                        IP属地:广东13楼2019-12-23 11:18
                        收起回复
                          我自己做了下注释,你参照下
                          objs = geometry as array --取场景中所有的几何体,将它们装进一个叫objs的集合
                          sortObjs = #() --定义一个叫sortObjs的空集合
                          while objs.count != 0 do --直到objs里的元素数量为0为止,执行下面的循环
                          (
                          a = objs[1] --每次循环开始时先取objs里的第一个元素,赋予一个叫a的变量,作为参照对象
                          deleteItem objs 1 --删掉objs里的第一个元素,因为前面已经将它取出来做参照了
                          temp = #(a) --定义一个叫temp的集合,并把变量a装进去
                          if objs.count > 0 then --如果说取出第一个元素后,objs还有其他元素,就执行往下执行,如果没有了就跳到后面else的语句
                          (
                          Size = nodeGetBoundingBox a a.transform as string --求几何体a的边界框并转为字符串,nodeGetBoundingBox得出的结果是一个集合,集合之间不能用==比较,而字符串可以
                          Count = getPolygonCount a as string --求几何体a的点面数,框并转为字符串,getPolygonCount得出的结果也是一个集合,包含几何体的面数点数
                          for o in objs do --对集合objs里的每一个元素o执行以下循环
                          (
                          oSize = nodeGetBoundingBox o o.transform as string --求几何体o的边界框并转为字符串
                          oCount = getPolygonCount o as string --求几何体o的点面数
                          if oSize == Size and Count == oCount do append temp o --比较o与a的边界框与点面数是否一致,如果一致就吧o放进集合temp里面
                          )
                          if temp.count > 1 then --如果集合temp里面的元素数量大于一,执行以下操作,不然就跳到后面的else语句(就是说剔除掉a后的objs里面没有与a一样的物体,上面的for循环里面没得出结果)
                          (
                          for o in temp do --对集合temp里的每一个元素o执行以下操作
                          (
                          n = findItem objs o --在集合objs里面找下o的位置n
                          if n != 0 do deleteItem objs n --如果在集合objs找到到o,就把它删掉,到这里为止,就在objs里找完了一批相同的模型,并把他们从objs剔除掉了
                          )
                          sortMats = #() --这里开始是在找到的相同模型集合temp里面对不同材质的模型分类,新定义一个叫sortMats的空集合用来装分好类的模型集合
                          while temp.count != 0 do --同样开始循环,直到集合temp里面的元素数量为0,其实接下来的做法与思路同上面
                          (
                          b = temp[1] --每次循环开始时先取temp里的第一个元素,赋予一个叫b的变量,作为参照对象
                          deleteItem temp 1 --删掉temp里的第一个元素
                          temp2 = #(b) --定义一个叫temp2的集合,并把变量b装进去
                          if temp.count > 0 then --如果此时集合temp还有元素,就执行下面的操作,没有就跳到后面的else操作
                          (
                          for o in temp do if o.mat == b.mat do append temp2 o --对比temp里的每一个元素o的材质是否与b一样,如果一样就把o添加到temp2里面
                          if temp2.count > 1 do --经过上面的循环对比,此时如果temp2里的元素不止一个就执行以下操作,就是把temp里面与temp2里相同的元素剔除掉,好进行下一步循环
                          (
                          for o in temp2 do
                          (
                          n = findItem temp o
                          if n != 0 do deleteItem temp n
                          )
                          )
                          append sortMats temp2 --把这一次按材质分类出来的集合temp2装进sortMats里
                          )
                          else append sortMats temp2 --这里对应的是上面的 if temp.count > 0 ,如果 ==0 就直接把只有一个元素b的结合temp2装进sortMats
                          temp2 = #() --把集合temp2清空为下一步循化做准备,其实完全不用这句,因为在while循环开始时已经将temp2 = #(b),就是说无论之前里面装了多少东西,在循环开始时又被重新赋值了
                          ) --在这里分类材质的while循环结束了 #(#(材质1);#(材质2);...)
                          append sortObjs sortMats --把按材质分好类的集合sortMats装进集合sortObjs
                          )
                          else append sortObjs #(temp) --这里对应的是上面的 if temp.count > 1 ,如果 <=1,就是说objs里面没有与a相同的模型,所以就一个,连材料也不用分离了,直接把集合temp装进一个集合里面,再把它装进集合sortObjs里面
                          )
                          else append sortObjs #(temp) --这里对应的是上面的 if objs.count > 0 ,如果 ==0 ,就是说在取完第一个元素后objs就没有其他元素了,所以也不用跟谁比较了,也直接把集合temp装进一个集合里面,再把它装进集合sortObjs里面
                          temp=#()
                          ) --经过多次循环得到一个这样的结果 #(#(#(材质1);#(材质2);...);#(#(材质1);#(材质2);...);#(#(材质1);#(材质2);...)...) 最外面的括号是模型总集,总集里面按照样式相同与否分类成第二集合,再在每个第二集合按材质相同与否分类成第三集合
                          --接下来语句是多对上面分类的统计
                          format "本场景中有%类物体\n总计%个\n" sortObjs.count geometry.count
                          for i=1 to sortObjs.count do
                          (
                          format "\t第%类物体:\n" i
                          c = 0
                          for j=1 to sortObjs[i].count do
                          (
                          format "\t材质 % 小计%个\n" sortObjs[i][j][1].mat sortObjs[i][j].count
                          c += sortObjs[i][j].count
                          )
                          format "\t共计%个:\n" c
                          )


                          IP属地:广东14楼2019-12-23 16:06
                          收起回复
                            outname=("d:\Users\Administrator\Desktop\obj.txt")
                            outfile=createfile outname
                            objs = geometry as array
                            sortObjs = #()
                            while objs.count != 0 do
                            (
                            a = objs[1]
                            deleteItem objs 1
                            temp = #(a)
                            if objs.count > 0 then
                            (
                            Count = getPolygonCount a as string
                            for o in objs do
                            (
                            oCount = getPolygonCount o as string
                            if Count == oCount do append temp o
                            )
                            if temp.count > 1 then
                            (
                            for o in temp do
                            (
                            n = findItem objs o
                            if n != 0 do deleteItem objs n
                            )
                            sortMats = #()
                            while temp.count != 0 do
                            (
                            b = temp[1]
                            deleteItem temp 1
                            temp2 = #(b)
                            if temp.count > 0 then
                            (
                            for o in temp do if o.mat == b.mat do append temp2 o
                            if temp2.count > 1 do
                            (
                            for o in temp2 do
                            (
                            n = findItem temp o
                            if n != 0 do deleteItem temp n
                            )
                            )
                            append sortMats temp2
                            )
                            else append sortMats temp2
                            temp2 = #()
                            )
                            append sortObjs sortMats
                            )
                            else append sortObjs #(temp)
                            )
                            else append sortObjs #(temp)
                            temp=#()
                            )
                            format "场景模型总数:%个\n" geometry.count to:outfile
                            --format "本场景中有%类物体\n总计%个\n" sortObjs.count geometry.count to:outfile
                            for i=1 to sortObjs.count do
                            (
                            c=0
                            text2=sortObjs[i][1][1].name
                            sll=0
                            for sl = 1 to text2.count do
                            (
                            if sl>1 and text2[sl]==("A") do sll=sl
                            if sll==0 and sl==text2.count and text2[sl]!="A" do sll=text2.count
                            )
                            if text2[sll]=="A" then wza=sll-1
                            else wza=sll
                            text1=substring text2 1 wza
                            for j=1 to sortObjs[i].count do
                            (
                            format "模型名称:%\n" text1 to:outfile
                            format "材质:%\n数量: % 个\n" sortObjs[i][j][1].Material.name sortObjs[i][j].count to:outfile
                            text=sortObjs[i][j][1].name
                            for n in sortObjs[i][j] do
                            if n.name!=text do delete n
                            c += sortObjs[i][j].count
                            )
                            format "\t共计%个:\n\n" c to:outfile
                            )
                            close outfile
                            @sinxye
                            这是我后来修改的样子,敬请大神查收!
                            确实如大神所说,判断nodeGetBoundingBox 时可能会出现0.000几的小数差距
                            综合我用的模型比较简单,所以我采用只判断点面的方式!


                            IP属地:广东15楼2019-12-24 09:50
                            收起回复
                              2025-05-17 20:52:53
                              广告
                              if objs.count > 0 then
                              (
                              ckg = a.max-a.min
                              ckg as string
                              Size = nodeGetBoundingBox a a.transform as string
                              Count = getPolygonCount a as string
                              for o in objs do
                              (
                              ockg = o.max-o.min
                              ockg as string
                              oSize = nodeGetBoundingBox o o.transform as string
                              oCount = getPolygonCount o as string
                              if(Count == oCount and Size == oSize) or (Count == oCount and ckg == ockg) or (Size == oSize and ckg == ockg) do append temp o
                              )
                              @sinxye 大神我把这个部位加了修改,看看if的条件这样写好不好?


                              IP属地:广东16楼2019-12-24 11:02
                              收起回复