Nesneleri kameraya döndür

Seçilen mesh nesneleri yüzeyleri kamera yönünde olacak şekilde döndüren rhinoscript. 

Kodu: 

  1. Option Explicit
  2. ‘Script written by AM
  3. ‘Script version Tuesday, 17 March 2009 22:00:34 
  4. ‘Use in conjunction with RotateObjectsToCamera-Refresh
  5. ‘Rotates objects to face camera (typically for rendering). Only meshes for now.
  6. ‘Initiates AddObjectsToGroup sub and creates group.
  7. ‘***FLAWED*** RotateObjectsToCamera function sometimes must be run up to 5 times to affect all objects correctly. CW/CCW fail
  8.  
  9. Call AddObjectsToGroup()
  10. Sub AddObjectsToGroup()
  11.        
  12.         Dim strObjects
  13.         Dim strGroupID
  14.         Dim strGroupObjects
  15.        
  16.         strObjects = Rhino.GetObjects(“Select meshes to add to rotate group”32TrueTrue)
  17.         If IsNull(strObjects) Then
  18.                 Rhino.Print “No valid objects selected.”
  19.                 Exit Sub
  20.         End If
  21.        
  22.         strGroupID = “RotateToCamera”
  23.  
  24.         If Not IsGroup(strGroupID) Then Rhino.AddGroup(strGroupID)
  25.         Rhino.AddObjectsToGroup strObjects, strGroupID
  26.         strGroupObjects = Rhino.ObjectsByGroup(strGroupID)
  27.        
  28.         RotateObjectsToCamera(strGroupObjects)
  29.                
  30. End Sub
  31.  
  32. Function RotateObjectsToCamera(strGroupObjects)
  33.        
  34.         Dim strObjects : strObjects = strGroupObjects
  35.         Dim arrCam, arrVertices, arrVertex, strBottomLine, arrMid
  36.         Dim arrLine1, arrLine2, arrAngle, dblRotateAngle
  37.         Dim arrNormals, arrPlane, arrVecCamToMid, arrNormalAngle
  38.         Dim i
  39.  
  40.         arrCam = Rhino.ViewCamera
  41.        
  42.         Rhino.EnableRedraw(False)       
  43.         For i=0 To UBound(strObjects)
  44.                
  45.                 ‘OBJECT TYPE
  46.                 Select Case Rhino.ObjectType(strObjects(i))
  47.                         Case 8
  48.                                 arrNormals = Rhino.SurfaceNormal(strObjects(i))
  49.                                 arrVertices = Rhino.SurfacePoints(strObjects(i))
  50.                         Case 32
  51.                                 arrNormals = Rhino.MeshVertexNormals(strObjects(i))
  52.                                 arrVertices = Rhino.MeshVertices(strObjects(i))
  53.                 End Select
  54.                
  55.                 If IsNull(arrNormals) Then Exit For
  56.                 If IsNull(arrVertices) Then Exit For
  57.                
  58.                 ‘CONSTRUCTION LINES
  59.                 arrVertex = arrVertices(2)
  60.                 strBottomLine = Rhino.AddLine(arrVertices(0), arrVertex)
  61.                 arrMid = Rhino.CurveMidPoint(strBottomLine)
  62.  
  63.                 arrLine1 = Array(Array(arrCam(0),arrCam(1))Array(arrMid(0),arrMid(1)))
  64.                 arrLine2 = Array(Array(arrVertices(0)(0),arrVertices(0)(1))Array(arrVertex(0),arrVertex(1)))
  65.                 arrAngle = Rhino.Angle2(arrLine1, arrLine2)
  66.                 If Not IsArray(arrAngle) Then Exit For
  67.                
  68.                 ‘NORMAL ANALYSIS. FRONT VS BACK, CW VS CCW
  69.                 arrPlane = Rhino.PlaneFromNormal(arrVertices(0), arrNormals(0))
  70.                 arrVecCamToMid = Rhino.VectorCreate(Array(arrCam(0),arrCam(1))Array(arrMid(0),arrMid(1)))
  71.                
  72.                 Dim u0 : u0 = Rhino.VectorUnitize(arrVecCamToMid)
  73.                 Dim u1 : u1 = Rhino.VectorUnitize(arrPlane(0))  
  74.                 Dim cross : cross = Rhino.VectorCrossProduct(u0, u1)
  75.                 ‘Rhino.Print Rhino.Pt2Str(cross)
  76.                
  77.                 ‘ALREADY PERPENDICULAR
  78.                 If cross(2) = 0 Then Exit For
  79.  
  80.                 ‘FRONT
  81.                 If cross(2) < 0 Then
  82.                         ‘Rhino.Print “Angle: ” & CStr(arrAngle(0))
  83.                         dblRotateAngle = (CDbl(arrAngle(0)))-90
  84.                         Rhino.RotateObject strObjects(i), arrMid, dblRotateAngle
  85.                 End If
  86.        
  87.                 ‘BACK
  88.                 If cross(2) > 0 Then
  89.                         ‘Rhino.Print “Angle: ” & CStr(arrAngle(0))
  90.                         dblRotateAngle = 90(CDbl(arrAngle(0)))
  91.                         Rhino.RotateObject strObjects(i), arrMid, dblRotateAngle
  92.                 End If
  93.                
  94.                 Rhino.DeleteObjects Array(strBottomLine)
  95.                
  96.         Next
  97.         Rhino.EnableRedraw(True)
  98. End Function

Dosyayı indirmek için tıklayın.

Kaynak: http://www.rhinoscript.org/scripts/65

Benzer Yazılar

Share Your Thoughts

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir