Big Bird
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"""
click images for full resolution
. 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
click VIDEO below [01.June.2011] BioReactor Energy Distribution System - ElectroChemical Actuators for door opening of Emergent Soft/Rigid Car Design - Design + Video by LQ
Research and Development by Luis Quinones @ Emergent Architecture
Thanks to Roland Snooks for edit grip pts code.




click VIDEO below [15.May.2011] Test Animation of Tendons Self Organizing during Blend Shape
click VIDEO below [15.May.2011] Tendons Self Organizing during Blend Shape. Wrapped onto the Door Geometry which has an Inverse Kinematic Rig on it.
Mesh Offseter for Pull To Mesh Sector
Pipe Rebuilder Solo
Frame Blender
Pipe Rebuilder_MultiErrorTrap + Pull to Mesh + CamAnim
""" 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"""
click images for full resolution
. 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
click VIDEO below [01.June.2011] BioReactor Energy Distribution System - ElectroChemical Actuators for door opening of Emergent Soft/Rigid Car Design - Design + Video by LQ
Research and Development by Luis Quinones @ Emergent Architecture
Thanks to Roland Snooks for edit grip pts code.




click VIDEO below [15.May.2011] Test Animation of Tendons Self Organizing during Blend Shape
click VIDEO below [15.May.2011] Tendons Self Organizing during Blend Shape. Wrapped onto the Door Geometry which has an Inverse Kinematic Rig on it.
Mesh Offseter for Pull To Mesh Sector
Option Explicit
'Script written by Luis Quinones
'Script copyrighted by [n]igma + studioBoom + computationalMatter
'www.luisquinonesdesign.com
'www.computationalmatter.com
'www.cargocollective.com/studioboom
'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
Pipe Rebuilder Solo
Option Explicit
'Script written by Luis Quinones
'Script copyrighted by [n]igma + studioBoom + computationalMatter
'www.luisquinonesdesign.com
'www.computationalmatter.com
'www.cargocollective.com/studioboom
'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
Frame Blender
Option Explicit
'Script written by Luis Quinones
'Script copyrighted by [n]igma
'www.luisquinonesdesign.com
'www.cargocollective.com/studioboom
'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
Option Explicit
'Script written by Luis Quinones
'Script copyrighted by [n]igma + studioBoom + computationalMatter
'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
