December 7, 2010

RhinoScript | Recursion - Menger sponge



Rhinoscript를 이용한 Recursion의 수업 예제로 만들어본 Menger sponge인데, 개체의 수가 많이지니 라이노에서 렌더링 자체가 문제가 된다. 그래서 Block을 이용해보았으나 Rhino내에서 디스플레이나 라이노렌더 등은 문제가 없으나 V4에서 Vray로 렌더링시 Block을 이용한 경우는 그나마 괜찮긴한데 메모리 문제로 렌더링 불가.. 참고로 나의 노트북 메모리는 6GB이다. 그런데 같은 모델을 Keyshot으로 넘겨서 테스트를 해보니 너무 문제없이 잘된다. Keyshot파일로 저장하니 라이노 블럭으로 66MB이던 파일이 1.45GB로 커지긴하지만 렌더링에는 전혀 문제가 없었다. 아래는 메쉬 박스를 블럭으로 만들어 Menger sponge를 모델링하는 스크립트이다. Function 호출시 menger_sponge strBox, 0, 4 로 호출하면 위 그림과 같은 단계까지 반복한다.


Option Explicit
main
Sub main()

Dim strBox, arrCorners, arrObjects

arrCorners=Rhino.GetBox  
If IsNull(arrCorners) Then Exit Sub
 
strBox= AddMeshBox (arrCorners)
Rhino.SelectObject strBox
Rhino.Command "-NoEcho Unweld 10 enter", False
Rhino.Command "-Block 0 enter enter enter enter", False
Rhino.UnselectAllObjects
Rhino.Command "SelLast"
arrObjects=Rhino.SelectedObjects
strBox= arrObjects(0)

Rhino.EnableRedraw False

menger_sponge strBox, 0, 2

Rhino.EnableRedraw True
 
End Sub

Function menger_sponge(strBox,N, NL)
 
  Dim arrCorners, lX,lY,lZ, X,Y,Z, arrBox(2,2,2), arrPoint
  If N
    arrCorners=Rhino.BoundingBox(strBox)
    lX = (arrCorners(1)(0)-arrCorners(0)(0))/3
    lY = (arrCorners(3)(1)-arrCorners(0)(1))/3
    lZ = (arrCorners(4)(2)-arrCorners(0)(2))/3

    strBox=Rhino.ScaleObject(strBox,arrCorners(0), Array(1/3,1/3,1/3))
   
    For Z=0 To 2
      For Y=0 To 2
        For X=0 To 2
          If ((Z=1 And (X+Y) Mod 2 <>0) Or (X=1 And Y=1) ) Then
            arrBox(X,Y,Z)=Null
            Else
            arrPoint= Rhino.PointAdd(arrCorners(0),Array(lX*X, lY*Y, lZ*Z) )
            arrBox(X,Y,Z) =  Rhino.CopyObject (strBox,arrCorners(0), arrPoint)          
          End If
        Next
      Next
    Next
    Rhino.DeleteObject strBox
   
    For Z=0 To 2
      For Y=0 To 2
        For X=0 To 2
          If Not IsNull(arrBox(X,Y,Z)) Then
          menger_sponge arrBox(X,Y,Z), N+1, NL
          End If     
        Next
      Next
    Next
   
 
  End If
End Function


Function AddMeshBox (arrPoints)

  Dim arrFace(5)
  arrFace(0) = Array(3,2,1,0)
  arrFace(1) = Array(0,1,5,4)
  arrFace(2) = Array(1,2,6,5)
  arrFace(3) = Array(2,3,7,6)
  arrFace(4) = Array(3,0,4,7)
  arrFace(5) = Array(4,5,6,7)
 
  AddMeshBox = Rhino.Addmesh (arrPoints, arrFace) 
 
End Function

No comments: