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
IIf N < NL Then
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:
Post a Comment