logo

[B]ig Bird

Projects details

Generates a series of self organized curves which are being pulled to geometry w. an Inverse Kinematic Skeleton – Python + Maya Research V.1 [29.June.2011] – via Python + Rhinoscript

— Thresholds for self organizing mutate per frame. Extremely Important to make sure the entire procedure is done through the code since any changes in curve order or curve build or mesh build will cause the blendshape to fail–
. As Close to a Protocol I think
. Freeze Frame [maya]
. Export Pipe Geometry [will be very deformed and nasty]
. In Rhino. Explode, Ungroup
. Run PipeRebuilder_MultiErrorTrap Script
. Bundle It
. Rebuild Curves By Layer Selection
. Pull It To Offset Mesh
. Pipe it [one mesh of x number of pipes]
. Export to Maya
. Prep Blend Shape Action
. KeyFrame It + Dominate it

Mesh Offseter for Pull To Mesh Sector

RHINOSCRIPT CODE

Option Explicit

'Script written by Luis Quinones
'www.luisquinonesdesign.com
'www.computationalmatter.com
'Script version Monday, 06 May 2011 17:35:58
Call Main()

Sub Main()    
    'Dim arrObj : arrObj = Rhino.GetObjects("MESHES",32)    
    Dim i    

    For i = 0 To 20        
        Call Rhino.LayerVisible("M" & i,True)        
        If i > 0 Then            
            Call Rhino.LayerVisible("M" & i-1,False)        
        End If        
    Next    

    Call Rhino.LayerVisible("M20",False)    

    For i = 0 To 20

        Dim arrObj : arrObj = Rhino.ObjectsByLayer("M" & i,True)        
        Call Rhino.LayerVisible("M" & i, True)
        'Dim strLayer : strLayer = Rhino.AddLayer("A"& i & "_BaseMeshes")
        Dim strLayer2 : strLayer2 = Rhino.AddLayer("M"& i & "_OffSetMesh")
        'Call Rhino.ObjectLayer(arrObj,strLayer)        
        Dim dblOff : dblOff = Rhino.MeshOffset(arrObj(0),0.3)
        Rhino.UnselectAllObjects
        Rhino.SelectObject(arrObj(0))
        Rhino.Command "Ungroup"
        Rhino.UnselectAllObjects        
        Call Rhino.ObjectLayer(dblOff,strLayer2)        
        Call Rhino.LayerVisible("M" & i,False)
        Call Rhino.LayerVisible(strLayer2,False)            
    Next    
    Dim last : last = 20    
    For i = 0 To 20        
        Call Rhino.LayerVisible("M" & last-i,False)    
    Next
End Sub
Update
Pipe Rebuilder Solo

RHINOSCRIPT CODE

Option Explicit

'Script written by Luis Quinones
'www.luisquinonesdesign.com
'www.computationalmatter.com
'Script version Wednesday, May 18, 2011 12:51:12 PM

Call Main()

Sub Main()    

    Dim strLayer : strLayer = Rhino.AddLayer("Frame",RGB(255,255,255))
    Dim strMesh : strMesh = Rhino.GetObject("MESH",32)        
    Dim i    
    Dim arrFaces : arrFaces = Rhino.MeshFaces(strMesh)    
    Dim arrFace(3)    
    Rhino.EnableRedraw False
    Do While i < Ubound(arrFaces)                
        arrFace(0) = arrFaces(i)
        arrFace(1) = arrFaces(i+1)
        arrFace(2) = arrFaces(i+2)
        arrFace(3) = arrFaces(i+3)                
        Dim newLine : newLine = Rhino.AddLine(arrFace(0),arrFace(1))                
        Call Rhino.ObjectLayer(newLine,strLayer)                        
        i = i + 4        
    Loop        
    Dim crvs : crvs = Rhino.ObjectsByLayer("Frame",True)    

    Rhino.Command "Join"    
    Rhino.UnselectAllObjects        
    Dim crv
    Dim count    
    count = 0    
    Dim arrCrvstest : arrCrvstest = Rhino.ObjectsByLayer("Frame")    
    Dim y
    Dim testCrv
    Dim count2        
    count2 = 0
    For Each testCrv In arrCrvstest                    

        Dim meshtest : meshtest = Rhino.MeshPolyline(arrCrvstest(count2))        
        Dim areatest : areatest = Rhino.MeshArea(meshtest)            
        If areatest(1) = 0  Then            
            Call Rhino.Print("ONE FAILED")
            Call Rhino.DeleteObject(arrCrvstest(count2))            
        End If        
        count2 = count2 + 1        
    Next     
    Rhino.UnselectAllObjects        
    Dim arrCrvs : arrCrvs = Rhino.ObjectsByLayer("Frame")    
    Dim newPts()

    For Each crv In arrCrvs                
        Dim mesh : mesh = Rhino.MeshPolyline(arrCrvs(count))        
        ReDim Preserve newPts(count)
        Dim centroid : centroid = Rhino.MeshAreaCentroid(mesh)            
            newPts(count) = Rhino.AddPoint(centroid)        
        count = count + 1        
    Next    
    Dim k    
    Dim ptloc    
    ptloc = newPts    
    For k = 0 To Ubound(newPts)        
        ptloc(k) = Rhino.PointCoordinates(newPts(k))        
    Next        
    Call Rhino.AddPolyline(ptloc)
    Rhino.EnableRedraw True
End Sub
Update
Frame Blender

RHINOSCRIPT CODE

Option Explicit

'Script written by Luis Quinones
'www.luisquinonesdesign.com

'Script version Wednesday, June 08, 2011 6:18:01 PM
Call Main()
Sub Main()        

    Dim i    
    For i = 0 To 360                
        If i = 20 Then            
            Dim m        
            For m = 0 To 19                
                Call Rhino.LayerVisible("Plines"& m,True)                    
            Next    
        End If        
        If i = 290 Then            
            Dim x 
            Dim count
            count = 20
            For x = 0 To 19                
                Call Rhino.LayerVisible("Plines"& count,False)                
                count = count - 1
            Next        
        End If        
        Call Rhino.RotateView("g",0,1)
    Next
End Sub

Pipe Rebuilder_MultiErrorTrap + Pull to Mesh + CamAnim

RHINOSCRIPT CODE

Option Explicit

'Script written by Luis Quinones
'www.luisquinonesdesign.com
'www.computationalmatter.com
'Small part of code uses Roland Snooks edit grip pts.rs code.
'Script version Wednesday, May 18, 2011 12:51:12 PM

Call Main()

Sub Main()

    'Dim LayerChoose : LayerChoose = Rhino.GetLayer    
    Dim strMesh    
    Dim AttThresh : AttThresh = Rhino.GetReal("Pull_attraction threshold", 60)
    Dim Snap : Snap = Rhino.GetReal("Pull_attraction threshold to directly snap to surface", 25)
    Dim VecRatio : VecRatio = Rhino.GetReal("ratio of distance to move", 0.5)    
    'Call Rhino.Print(Ubound(strMesh))
    'Dim strMesh : strMesh = Rhino.GetObjects("MESHES",32)    
    Dim z
    Dim i
    Dim color 
    Dim newPts()
    Dim newPts2()    
    'Rhino.EnableRedraw False    
    Dim q


    For q = 0 To 20        
        Dim gens : gens = 1
        Dim attraction    
        If q = 0 Then

            attraction = 0
            color = RGB(255,0,0)            
        End If            

        If q = 1 Then
            attraction = 1
            color = RGB(255,83,83)                

        End If        

        If q = 2 Then
            attraction = 1
            color = RGB(205,208,208)                
        End If        

        If q = 3 Then
            attraction = 1
            color = RGB(180,180,180)                
        End If        
        If q = 4 Then

            attraction = 2
            color = RGB(17,128,196)                
        End If        
        If q = 5 Then

            attraction = 2
            color = RGB(255,178,0)                
        End If    

        If q = 6 Then
            attraction = 4
            color = RGB(0,255,18)                
        End If        

        If q = 7 Then
            attraction = 4
            color = RGB(0,255,209)                
        End If        

        If q = 8 Then
            attraction = 6
            color = RGB(0,146,255)                
        End If        

        If q = 9 Then
            attraction = 7
            color = RGB(233,0,255)                
        End If        

        If q = 10 Then
            attraction = 7
            color = RGB(242,105,255)                
        End If    

        If q = 11 Then
            attraction = 8
            color = RGB(188,105,255)                
        End If        

        If q = 12 Then
            attraction = 8
            color = RGB(120,105,255)                
        End If        

        If q = 13 Then
            attraction = 10
            color = RGB(0,255,255)                
        End If    

        If q = 14 Then
            attraction = 8
            color = RGB(72,239,45)                
        End If        
        If q = 15 Then
            attraction = 8
            color = RGB(200,239,45)                
        End If        
        If q = 16 Then
            attraction = 6
            color = RGB(239,192,45)                
        End If        
        If q = 17 Then
            attraction = 6
            color = RGB(239,90,45)                
        End If    
        If q = 18 Then
            attraction = 4
            color = RGB(239,45,63)                
        End If        
        If q = 19 Then
            attraction = 2
            color = RGB(223,42,255)                
        End If        
        If q = 20 Then
            attraction = 0
            color = RGB(114,42,255)                
        End If            
        Dim strNewLayer : strNewLayer = Rhino.AddLayer("Plines" & q,color)        
        If q > 0 Then                    

            Call Rhino.LayerColor("Plines"& q-1,RGB(83,83,83))                        
        End If    
        strMesh = Rhino.ObjectsByLayer("A" & q)        
        For z = 0 To Ubound(strMesh)        

            Rhino.EnableRedraw False
            'Call Rhino.Print ("ON_Mesh_" & z)

            Dim strLayer : strLayer = Rhino.AddLayer("Frame" & z,RGB(255,255,255))    
            Dim arrFaces : arrFaces = Rhino.MeshFaces(strMesh(z))        
            'Call Rhino.Print("Mesh_" & z & "_" & Ubound(arrFaces))
            ReDim arrFace(3)        

            Do While i < Ubound(arrFaces)        
                arrFace(0) = arrFaces(i)
                arrFace(1) = arrFaces(i+1)
                arrFace(2) = arrFaces(i+2)
                arrFace(3) = arrFaces(i+3)        
                Dim newLine : newLine = Rhino.AddLine(arrFace(0),arrFace(1))        
                Call Rhino.ObjectLayer(newLine,strLayer)        
                i = i + 4        
            Loop            

            i = 0

            Dim crvs : crvs = Rhino.ObjectsByLayer("Frame" & z,True)        
            If isNull (crvs) Then            
                Rhino.Print "Opps"            
            End If

            'Rhino.Command "SelOpenCrv"        
            Rhino.Command "Join"
            Rhino.UnselectAllObjects    
            Dim crv
            Dim count    
            count = 0                
            Dim arrCrvstest : arrCrvstest = Rhino.ObjectsByLayer("Frame" & z)
            Dim y
            Dim testCrv
            Dim count2    

            count2 = 0            

            For Each testCrv In arrCrvstest    

                Dim meshtest : meshtest = Rhino.MeshPolyline(arrCrvstest(count2))    
                Dim areatest : areatest = Rhino.MeshArea(meshtest)        

                If areatest(1) = 0  Then            
                    Call Rhino.Print("ONE FAILED")                    
                    Call Rhino.DeleteObject(arrCrvstest(count2))            

                End If            
                Call Rhino.DeleteObject(meshtest)        
                count2 = count2 + 1    
            Next 

            Rhino.UnselectAllObjects    

            Dim arrCrvs : arrCrvs = Rhino.ObjectsByLayer("Frame" & z)                    
            For Each crv In arrCrvs    

                Dim mesh : mesh = Rhino.MeshPolyline(arrCrvs(count))        
                ReDim Preserve newPts(count)

                ReDim Preserve newPts2(count)        
                Dim centroid : centroid = Rhino.MeshAreaCentroid(mesh)
                Call Rhino.LayerVisible("Frame" & z,False)
                Rhino.EnableRedraw True                

                'If q = 0 And z < 2  Then                
                '    Call Rhino.RotateView("d",0,0.1)                        
                'End If            

                newPts(count) = Rhino.AddPoint(centroid)            
                newPts2(count) = Rhino.AddPoint(array(centroid(0)*-1,centroid(1),centroid(2)))        
                count = count + 1            
                Rhino.DeleteObject(mesh)            

            Next    
            Dim k    
            Dim ptloc

            Dim ptloc2
            ptloc = newPts
            ptloc2 = newPts2    

            For k = 0 To Ubound(newPts)                
                ptloc(k) = Rhino.PointCoordinates(newPts(k))
                ptloc2(k) = Rhino.PointCoordinates(newPts2(k))        
            Next        

            Dim checker         
            checker = Ubound(strMesh)
            Rhino.Print checker        

            If q = 1 And z = checker - 2 Then        
                Dim f

                For f = 0 To 600    
                    Call Rhino.RotateView("e",0,.5)
                Next                
            End If                

            If q = 4 And z = checker - 3 Then                
                For f = 0 To 120        
                    Call Rhino.RotateView("e",0,.5)
                Next                
            End If                            

            If q = 10 And z = checker - 1 Then                

                Dim reduce
                Dim x
                reduce = q                            

                For x = 0 To reduce                    
                    If x >= 1 Then                        
                        Call Rhino.LayerVisible("Plines"& x-1,False)                        
                    End If                    
                Next            

                For f = 0 To 900        
                    Call Rhino.RotateView("e",0,.5)
                Next                
            End If                            

            If q = 14 And z = checker - 3 Then                

                Dim reduce2    
                reduce2 = q            
                For x = 0 To reduce2                        
                    If x >= 1 Then                            
                        Call Rhino.LayerVisible("Plines"& x-1,True)                        
                    End If                    
                Next                                

                For f = 0 To 540        
                    Call Rhino.RotateView("e",0,.5)
                Next                    
            End If                            

            Call Rhino.DeleteObjects(newPts)            
            Call Rhino.DeleteObjects(newPts2)    
            Dim pLines : pLines = Rhino.AddPolyline(ptloc)            
            Dim pLines2 : pLines2 = Rhino.AddPolyline(ptloc2)    

            If Not IsNull(pLines) Then
                Rhino.RebuildCurve pLines, 2, 40                
                Rhino.RebuildCurve pLines2, 2, 40
            End If        
            Call Rhino.ObjectLayer(pLines,strNewLayer)            
            Call Rhino.ObjectLayer(pLines2,strNewLayer)        
            Erase newPts
            Erase ptloc
            Erase newPts2
            Erase ptloc2        
            Rhino.LayerVisible strLayer,False            
            Rhino.PurgeLayer strLayer                    
    Next        

    Dim meshPull : meshPull = Rhino.ObjectsByLayer("M"& q & "_OffSetMesh")        
    Rhino.Print "AttractionThreshold" & " =" & attraction        
    Call Bundle (strNewLayer,gens,attraction,meshPull,AttThresh,Snap,VecRatio)            
    Next    
    Dim h    
    Dim testcount : testcount = 12    

    For h = 0 To 20        

        If h = 0 Then            
            Call Rhino.LayerColor("Plines" & "20", RGB(255,0,0))            
        End If            

        If h = 1 Then            
            Call Rhino.LayerColor("Plines" & "19", RGB(255,83,83))                
        End If        

        If h = 2 Then            
            Call Rhino.LayerColor("Plines" & "18", RGB(205,208,208))            
        End If        

        If h = 3 Then            
            Call Rhino.LayerColor("Plines" & "17", RGB(180,180,180))                
        End If        

        If h = 4 Then            
            Call Rhino.LayerColor("Plines" & "16", RGB(17,128,196))                
        End If        

        If h = 5 Then            
            Call Rhino.LayerColor("Plines" & "15", RGB(255,178,0))                
        End If        

        If h = 6 Then            
            Call Rhino.LayerColor("Plines" & "14", RGB(0,255,18))                
        End If        

        If h = 7 Then        
            Call Rhino.LayerColor("Plines" & "13", RGB(0,255,209))                
        End If        

        If h = 8 Then            
            Call Rhino.LayerColor("Plines" & "12", RGB(0,146,255))                
        End If        

        If h = 9 Then            
            Call Rhino.LayerColor("Plines" & "11", RGB(233,0,255))                
        End If        

        If h = 10 Then            
            Call Rhino.LayerColor("Plines" & "10", RGB(242,105,255))                
        End If        

        If h = 11 Then            
            Call Rhino.LayerColor("Plines" & "9", RGB(188,105,255))                
        End If        

        If h = 12 Then            
            Call Rhino.LayerColor("Plines" & "8", RGB(120,105,255))                
        End If        

        If h = 13 Then            
            Call Rhino.LayerColor("Plines" & "7", RGB(0,255,255))            
        End If        

        If h = 14 Then            
            Call Rhino.LayerColor("Plines" & "6", RGB(72,239,45))                
        End If        

        If h = 15 Then            
            Call Rhino.LayerColor("Plines" & "5", RGB(200,239,45))                
        End If        

        If h = 16 Then            
            Call Rhino.LayerColor("Plines" & "4", RGB(239,192,45))                
        End If        

        If h = 17 Then            
            Call Rhino.LayerColor("Plines" & "3", RGB(239,90,45))                
        End If        

        If h = 18 Then            
            Call Rhino.LayerColor("Plines" & "2", RGB(239,45,63))                
        End If        

        If h = 19 Then            
            Call Rhino.LayerColor("Plines" & "1", RGB(223,42,255))                
        End If        

        If h = 20 Then            
            Call Rhino.LayerColor("Plines" & "0", RGB(114,42,255))                
        End If        
        testcount = testcount - 1
    Next    

    'Rhino.EnableRedraw True
    'Rhino.LayerVisible LayerChoose,False
    'Rhino.LayerVisible "Meshes",False
End Sub

Function Bundle(layer,gens,attraction,mesh,AttThresh,Snap,VecRatio)    
    Dim crvArr, steps, threshold, i, j, k, gripCount, dist, closestDist, closestVector, ratio
    Dim crvPt, h, newPos, gripPos, count, crvParam    
    ' input
    crvArr = rhino.ObjectsByLayer(layer)
    steps = gens
    threshold = attraction
    'ratio = rhino.GetReal("move ration", 0.5)
    'Rhino.EnableRedraw False
    ' loop through steps

    For h = 0 To steps    
        ' loop through all the crvs

        For i = 0 To UBound(crvArr)        

            ' how many control points on the crv
            Rhino.EnableObjectGrips crvArr(i), True
            gripCount = Rhino.ObjectGripCount(crvArr(i))        
            ' loop through each of the points on the crv
            
            For j = 0 To gripCount-1    
                ' get location of the grip
                gripPos = Rhino.ObjectGripLocation(crvArr(i), j)                
                count = 0
                ' loop through all the curves to find the closest one
                For k = 0 To UBound(crvArr)                    

                    ' get the position of the points
                    crvParam = Rhino.CurveClosestPoint(crvArr(k), gripPos)
                    crvPt = Rhino.EvaluateCurve(crvArr(k), crvParam)
                    dist = Rhino.Distance(crvPt, gripPos)
                    If dist < threshold And Not i=k Then

                        If count = 0 Then
                            closestDist = dist
                            closestVector = Rhino.VectorCreate(crvPt, gripPos)
                            count = count + 1
                        Else

                            If dist < closestDist Then
                                closestDist = dist
                                closestVector = Rhino.VectorCreate(crvPt, gripPos)
                                count = count + 1                                
                            End If                            

                        End If                            
                    End If                
                Next 'k                
                If count = 0 Then
                    closestVector = Array(0,0,0)                

                End If                
                newPos = Rhino.VectorAdd(gripPos, closestVector)
                Rhino.ObjectGripLocation crvArr(i), j, newPos                
            Next' j            

            Rhino.EnableObjectGrips crvArr(i), False            
            If Not IsNull(crvArr(i)) Then
                Dim reb : reb = Rhino.RebuildCurve(crvArr(i), 2, 40)                
                If reb = True Then
                    Rhino.Print "Curve" & i & ".Has.Been.Rebuilt.@.2,40"                    
                Else                    
                    Rhino.Print "DidntRebuiltIt"                    
                End If                
            End If            
        Next ' i        
    Next ' h
    'Rhino.EnableRedraw True    
    Call PullIt(crvArr,mesh,AttThresh,Snap,VecRatio)

End Function

Function PullIt(crvArr2,srfArr2,threshold2,snapThreshold2,ratio2)

    Dim srfArr, crvArr, threshold, ratio, i, j, k, gripCount, gripPos, count, srfParam, srfPt, arrSrfPts()
    Dim closeSrfInd, dist, vec, newPos, snapThreshold, meshPt    
    ' input
    srfArr = srfArr2

    crvArr = crvArr2
    threshold = threshold2
    snapThreshold = snapThreshold2
    ratio = ratio2    
    ' loop through all crvs

    For i = 0 To UBound(crvArr)
        Rhino.EnableRedraw False
        Rhino.EnableObjectGrips crvArr(i), True        
        ' get grip count

        gripCount = Rhino.ObjectGripCount(crvArr(i))            
        ' loop through all pts

        For j = 0 To gripCount-1
            ' get the location of the current grip
            gripPos = Rhino.ObjectGripLocation(crvArr(i), j)            
            ' k loop - crvs
            count = 0

            For k = 0 To UBound(srfArr)
                ' get the closest point on a srf                
                If IsMesh(srfArr(k))Then
                    meshPt = Rhino.MeshClosestPoint(srfArr(k), gripPos)
                    srfPt = meshPt(0)

                Else

                    srfUV = Rhino.SurfaceClosestPoint(srfArr(k), gripPos)
                    srfPt = Rhino.EvaluateSurface(asrfArr(k), srfUV)    

                End If                                
                ReDim Preserve arrSrfPts(count)
                arrSrfPts(count) = srfPt    
                count = count + 1
            Next ' k

            ' find the closest point
            closeSrfInd = Rhino.PointArrayClosestPoint(arrSrfPts, gripPos)                        
            srfPt = arrSrfPts(closeSrfInd)                    
            ' distance between point on curve and grip
            dist = Rhino.Distance(gripPos, srfPt)                
            ' check to see if in threshold
            If dist < threshold Then
                ' move grip based on vector
                vec = Rhino.VectorCreate(srfPt, gripPos)
                If dist > snapThreshold Then
                    vec = Rhino.VectorScale(vec, ratio)
                End If    
                newPos = Rhino.VectorAdd(vec, gripPos)
                Rhino.ObjectGripLocation crvArr(i), j, newPos 
            End If    
        Next
        Rhino.EnableRedraw True
        Rhino.Print "ItsBeenPulled"
        Rhino.EnableObjectGrips crvArr(i), False        
    Next    
End Function

 

 

 

 

  • Share

Leave a reply

Your email address will not be published. Required fields are marked *