• 模型变形第一版,(射线完成)


    --  target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter  rubberBand:selection.center  rubberBandColor:green --- 这种拾取的方法更好。不用再显示;
    --这样的思路进行,下面的处理,
    --我要借鉴之前的对齐方式,对这次的效果进行借鉴。上次是对物体的对齐,这次是对点的对齐处理。
    ---现在我知道的思路是:(下来为了流程话可能要改。)
    ---1.把创建的面转成poly
    ---2.选择他去拾取另一个物体,
    ---3.在拾取的过程中,收集点的坐标对 6 个方向控制,找到射线焦点,依次设定点的坐标,同时也有一个数据控制,控制到映射表面的距离,

    ----- 下面是收集顶点函数,为了下面的设置顶点的位置。
     global mode_become_deformed_vertexs_array =#()
     
      fn collect_poly_vertexs input_poly  =
      (
       ---这里说明下,我在用这个函数的时候,选择的物体肯定是一个,所以这里就不多率了。
       ---主要的目的就是收集顶点坐标信息。
       ---这里面估计也不存在没有选择的情况,因为在应用这些函数的时候 前面我就加入了报错机制。
         try ( convertTo  input_poly  Editable_Poly )catch (
       
       messagebox "操作不当,没按流程操作。\n返回。" title:"盖天编写"
       return false
      )
      -----求顶点数量。
      vertexs_count = polyop.getNumVerts  input_poly
      ---顶点数量循环 收集顶点坐标
      ---一般不会出现没有顶点状态, 这里面为了防止 加一个报错机制,这个函数是从飞狼哪里学来的。 他的是管面的, 是的大的括弧这里不能用
       if vertexs_count==0 then  return false
        for  i in 1 to vertexs_count do
        (
         vertexs_pos =  polyop.getVert input_poly i
        
         append mode_become_deformed_vertexs_array  vertexs_pos
        )

      )----end fn collect_poly_vertexs


    -----下面这个函数我要改造下,编程指定点的,

     fn find_intersection_virects  pick_mesh verts_pos =   ---verts_pos 选择面片的每一个顶点。,
     (
      try(
      --同样的条件 数字及计算要比字符串快 所以能用数字 不用字符串。
      ---改写成自动的循环处理的, 我考虑的因为只有6 个 所有用循环擦看。
      local oop
             local  compare_array =#()  
      for i in 1 to 6 do
      (
     oop=case of

       (

       (i==1): [0,0,-1]

       (i ==2): [0,0,1]
        
       (i ==3):[-1,0,0]
        
       (i==4):[1,0,0]
        
       (i ==5):[0,-1,0]
        
       (i ==6):[0,1,0]

       --default: reference $foo
       )
      -- print oop

      local testRay = ray verts_pos  oop
      local nodeMaxZ
      
       case oop  of
       (  ------Z 轴
        ([0,0,-1]) :(nodeMaxZ = pick_mesh.max.z
         testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
         
         )
        ([0,0,1]) :(nodeMaxZ = pick_mesh.min.z
         testRay.pos.z = nodeMaxZ - 0.0001 * abs nodeMaxZ  
        )
        -------X轴 
        ([-1,0,0]) : (nodeMaxZ = pick_mesh.max.x
         testRay.pos.x = nodeMaxZ + 0.0001 * abs nodeMaxZ   
        )
        ([1,0,0]) : (nodeMaxZ = pick_mesh.min.x
        testRay.pos.x = nodeMaxZ - 0.0001 * abs nodeMaxZ   
        )
       ------- Y轴
              ([0,-1,0]) : (nodeMaxZ = pick_mesh.max.y
        testRay.pos.y = nodeMaxZ + 0.0001 * abs nodeMaxZ   
        )
        ([0,1,0]) : (nodeMaxZ = pick_mesh.min.y
        testRay.pos.y = nodeMaxZ - 0.0001 * abs nodeMaxZ   
        ) 
       )
       
           ---在此利用射线时,我发现我之前的东西不错, 循环的过程总为什么有两个焦点是这样的。 如判断现在只有在外轴上有焦点,
       -------我就这样做,当像y轴的负方向照射时,我把射线的位置放到,物体的max 方向,张就会有一个焦点,
       -------当我射线照射方向 是y轴的正方向时,
      --)
      --testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
        if  intersectRay pick_mesh testRay !=undefined then ----射线与物体求焦点。
        (
         ---因为我先做了x轴的负方向 其实两个方向是同事存在了 所有 好要进行比较了
        --return
           append  compare_array  (intersectRay pick_mesh testRay)
        
       --  exit
        
        )
        
           
       
      )/*
       for i in compare_array do
       (
       distance_d =   distance  $selection[1].pos  i.pos
      --print compare_array[1].pos
        distance_c=0
        if distance_d>= distance_c then
        (
          distance_c =distance_d
        )
       
       )*/
      ---其实就有两个我比较下好; 用列举法
       distance_d =   distance  $selection[1].pos  compare_array[1].pos
      try ( distance_c =   distance  $selection[1].pos  compare_array[2].pos )
      catch ( distance_c =distance_d+20)
        if amin distance_d  distance_c == distance_d then
        (
         return compare_array[1]
        )else
        (
         return compare_array[2]
        )
       ) catch ()
      
     )
     
     ----下来安排的事件。
      fn g_filter o = superclassof o == Geometryclass
     
      ---从上到下执行。先执行这里的这个。
      fn gt_become_deformed_pick_Aligner   =
      (
      target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter  rubberBand:selection.center  rubberBandColor:green --- 这种拾取的方法更好。不用再显示;
      if isValidNode target_mesh then ---这个好用, 是如果节点没有被删除。
      (
       undo "scripts" on
       (
        ---运行函数在收集数组
        mode_become_deformed_vertexs_array=#()--每次运行钱在定义嗲空组
        collect_poly_vertexs $
        ---把全局变量转成内部变量用,这样写作变量相对容易一些。
       
        vertexs_array =mode_become_deformed_vertexs_array
       
        for i in 1 to  vertexs_array.count do
        (
         int_point = find_intersection_virects  target_mesh vertexs_array[i]
       -- print  int_point as string
         if int_point != undefined and  int_point != ok then
       (
        ----应该是设置的点的坐标 到新的位置上去。
        
       ray_pos_point = int_point.pos ---int_point.pos 射线的位置
       polyop.setVert $  i  ray_pos_point
       -- print int_point.pos
      )
        )--end i loop
       
       
       
       )--end undo
      )--end if
     )----end fn  gt_become_deformed_pick_Aligner
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    《我曾》火了:人这辈子,最怕突然听懂这首歌
    SpringMVC的运行流程
    Directive 自定义指令
    Vue 过滤器
    MVC 和 MVVM的区别
    vue指令
    async
    Generator
    单词搜索
    Promise
  • 原文地址:https://www.cnblogs.com/gaitian00/p/2039049.html
Copyright © 2020-2023  润新知