From the course: Grasshopper: Tips, Tricks, and Techniques
Fabrication: Ivy fundamentals
From the course: Grasshopper: Tips, Tricks, and Techniques
Fabrication: Ivy fundamentals
- [Instructor] Welcome. I have my exercise file open already. In this video, we're going to focus on the Ivy plugin. Ivy is an amazing tool that lets you take a mesh object, develop a mesh graph that tracks the connectivity between all the faces, and then divide that graph in such a way that allows you to unfold the underlying mesh flat. And this works with very complex meshes where you can break them up into pieces. In this video we're going to focus on the fundamentals, the basic steps of going from mesh, to mesh graph, to unfolded graph, and then back to a mesh. As an example, I have a surface here and I'm using that surface to generate a whole bunch of boxes with open backs. And we're just going to unfold one of these boxes. So here's our box. The first step is to convert this mesh into a graph or generate a graph based on the mesh. So we'll go graph from mesh. The next step is you want to figure out which face to start unfolding from. And we want to start unfolding from one of these two front triangles, which represent the front face of the box. To do this, we'll go to mesh, face boundaries, and we're going to use the boundary length, which is a proxy for boundary area. We could convert the boundary into a surface and find the area, but the length will work fine in this instance. So we'll go to curve, length, and then what we really need is the index of that face in order to use that index to do everything else. So, we'll go to sets, series, and this is a trick. If you need the index of something within a list and what you're getting is the actual geometry, like if I have a list of curves here but I want to know which of the curves based on index, not the curve itself, you can just go get the length of that set. So I have 10 curves and now I have 10 integers. Each of these integers represents the index of the curve, the corresponding curve. So I'm going to sort these by length and then plug in the index, or the integers. And so, this will tell me which of the curves is the shortest or which of the curves is the longest. But what I'm getting is the actual index of that curve. So to get that, I want to go list item, I'm going to plug in the indices, and item by default will give me the first item, which is the shortest curve. But what I really want is the longest curve and that'll be the last item in my list. So face nine is going to be the starting point for the unfold. Now, as I'm doing this unfold, I need to break apart this graph. So you can see the graph is connected around the corners and I actually want these, all these flaps to unfold so I want to break the graph at these corners. I don't want that connection to cross that corner. And so to do that, I need to create weights for the edges. So I can tell Ivy that these edges are more costly to actually unfold. So I'll go back Ivy. And I'm going to create custom edge weights. And so I'll plug in my graph. But how do I actually get those weights? So if I go back into mesh and I get my mesh edges, and I'll focus on these interior edges because the exterior edges aren't connected in the graph. So it's only the interior edges that matter. And we get the length again, so the curve, length. And these lengths are going to become my weights. So I can just plug this in. What this does is it says, okay, the longer the curve, the greater the weight. The problem is, I want it to break at the short curves. So I want there to be more weight or more cost at these short curves. So I'm actually going to do an expression here. I'm going to just multiply this by negative one. So now they are all negative. So these will be the costliest edges and these will be the least costly edges. So now I have my weights, my graph with my custom weights, so let me go back into Ivy and I want to do my segmentation. This is what actually breaks the graph up or moves segments within the graph to allow it to unfold. Without getting into the weeds of how each of these algorithms work, I know that I'm applying custom edge weights so I'm going to pick an algorithm that's focused on edge weights. I'm going to use this Multi Root MST edge weight. So I plug in my graph with those custom edge weights. And I want to tell it here's where we're going to start, the face will be starting with the index of the mesh face where it will grow, which is that number nine mesh face. So we're going to turn that off. So now we see this new graph starting at this face index nine and then it's connecting all the faces, but it's not connecting around the corners. And that's what's going to allow this to actually unfold properly. So now to actually see the unfold, we'll go to mesh graph visual unroll. This will actually take the graph and unroll it flat. So we want the starting face, again. And here, this is a coefficient that lets you partially unroll if you want to, instead of completely unrolling. And this actually controls which faces will unfold so you can unfold them incrementally, just unfold some of the faces. But we're going to leave all of those set to completely unfold. And now, here is the graph that's being unfolded. So we can see that graph, but we want the actual mesh, not the graph. So we'll go back into our mesh graph area and go graph to mesh. And there we go. So you can see Ivy is a complex plugin. If you really want to get into the details of it, each of these algorithms are really interesting and interesting to read through and understand completely. But even without understanding it completely, you can use Ivy as a really simple tool to quickly unfold and unroll complex geometry.
Practice while you learn with exercise files
Download the files the instructor uses to teach the course. Follow along and learn by watching, listening and practicing.
Contents
-
-
-
Leveraging NURBS: Sampling5m 20s
-
Leveraging NURBS: UVW space6m 13s
-
Leveraging NURBS: Reparameterization6m 23s
-
Leveraging NURBS: Solving on plane5m 41s
-
Leveraging NURBS: Curves as math functions5m 37s
-
Leveraging NURBS: One-degree surfaces5m
-
Leveraging NURBS: NURBS or meshes? Part 14m 41s
-
Leveraging NURBS: NURBS or meshes? Part 25m 21s
-
Leveraging NURBS: What is BREP?5m 15s
-
Leveraging NURBS: Alternatives to Boolean, part 18m 35s
-
Leveraging NURBS: Alternatives to Boolean, part 25m 57s
-
Leveraging NURBS: Alternatives to Boolean, Part 36m 33s
-
Leveraging NURBS: Extracting planes from curves6m 19s
-
Leveraging NURBS: Extracting planes from surfaces6m 39s
-
Understanding offset directionality6m 30s
-
Offsetting variable curves consistently5m 57s
-
Offsetting polygons7m 33s
-
Equal spacing along a curve for linkages7m 24s
-
Paneling tools and NURBS sampling5m 26s
-
Breaking down the paneling tools4m 3s
-
Buildable 3D paneling9m 11s
-
Understanding unrolling in Grasshopper3m 25s
-
Scripting your own unroller5m 27s
-
Unfolding from scratch, part 15m 8s
-
Unfolding from scratch, part 26m 31s
-
Why data trees?6m 20s
-
Intentional data trees8m 28s
-
Installing plugins5m 57s
-
Fabrication: Ivy fundamentals6m 49s
-
Fabrication: Ivy for a multiple parts4m 32s
-
Fabrication: Ivy for fabrication10m 13s
-
OpenNest6m 1s
-
Pancake4m 31s
-
Human: Setting data6m 54s
-
Human: Getting data7m 8s
-
Anemone: Basics4m 10s
-
Anemone: Convex hull4m 3s
-
Anenome: Custom convex6m 27s
-
Intralattice4m 9s
-
Metahopper5m 44s
-
Chromodoris6m 38s
-
Dealing with empty branches5m 14s
-
Data trees as lists4m 27s
-
Iteration instead of data trees4m 44s
-
Sorting inputs3m 52s
-
Sorted geometry to data tree7m 35s
-
Data trees and scripting6m 53s
-
Data trees as a master index and ID4m 21s
-
Vector intro6m 23s
-
Plane intro3m 59s
-
Vector math, part 15m 46s
-
Vector math, part 24m 16s
-
Operating in different cartesian systems5m 58s
-
Operating in twisted spaces, NURBS systems6m 44s
-
Installing Crow9m 21s
-
Setting up training data in Crow5m 43s
-
Prep the neural network in Crow5m 54s
-
Apply the network to classify face parts5m 57s
-
Using classification8m 22s
-
Installing Wallacei4m 15s
-
Setting up Wallacei4m 51s
-
Wallacei goals5m 48s
-
Wallacei goal tuning6m 31s
-
Wallacei output4m 37s
-
Weaverbird meshing5m 47s
-
Mesh+ and mesh editing4m 43s
-
NGon: Reciprocal4m 5s
-
NGon: Reciprocal 3D6m 35s
-
AXOLOTL: Conformal6m 1s
-
Opossum: Control5m 42s
-
AXOLOTL: Smooth branching6m 7s
-
FlexHopper: Particles4m 8s
-
FlexHopper: Particles clean6m 34s
-
FlexHopper: Particles agitate6m 34s
-
PhysX.GH: Stability4m 47s
-
PhysX.GH: Collision4m 3s
-
PhysX.GH: Catenary4m 35s
-
Heteroptera: Network tools4m 43s
-
Heteroptera landscape5m 24s
-
Why coding: C#5m 29s
-
Reading RhinoDoc3m 58s
-
Read object5m 40s
-
Write object6m 28s
-
Object types5m 44s
-
List inputs4m 53s
-
Data tree inputs5m 9s
-
Exporting geometry5m 18s
-
Reading CSV4m 28s
-
Reading settings5m 42s
-
Reading writing5m 23s
-
ScriptParasite4m 36s
-
Reduce mesh5m 38s
-
Unfolding/unrolling initial6m 23s
-
Unfolding/unrolling transform geometry4m 54s
-
Change surface degree6m 58s
-
Lowest possible degree (keep checking until it works)5m 10s
-
Fit surface4m 21s
-
Fit surface: Iterative to increase tolerance until it works4m 11s
-
Running a batch5m 48s
-
Advanced batch processing7m 1s
-
Understanding and reusing transformations5m 8s
-
Compounding and reversing transformations7m 20s
-
Zebra5m 11s
-
New in v7: Quad Remesh, part 16m 5s
-
New in v7: Quad Remesh, part 26m 1s
-
New in v7: Grasshopper Player, part 14m 50s
-
New in v7: Grasshopper Player, part 27m 5s
-
New in v7: Scripting, part 16m 46s
-
New in v7: Scripting, part 25m 25s
-
New in v7: SubD tools, part 17m 46s
-
New in v7: SubD tools, part 25m 19s
-
New in v7: SubD tools, part 34m 28s
-
New in v7: Drafting, part 15m 15s
-
New in v7: Drafting, part 26m 59s
-
New in v7: Drafting, part 38m 21s
-
New in v7: Drafting, part 44m 32s
-