Houdini Algorithmic Live #042 - Night Cityscape with Wave Function Collapse

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
so okay hello on this is 9pm in japan i am going to start a tutorial live now i'm not let me know if the sound is okay or not all right so uh thanks for coming this this is the 42nd episode for houdini algorithmic life and today's topic is to create a animation looking like this to create uh like night cityscape animation like this using several uh techniques uh today so the process goes for today uh is to create first create a city grid using starting with this really small one like 20 by 20 then use a algorithm called wave function collapse and there is a node in houdini where you can use this small sample to create a large grid like this okay so i'm going to use that to create a really great big city grid then after that i'm going to extrude it to build a building like this based on the area of it each primitives or faces then also create some window shapes and then let in the last i'm going to animate it using the frame values so that it will look like it's being lit from zero to end so that's the goal here today uh the flow is pretty simple nothing really special here but uh i wanted to try out this wave function collapse comes from the houdini labs node so it's kind of a practice for me to use how i can use this and also i wanted to visualize one of the graphic that i found really interesting which is from this website the graphic from richard giblet and there is one graphic that i liked a lot which is this one so i wanted to mimic this kind of graphic myself using procedural process using houdini so that's the goal here and this is kind of a result that i get not bad i think and i also animated this since we're using houdini right so that's my goal here and before we get started um i'm also would like to introduce the introduction to the wave function collapse algorithm which there is some explanation in a website specifically for houdini in this page in this video i found out about this wavefunk how i can use this wavefunction collapse node for houdini from this video uh coming from houdini a wave function collapse supercharged with ptg for level generation by paul and brocen so this gives me a lot of information how i can use this node and what it can be used as an example uh most of the cases he shows how you can use it for dungeon generation but in my case i'm going to use it to generate a city block or it could be any use for any kind of purposes i think and so if you want to know the detail about how this algorithm works you should go to this video to check it out it's hour long but it's worth it okay but this time i'm going to just you i'm gonna just show you how you can use it without explaining much of its algorithm okay all right so let's get started to start off which we have to create we have to start by creating a small uh grid a city blick city block for a sampling for a wave function a collapse algorithm and that can be really small like 10 by 10 or 20 by 20. i i will stop by a 20 by 20 grit to use it as a sample and i would like to make it as a procedural grid but to test it out i would like to first create a sado grid or simple grid using image tile or a pd png image so first time i'm going i'm going to like draw some like random grid here in a photoshop then save it as a texture save it as a image file then try to use it as an initial test to create a big city block so i'm just going to use black and white and this is the the resolution is 20 by 20 and just going to create random block here okay hello everybody and see how this works okay could be any kind of grid actually it might be interesting to have like l shape as well like this this might want some small value here okay that might be too big doesn't really matter i mean it could be really random maybe let's go without l shape because l shape it's a bit difficult to treat with l shapes which i am going to deal later on but for now i am going to deal with only the squares so [Music] let's do this like this and for this one okay almost there maybe i would like to have a width at least two pixels okay how's this um let's have this here and okay so let's have this as a base sampling image and say let's save this as a 20 by 20 pixel grid on the desktop and i'm gonna make it as a png file okay so i'm gonna say grid right now and let's have this file also saved on a desktop then let's start well building it now in order to first of all in order to use the wave function collapse uh node you gotta go to the you gotta open up the shelf for to access the side effects labs uh node which is right here if you and i am going to use the version 18.5 okay and if you open that note tab you'll be able to see a bunch of note here if you click this button here you'll be able to update the labs note to the latest so let's click this update and if it's the first time you do this you gotta i think you gotta reopen the houdini all right so uh ah use x to swap colors in photoshop no need to sample anything okay thanks i didn't i don't really use photoshop myself that's good to know thank you all right so now after i have updated the side effects lab node you'll be able to see under the labs node and under so utils i think yeah not utils uh utils you'll be able to see like lavs wfc sample plane wfc initial grid and so on wfc is the the word for uh wave function collapse so i'm gonna first create this wfc initialize so this is going to be used to create the grid that i i'm going to sample and also as an output value i'm going to duplicate this one one will be the output size one will be the input size input grid and also i'm going to use a wfc the name is called labs 2d wave function collapse this is the the solver node to actually calculate the web function using the way function collapse to create a big image out of a small sample okay so for the right side grid i am going to import the image with this one and there should be an option to use the texture so click this from texture and i'm gonna choose the one that i have saved which is under the hip directly and what was the name grid dot png okay so it will automatically initialize uh using the image that i imported into a grid uh in this case i have imported the 20 by 20 resolution image so we'll create a 20 by 20 grid and if you look at attributes the new attributes being is created is these colors and these names and those four values are the important attributes later on if you want to create your own grid by yourself procedurally without using image okay so for the left one i'm going gotta have to set the size of the final output now i'm going let's make it really big like hundred by hundred maybe that's too big oops i made it 100 by thousand so 100 by 100 so what i want to do is to sample the information from this grid and use that sampling information to build a bigger grid and you can set the size of the sample like the default value is three by three meaning you are going to sample three by three get three by three get grid from the input image first this one second this three by three and their three by three grid and so on and use those collected information to build a bigger image using those information than using the probabilistic functions or algorithm okay so but it you don't really need to worry about that kind of a detail of the algorithm this solver will just do the job for you you just need to set a search pattern size pattern search size which is the number of samples uh you want to use more sample you have more cpu time you need but more bigger grid uh structures being preserved if you have small numbers then a smaller uh structure is being preserved so it's go the output gets more random randomish but for now let's set it to 3x3 and for the output we're going to make connected to the first input and for the input sample image going to this paste connected to the second input and as soon as you do that it will create a grid pattern like these so easily all right and you can change the pattern by changing these seed values takes a while but we'll create like this now if you make it two by two will create a bit more randomish tile like these because it's sampling less images there's these all these patterns are probable using the 2x2 if it's if you make it 4x4 then the calculation cost is really high but you'll be able to use a more bigger block but sometimes it gives you an unwanted result as well so it depends on the image you want in this case full viper made these some of the grid some of the rectangle too big like you see here so might not be suitable for this purposes so let's make it three by three okay but later on if you want to make those grid like l-shape 4x4 starts to be sasuke useful so i remember that for now but for now i'm going to go with these as a base and in order to in order to replace this small grid sample with the procedure process i'm going to keep that later i'm going to keep that to the last one first first of all i would like to just try to create the base geometry for the building okay which is not going to be that hard i think okay oops now it seems like if i change the frame it also updates the wave function which is not what i really want but let's see if i we couldn't do if we could um prevent that now uh to try this out i'm going to keep the output a bit smaller so that the calculation will be faster so i'm gonna go 50 by 50 for now all right and then let's since i would like to build a building since it's black it it's a bit hard to see but there is actually a point right here so i'm only going to retrieve the points uh which is the black one okay so oops okay what i did what did i do okay so first of all i'm going to use the delete node to get only the points which the color is black and to do that i'm going to use the filtering to check the cd attribute x is equal to zero and then use it for points and i want to retrieve that so delete non-selected okay now i have got the center points for the grid for the building part now i am going to create a single grid or square the size of one by one and no split lines and what i'm going to do i'm just going to copy this single grid to the building block points now all those points have been saved to each of the grid points now it's a bit hard to see so i'm gonna make the background light okay so that's better that already looks good now what i want to do next is to do the extrusion but before doing that currently there's too many points here which is not really necessary especially the one that's inside here so let's dissolve that first first thing i will do is diffuse to connect all those emerged points or overlapping points and then i'm going to use the divide node to make it to remove the shared edges so that you only have the outline points and all the inside points will be disappeared or dissolved okay now what i'm going to do now is to measure the area for each of the primitive and based on this area i'm going to set the height of each primitives which doesn't really matter if you make it random but i'm just going to keep some rules here to set the height of the building based on the area so if the size is the 2d sizes big then the height is also big okay so let's do that by first i'm going to create a measure node and set it to primitive area and for each primitive now you'll be able to have those areas and based on those values i'm going to set the height of the building okay now let's do that um by using since i would like to access to each of the primitive attributes and set the height for each primitives i am going to use the primitive wrangle i mean you could also use like for each loop as well but it's going to be a bit the calculation is going to be a bit slower so i'm gonna do with this primitive wrangle way to make the building the extrusion procedurally so that you could also create the size for the windows as well at the same time so let's name this extrusion let's open this editor up by alt e right now let's do this the first of all uh first thing i would like to do is to retrieve the area from the primitive attribute for so like this and then i would like to calculate the height of the age of the primitive wage of the building from this using this area so let's name this h and i'm going to use the power function with the area with some uh power value like i'm gonna use i'm gonna create a parameter called pal apply accept okay so and also promote this parameter so by changing this you'll be able to specify how effect how this area being affected with the height if you have high value then you have more about more area you have more height you'll be able to have less value have less effective with the area and the height now now that i have those information let's start building let's start doing the extrusion procedurally now first of all i'm going to retrieve the point list from the primitive using print points which this will give you a number of points here now i can loop through this point list and access to the point position first of all i'm going to retrieve the point number for each point and then get the point position for each of the point number like this and then if you want if you just want to raise this points upward with this height you what you can do is just create a new position position plus set zero height zero then create a new point t at point zero and pause and use those points to create a primitive add new primitive so and prim add prim 0 poly and add vertex at this newly created point into this empty primitive all right now all the height seams equal or may not that difference i mean there are some differences here but it's not really uh pick a big of a difference but by raising this value up you'll be able to see more differences based on the area all right that looks good all right so next thing you want to do is to create a side of this building i guess so let's also do that and in order to do that you need to have a list of points which is this one together with the pts right here this is the original points here this is the newly created points and by having two point arrays you'll be able to create the site using for loop so in pts add using array all right so yeah i have a question why not using polyextrude with dscale control all that's because i would uh as i said i wanted to create a window on the side uh at the same time i create the extrusions now by using some additional attributes that i'm going to create later so that's kind of why but i guess you could also do that as well maybe with some of the process well let's just uh do this way i mean if you know the easy way to do that it's yeah you better do that in that way and i guess i'm doing the hard way hardcore way all right kind of am i practicing the vex as well i guess all right so what i want to do now is to add or append this npt that i have created to the new array here now let's create a site using a for loop and then access to a four points to create the side so pt1 and pt2 is from the pts i plus one and calculate the remaind using the pts pt3 will come from the mpts i plus one modulus blend and pts and in pt4 and pts i and i think that's the four points that i need to create each of the side for these squares so after i have it i can create a permanent primitive polygon let's name this cypoly at crim xero poly pt1 p2pt3 and pt4 all right so now that i have created the extrusion like this but this is not enough actually what i wanted to do is to create a window like shape which looks like these if you zoom this up so if i look at this geometry carefully this is like a silhouette but it actually have a grid of windows on each faces of the building so just by having a one full uh side for each of the building is not enough i have to kind of split this uh building into layers and also in the vertical direction as well to create a bunch of windows okay so let's uh try to do that using the same vex functions now first of all i would like to define the number of layers on the height direction and for for this example i'm just going to keep the the layer height to each of the layer height to be one equal to one which is the same size as the grid single grid size but you can make it like varied by using random but for now i'm gonna make it make the height as one so that means this height itself is actually going to be the number of layers now currently the the calculation result for this one is not really an integer so to make it as to be able to use each height each layer's height to be b1 i'm going to make it first of all an integer value by using like seal or round or end or floor functions i'm gonna use still to get the ceiling value from the flow value so now the building height will be clamped between the zero to some integer value okay now next thing i would like to do is to create each layer's point um using this height value as a number of layers okay so let's do that and to do that i am going to create another loop besides this one so first of all i'm going to hide this one okay and use create a new loop let's use n as an attribute and h will be the number of layers okay and since i already have the first layers okay let's also hide these as well okay the let's hide these top plane as well and currently i only have the one that's on the bottom so what i want to do is to copy this point the grid of points upward by a number of layers so i already have the but the bottom one so i'm going to keep this stuff from one which i'm going to use it as a height and then and smaller than or equal okay so use this kind of conditions right now i am going to copy all these values here inside this one okay and then let's create a point here and let's see what it does i don't really need the primitive for the top part so i'm going to remove this one and this one okay and i think i also need to set the height for each layers which is defined right here so i should replace this h with n which is this one so let's set it to n okay so now i have a bunch of points which explains the layers of a layer for the building okay okay i have a question is your twitter mainly for japanese audience well he i'm not sure i'm tend to tweet in japanese sometimes in english but since i'm japanese and twitter is to tweet what you think in mind i guess so i think in japanese so that's what i tweet right um what was where was i so next thing i would like to do is to create a face for each of the layers like this one this one and this one and this one so on okay that's what i want to do next uh using all those points information now to do that you see that this is a if you look at the site if you focus on the side this is a 2d grid and in order to create a face for each point using those all those points you need to first get the the horizontal point grid and also the vertical point grid now unfortunately there is no um double array structures in vex as you might know already and if you have that kind of structures will be pretty easy to build this kind of 2d 2d like grid using a a preserved arrays but since we don't have that what i'm going to try this what i'm going to try next is to use a new data structures introduced from houdini 18 0.5 what's it called dictionary so i'm gonna use that dictionary as a practice as well to use it like a 2d array or a multi-dimensional array okay so let's do that so so first of all what i would like to do is to create a dictionary value for each of the layers so the first layer for the first layer for the second layer third layer and so on and for each of the layer values i'm going to store the array just like i did for the npts and pts okay so the dictionary works for each layers and inside the dictionary each of the keys i will store these the set of pts and npts to create a site like we did last time right i hope it makes sense now let's try to think how what kind of structures we could make there are there is some limitation with the dictionary you could have a array value inside a dictionary as a value but you cannot have a array of vectors you can only have area of float or integer or string values so you cannot use a vector value meaning you cannot create a area of positions so but i do need a position information in order to create a side information side faces so i'm going what i'm going to do is to deconstruct the point position to x y and z okay this might be uh cumbersome this might sound really cumbersome and there might be a better way to do this without using dictionaries but let's try it see if we could use this dictionary in real practice okay so i am going first going to create a dictionary value using dict layer all right and let's set the [Music] wait a minute maybe i should create a [Music] well let's name this the root dictionary name like um pts stick which since we're going to store the points information here and initially we have only the but the bottom plane here so i'm going to start with the 0 which i am going to use it as a indicator to define which layer we are in so zero means this in the first layer first the bottom layer which is drawn as black right now okay and for this one i am going to store the um some additional values like uh let's call this layer and i'm going to create another dictionary called layer which has several information in order to define this values one is the point number and one is the point position information for each of the point so another dictionary to start off first i have this pt num as a key and pts which is the point list point array for the bottom part which is this one and another key is the point position for x y and z coordinate so the x for the point x and wait is that correct no we cannot use this one because we are in the primitive wrangle so we have to retrieve the point attribute here okay so in that case we need a float x array load y array for the point and float z array i'm going to loop through all the points number point number get the point information then get the position for each point for primitive and then append this x value to xs array and do the same for the y and z to initialize this array so that it has the same size with this pts okay so ys s position c in position y now i can now have a key for the x and y and z all right okay starting to get a bit complex here start to make sense later okay now that i have this layer which is which is supposed to be created for each layers and this is for the first layer actually and i'm going to use this first layer as a initial value for this root dictionary all right now let's apply and see if i have any errors nope looks good okay at this moment i have just created the first layer so next thing i would like to do is to create a lay the layer information for all these newly created points all right and each layers we are using this for loop so this is where we want to create another uh layer right so right after we have calculated or created this npts i'm going to create a new layer let's name this dict and layer set okay i have a question just came in and realized i missed almost an hour of the stream will stream be uploaded to be seen later yes um uh this streaming the live stream is going to be recorded and also be archived so that you can see anytime you want later on and i'm also going to upload the file that i've created during the course during the sessions after i have finished this and uh and you can access from the video description page so don't worry don't worry about it okay now for the layers the up top the the layers that has been created using for loop i am going i need to have the same key the pt num x and y and z so for the pt num this is going to be npts that i have just created right here right for the xs and ys and zs we kind of need to create the similar stuff like we did here inside this loop so i'm going to copy this one and maybe paste it like next to right after this mpts array and let's also rename this attributes to nx and y z because this same name has already been used here so and also we need to do some dissimilar things with doing here appending the value the x y z coordinate to the these float arrays so do let's do that right after right here okay and the name of the array was nxs and yz and zs and we also need to change this position name to end pause and pause and pause okay which is this one is the position for each layers for each point okay now apply oops now i seem to have some errors okay this is the one so i need to set the i need to create the layer at the new dictionary layers for the x which it's going to be n x s for the y and y s and 4 d z and z s okay right now after doing it you what i need to add this layer as uh additional with the additional key to this root dictionary called ptsdict now previously i was using 0 as a key for the bottom one for other one i'm going to use the key coming from the number of layers so which is equivalent to this end value and in order to use the dictionary you need to change this to a string so i am going to change this n value which is an integer to a string and use that as a key and to store into a specific key what i can do first name pdf dict and change the n value to string using iq a then store this and layer into that dictionary key all right apply and check if there's no errors okay that looks good now the preparation is done in order to access the necessary information to create the faces now that was really long now next thing i like i need to do is to access each of the point information from this dictionary to create a faces just like i did here for each of the point list okay so let's do this uh first of all i am going to access to each of the dictionary value and to add or to create the faces and the number of layers that i have to refer to is if we have one two three four five six seven eight layers then we only need to loop through seven we need only we only need to loop through seven iterations that is because we are going to use the first layer and the second layer to create the face so if you if you have eight points you only have seven faces so that's kind of a reason why we need seven layers which is the number of dictionary values minus one so for loop uh lengths let's use now until the length of pts sticked minus one okay now let's uh next thing i'd like to do is to access to this layer information for n equal to uh the the integer is equal to n and also n plus one okay so um player one is pts dict and and layered layer 2 pts dict n plus 1 modulus length pts stick or maybe we don't need this because we don't need to loop through the array okay so and we also need to change this n into a string since the key is in string all right now that we have a two layers we can access to each of the layers to create a faces now just to create the face we can only we only need to access those pts information which is inside the pt num key so let's do that so int pts1 array is layer layer 1 pt num and pts 2 layer 2 pt num the same key okay now that i have two um areas we could use this uh code that we used to create the faces between two point arrays and one was for the pts2 and one was for the pts one so pts1 and pts2 pts2 so replace this these numbers and this one as well pts1 and this can be pts2 all right so let's see how this goes apply and yup so the side has successfully been created and if you look at if you show up the edges using a shading smooth while you shade it you have created those square valleys right that looks good now now what i want to do next is to create a window faces and if i look at this graphic here that i'm referring to um some of the windows have is wide on the x direction some of the window have a long uh size on the y direction okay so i want to differentiate the size of the window looking like this and also some of the window looks really long on the horizontal direction so that might also be something that i could control later on but for now i would like to con first control the the size of the window on a single grid okay so to do that first of all we could try by creating a uniform scaled size window from this each of the faces okay and you could do that by accessing to the one that i have uh already applied as a dictionary value which is this x y and z value which is the x value here for the y x y and z value for each of the point to create the faces and use that information to calculate the new point position to create a window size now if you just want to have a like uniform scaled window it's probably it's better use polyextrude but if you want to differentiate the value for x and y for each of the faces or each of the building controller using attribute with the vex might make more sense okay so let's try to do that so the position where i can create those um points or for the windows it could be somewhere around here and maybe somewhere right after we have got the point numbers right here so all you want to do is to get the point information the point position uh point position information which corresponds to these values here but we cannot we cannot use this point function to use the pt1 and pt2 to access to a a at p attribute that is because those points has been created previously using this for loop and doesn't really existed previously so if i try to access to each of the point like this you can only access to the phone information which existed previously which was the bottom part these points which has been produced procedurally inside the code cannot be accessed through this point function which i already tried and didn't work well so that's kind of a reason why i have stored this x value which i uh to store the point position where we have created the new point okay so let's retrieve that x y and z position to create a new point right so uh let's kind of uh uh let's first create a vector pass one or no actually it's a num array of floats so i gotta do like this so a x s one is layer one x float x s 2 is layer 2 x and do the same for y and z right so y y and z and the key is also z and y all right now uh inside the for loop since the size the length of this array is the same with x array or either of the arrays so we can access to each of the array with this pt number right here to get the point position all right so create a vector plus one corresponds to this one using set and for the pos one which comes from the pts one which corresponds to the x s one y s one and z s one so i'm going to copy this one xs one and inside the index which is which should be equal to this one here and since this index a bit long so let's create the shortcut for the indexes so if let's say id 1 is i and id 2 is equal to this value here and we'll replace this with id 1 92 92 and id1 all right now do the same for this one xs ys1 id1 cs1 id1 all right so that's for the position one do the same for a position two three four two 3 4 and this should be id 2 2 2 2 2 2 and this strip 2 3 two three two three and four and four oops nope i think i made a mistake um this should be xs1 xs1 xs1 2 2 yep like these okay it looks a bit confusing but hopefully okay seem to have some errors here all right where is that candidates are float vector int okay so where is where did i do wrong it is 40 yes okay so this one sounds wrong let's see let me give these okay this should be comma all right so i need to replace all these with comma all right okay so now that i have a position for each of the faces to create a square face for on the side now we can start creating a window now let's try with the uniform size we can retrieve the center position of this four points by adding all those positions and divided by four so let's do that first vector center position is plus one plus cos two plus of three plus cos four divided by four that will be the center point position now use the center point position to create a scaled point for each of the side now each of the points the vertices which is this one now um it might be better to do it in a loop since creating one by one makes a lot of coding so what i would like to do it next is to create a array of vectors to store all these positions i'm going to name this like w positions and inside the array i'm going to store all these point numbers point uh positions okay now let's look through all these using another loop okay i realize the code start to get really long just to make it flexible but i guess it will reward in the end okay for the position 2 i would like to get the do i need to no no i actually don't need to get the second one i just need to get the first point position or reach of them and then what i'm going to do is to scale each of the point based on the center point position so let's say the new window position will going to be a center position plus a w position minus center position multiplied by some multiply multiplication value multiplication factor like point five will make uh half size squares should make half size squares point uh positions now after i have retrieved the point new point position i can now create a new point at right here wpt is equal to add point zero w new window positions okay if i look at carefully if i show up the point the new point has been created inside a face and if i change this point five to something different like point three i now can be able to uniformly scale the size of the window now i don't want i actually don't want to relate this size of the window based on the uniform scale i want to differentiate the value for the horizontal direction extra the vertical direction so i cannot just do something like this but you gotta make it a bit more flexible to be able to differentiate the scale for the the 2d or xc direction and the y direction now to do that let's let's say we have two values one for the horizontal scale let's say 0.3 for random value and for the vertical let's say 0.7 okay and try to use both of those values to scale the point on horizontal direction and the vertical direction now to do that we kind of need to deconstruct this directional vectors into x y and z and multiply each of the coordinate with these values so first i'm going to create the directional value which is at every pass minus c pos and i'm going to recreate this directional value using these scalar value so whatever direction is equal to set for wd here dot third gear dot wide over there dot z and each of the x y z value i'm going to multiply either one of the values and since we are dealing with the x c plane as a floor like plane and y direction as a gravity direction i am going to multiply the hs which is to use for the scale for the xc direction so i'm going to multiply with x and z and for the y i'm going to multiply with v s all right now i'm going to replace this one with w direction and see how it goes okay now the scale has been changed based on these two values for this point and currently the horizontal scale which in this case which in this way became 0.3 so this is the the size of this point inward using as a window as a thirty percent size of this original length for the height this is seventy percent height okay so i can change that to 0.1 to make it more smaller and the vertical and like this all right now that looks good now later on i'm going to make it as a random values for each of the y and x value okay so but for now let's have this as a parameter c h f h s and chf uh vs okay and let's change these parameters let's promote the parameter and have some values okay now next thing i like i need to do is to open up or create a edges so that i can change the color of this window to do that i need to create a four side faces using this point this point this point and this point for each of the side so in total we need four frames us polygon for the window okay so that means we need to do another for loop which in this case um we already have the point numbers here but we don't have the this point number being applied into an array which is necessary to do the comparison with do the connection with these point numbers the list of points retrieved right here which is the these point information so let's create another array and wpts wpts to store all the point numbers which has been created for the window which is right here wpts wpt and together with this we need the original point which is this outside point numbers being stored in the array for convenience so and all pts array and since these points are not in the area yet we need to store that as well and for these ones i can just say pt1 pd2 pt3 and pt4 right okay so now that we have to set off array it's time to create the side faces so i'm not doing another for loop loop through the wps okay and get the opt from the opts first and also wpt from the wpts now for this one i need to have a uh next iterations as well the next index as well since we are looping through all those four points but we need to have the next point information to create the side as well so let's name this the first one opt one and then next one i'll be t2 pts t plus one length wpts okay so this should be t for whatever pd1 and wpt2 t plus one modulus lengths wpts okay we're almost done we're almost ready for the window um now we have those four points to create the side we can say prim add trim zero poly uh opt one op t2 or wpt2 wpt1 and see how it goes now did it create it aside i think so but it has the original faces right here which is not really necessary anymore which is this one so let's delete this one and here you go the same rule has been applied to every faces of every building it's a bit look weird because all of the building has the same width and height values but it's working okay we i would like to also have this inner window area as a polygon as well then make it as a different group so that i can we can access to this later on to set the colors so let's create that and that will be easy because these points are stored in this wpts we can just use this to create another polygon so let's show this points up again for the side but instead of using those point numbers i'm going to instead use this wpts as a list and here you go you have created in more inside polygon and i'm also going to set the group for this inside window polygon using set prem group zero window uh let's name this w poly w poly two one and for the one that's on the side let's name let's set this group as a wall so set frame group zero wall okay all right now finally i don't want to make all these window how to share the same values for each of the building i want to make a difference for each of the building so let's create some random values and for each of the faces so to do that we could go to the top part of the code and create two random values one for the horizontal value let's say hs is equal to random based on the point position of the primitive plus some constant values and since this will create a random between zero to one and we don't really want to have a zero value of one because that's going to make the window too small or too big so let's clamp this value to some with the minimum values here so i am going to use the clamp and let's also have this minimum value as a parameter as well so scale mean scale and clamp this with a min scale as well as the one minus min scale do the same for the bs but this time i'm going to change the seed value i mean you can also parameterize this to change to see some different values which of the building but i'm gonna make it constant for now now let's also replace this uh comment this hsn vs out and now all those windows are using the different sizes let's also promote the main scale and raise this up to control the the clamp value maybe point three is a good number all right that looks good okay now that was a lot of code but i think we i have done what i wanted to do now i'm i'm i am still missing the top part right here now since we have done all these with the code let's just create the top with the code as well which isn't that hard to do i think so what we need to do is to retrieve the point list number for the last layers and to get the last layer information we could access to the dictionary that we have created which was this one so first of all i'm going to retrieve the last layer dictionary from the pts stick dilute dictionary value and we can access to to the last key value which is by converting the length of the pts stick minus one into a string okay now this is the last layer information and we can also get the last um pts value the array of points from this layer dictionary at pt num key now we can use this to create the top polygon at prem zero poly tp last pts okay missed it all right didn't work now what was wrong okay oops yeah showed up okay so that looks good enough now um i'm going to do the i'm going to do another things to set the size of the horizontal grid size currently all the grid size is uniformed is equal to one so it's not really that interesting to make it a bit more randomized or to have more longer horizontal scales i'm going to do that later with some additional process but for now i'm going to keep it like this and first create the animation and to do that right first of all let's look at the point attributes and there is some information on for the colors now we don't want this color information for the point but i want to have this color for the primitive so that i can set each primitives color if we have like point and primitive attributes the name cd then the point attributes be used instead of the primitives so we need first we need to delete this attribute value for the color i'm going to use attribute delete to delete the point cd then i'm going to use a color node to set the color for the window so set the window color where's let's say white and for the walls i'm gonna set it to black and i forgot to set this class to primitive okay and i would i wanted to set the top part as black as well so i forgot to set the group for the top part go back to the extrusion and set frame group 0 wall i mean this is not really a wall but let's just say it's wall top poly one okay now initial setup is good enough with this one now last of all what i would like to do is to animate this color of the window based on the time frame as a basic setup okay kind of a kind of taking a lot of time i wonder why okay seems like this solver for the this 2d way functional collapse is called for every frame if i move this frame so i don't want that since i'm not using any frame values for this 2d clubs functions now let's see how we can prevent that this being called for each frame now let's see is there any values here that we could set to i am not sure maybe not in here is this related to right here maybe not this one nope manual it's okay but this mat if i set it to manual all these updates is not going to be done so that's not a good thing if i do auto update oops okay i crashed it uh let me go to the temporal folder to check all right so oh didn't quit it okay well it's still running uh i wonder how i could prevent this to run for the time i mean it was it wasn't running when i was doing when i was working previously so oops again but didn't okay let me see uh let me know if anybody has some informations how i could um prevent this to run each time i change the frame if not maybe i can just cache this result as a file cache that should be possible should be possible [Music] well each time i try to change the frame now it crashes every time let me reopen this okay and if i change the frame i think it's still calculating i can say that because by if i change this to 100 i now see the solver right here if i change the frame yeah i keep seeing this solver running and that's not really what we want is it because we have we are not changing any of the sources right here okay uh okay okay this might be a problem here let's set it as a real time i forgot what i what i did what i needed to do in order for this one to not calculate at each frame uh there should be an option to disable this mark here so god does anybody know actions display that render that you know a load lock wi-fi is this range okay so time dependence time dependent i want to make it disabled how do i do that i can't let me search for it so [Music] okay network editor options time dependent okay so this node changes based on the current frame for example it might have keyframe animation reminder too right so how do i change this might have keyframe animation or it might have an expression that uses current frame or time um display option in the network editor choose view display options badges that's not what i really want does it okay maybe right here [Music] yeah i think i did something in order to disable this auto update but i was i'm not really sure what i did all right oh well auto generate nope visualize scene [Music] hmm i am not really sure so current oops oops all right if i couldn't find it i'm just gonna file cash it for now which is not really what i want sugar crunch i thought there were some options to update or not but if i have a new cameras here i guess it doesn't really change let me just check what's inside here if it's if it's using any kind of frame related values maybe in this python well let's just cash it for now i am going to make this 50 again and i'm going to use the file cache for the result for the wave function collapse and then set it to current frame i'm not going to use the frame value here just name the file name here and then save this and load this okay now i can freely move the frame i'm gonna check it later now i am going to create a primitive triangle to access to the window information and set some color animation now it might be better if we have started all the values all the colors started from the black file so let's disable this one and set all the colors to be black all right now let's create some simple code to slowly show up the window light all right to okay so i'm going to use the random to choose the random window positions some constant value here plus or smaller than some ratio and if this condition mets then i'm going to set the color for the window to be white okay so let's also promote this value now i can use the sliders to change the the how much i how much windows i want to be able to show up or light up now at this time i can make this background to black or dark all right now that looks good okay now let's animate this value this itself using a frame value so ff the current frame divided by the frame end will create a value in between 0 to 1 using the these frame values if i play it it slowly shows up every window lights being colored finally it will finish by uh showing up all the window but if we show up all the windows then it looks a bit too artificial so i'm gonna clamp this final value to like 0.9 or something so what i'm going to do is to clamp this ratio value which is from 0 to 1 to say 0.01 to 0.9 so this is going to be the last so some of the window is still not showing up but looks better and also let's set the frame is a bit smaller so the animations a little bit faster all right like it looks good now and if i wanted to change the the pattern for the windows size i think i need to change the seed so let's have this change with the seed value seed one seed for the extrusion this one also but plus some constant value okay now if i change the seed i can change see different types of windows okay so the base setup is pretty much done this is the base setup i wanted to create now what i want to do next is there are several things that i want to do first of all i would like i have used this initial grid as a image file which is okay but if to make a bit more flexible to make it more procedural like i would like to make it just within houdini to replace this texture value or texture image now another thing that i want to do is to combine some of the grid horizontally for each of the building to create a longer window on horizontal direction right so let's do the window part first which is not that hard to do i hope but do still need some coding here in order to deal with the number of windows here or the size of the horizontal valley we have to go back somewhere around just before this extrusion so somewhere around here now it's shown in blue now the reason why we have so many numbers grid is because of those number of points so by dissolving some of the points we'll be able to have a longer edge length and as a result you'll be able to have a longer horizontal window size so that's what i want to do delete some of the points which is on the side maybe using some threshold to do together with some random values for each of the faces and one thing you have to careful is that you don't want to delete the points on the edge the bounding edge right so one of the way you could think of how you could retrieve only those points which is on the side is to get three continuous points first like this one this one and this one then calculate the dot product between the two adjacent points so the first vectors that you want to create is the one for going from here to here right and the second vector is going from here to here and calculate the dot product between those two vectors and if if the value if the result of the dot product is um close to one meaning it's aligned in the same direction if you have these points as a three points one two three then if you calculate the dot product between this vectors and this vectors the result will be equal to zero so that means the point is in on the corner the middle points from the three points is on the corner but otherwise you should be able to get one so i you get i in this kind of square grid um um block you'll be able to get the value either zero or one for the dot product so you can we can use that information to retrieve the side the points on the side and just for the points just for those points we could try to remove some of the points using some threshold so let's do that okay and i'm going to name this as simplify using i want to do this for each of the primitives so let's say primit let's use primitive attribute or primitive wrangle again simplify right so let's do this another code so i'm first i'm going to access all of the point from the primitive using print points trim num and since we need to access the three adjacent points i'm going to loop the points first and get adjacent three points the first one is at the index i the second one is at pts i plus one now it should the the square should be looped the point number should be looped so i should calculate the modulus and pd3 which is the third number so in this case i plus two do the same remain calculation now that i have a three adjacent point only if those points are sorted and the vertex order but hopefully it does if not we can use a sort node beforehand now let's also retrieve the point position for each of the point do the same for position two position three and did and calculate the direction between the first point and second point and second point and the third point so position two minus position one and i'm going to normalize this and another vector normalize position three and position two okay now we need to now calculate the dot product between those two vectors and if those if this dot product is close to one then that means it's on the side it should be on the side so let's see if it's that if it's true i'm going to condition say if the point the dot product is larger than 0.5 then remove all the point and if we could remove all those side points then it's this condition is successful okay apply now doesn't seem like it's working okay only the corner point has been deleted and let me think why it is okay first of all let me check the order of the point by showing up the point order and if it's on the if it's correct okay now there is a problem because it's not in the correct order it's not the order of the point is not based on the vertex order so that's a bit of problem so we need to fix that to do that we can just use a sort function or so node to sort out the point based on the vertex order now let's see still have some problem here so let's let me check the point now the point order it looks good now but there is still a bit of problem here so that means i guess i have some something else to do all right let me check so let me open this up open up the code editor again and let's see all right so prin points is the point from the primitive it should be good and i'm retrieving the point number i plus one that should also be good in the direction i'm also getting the position for each point and what seems to be wrong here okay primp i am currently inside a primitive number right here right and let me check if i have retrieved this point number correctly for each primitive okay apply let's look at the primitive attributes okay that looks correct that looks correct alright now also let me check the lengths for the point apply this one okay this one also looks correct okay so what if i do this dot product in the either way i mean okay now ah all right i know the problem that's because i'm using this at pt num inside a primitive wrangle that was a problem okay gotta fix this this has to be the one that i want to delete so the condition should be correct the one that i wanted to delete is the middle point from these three points so this pt2 so this should be pt two all right now i think it worked all right that looks good now i don't i don't actually want to delete everything every point every side points but i actually want to delete some of the points to keep the window size varied so there's another random values you could create so inside this condition i can have another condition saying if random at p plus uh i multiply by some constant value plus some seed parameter is less than some another threshold value let's say simplified threshold simplify then delete it delete the point right now let's promote those parameters that i've created one for the seed and one for the threshold if the simplify is set to one all the point on this all the side points will delete it if it's zero all the side points will be uh be there all right this but looks good now just by doing it and accept and go back to the extrusion you kind of uh be able to have a longer horizontal window size at some point at some places if you go back to the color really coloring now it looks like these and if i change the simplified zero backs to normal but if it's going to be make it if i make this larger then you have more horizontal bigger horizontal size windows at some of the places which makes the nightscape pigeons a bit more interesting all right let's keep this tip like 0.4 all right looks good now at this point i might want to i mean i can go to the precision plan now but i might want to change the size of the layers as well for each of the building to make a bit more varied so if i i can go back to the extrusion and check where i have set the height which was which was right here so what i can do is to just change this value to some random related values for each building now i can i can create a random value for each building maybe set the create a layer height scale value using the random again using some seed value now the random creates the value from 0 to 1 but let's say i want to keep the height of the layer to be 1 as the default value and just by multiplying it with some scalar volume i would like to change some values in between one to some upper values so let's say let's fit or remap this scale the random value from 0 to 1 to 1.02 1.5 and multiply this value together with this end value here and see what happens now some of the building has more higher layers some of the building has smaller layers smaller height layers just a bit of change but makes this a bit more interesting all right now maybe i would i might want to parameterize this one this scalar value as well so chf max layer height and set it to set the range from one to two okay all right looks good now if you then set it to 1.5 as a different value okay so now is the time to create a go back to the initial step to replace this texture value with a procedural tile tiling grid okay now before doing it can i just uh check how i check this one back again if i can do this without updating for each frame because i don't i don't think i think there are a way to ignore this being updated for each frame okay there should be some options somewhere so i'm going back to this one and disable this file cache it's going to calculate something now the reason why it's updating at each frame is because of this time dependent and each of the node highs this okay i think this is the problem here if yeah if i look at this wafc initialize2 which is loading the texture it's this itself is time dependent so i guess this one is this node is the reason why it's making this update each frame and i don't have any idea why this is time dependent doesn't really make sense does it well but we are going to replace this with the procedural grid so it's not a big problem i guess i'm gonna make this file cache for now and let's try to replace this with a procedural small grid which looks like these okay so what i'm gonna do is to do some simple like um recursive divisions for the grid for the plane um first i'm going to create a grid like this and then pick an edge first one of the edge for this square and then let's say i pick this one and next what i want to do is to pick the points on the edge use some random values let's say this one here then if i if you pick the points on the edge what i'm going to do is to create the um perpendicular line with this edge to to the corner like this and using this line to split the polygon into two okay now what i'm going to do next is to for each of the primitive i'm going to pick i'm going to again pick one of the edge for this primitive i'm going let's say i'm going to pick this edge right here and pick this point and do the same process here for this primitive let's say i'm going to pick this edge here and do the same process like this and keep doing it to split this polygon with some criteria now i am going to check the size of the length and the area and if the size of the the edge of the lens and the area is at if it's too small then i mean if it's too big to then keep splitting but if the size got too small then just stop the splitting then go with the final output so i would like to have this kind the limitation to set the smallest and smallest edge size and smallest area size to keep the boundary to keep the displacions so that we don't have this kind of two small edges squares which we don't want to have it as a building layer or building block right so let's do that we can do this in single primitive layer or attribute layers or attribute wrangles or we could use a foliage feedback loop in this case i'm going to use the 4h feedback look loop because there is some useful functions for the polygon like polysplit to split the polygon really easily this one okay so i'm going to use the 4h number loop and i i'm using for each loop right here because that's because these operations not going to be animated so that's kind of reason why i also would choose the for each loop if the part that we're going to process is going to be animated then i think it's a good idea using a rango node using vex because it's faster right but for these one this this is just the preparation part so we don't need to care about the kind of a speed of the process that much now first of all i'm going to set this to a feedback loop so let's set this to feedback each iterations and then sets this to fetch feedback and start with a initial grid size without having any grid lines so set the columns and rows to 2x2 and also let's be able to set the size of the grid i am going to say it let's say let's say i want to create a grid 20 by 20. okay so 20 by 20 and also create a new controller at this point to store the parameter that i want to store so okay so the one that i'm going the things that i'm going to explain now oops forgot to change the window here um okay i think i'm not seeing the comment anymore i'm not sure if anybody's is still watching here um [Music] well not sure maybe not let me check if there are any comments being created okay maybe not okay i might okay there might be no one listening right now so i'm just gonna go uh in my pace all right so where was i so what i wanted to do is to use this for each loopback a feedback loop to create a splicion for the polygon and i have just set the for each number of order for each end node to make it feedback each iterations and for the forage began i'm going i'm have set it to fetch feedback and i have also created this grid 20 by 20 and rows and columns two by two i want to i want to be able to control this size using some parameters so let's create a parameter like the size integer let's say maximum is 50 and let's start from 20 and copy this one paste it right here and put it in here now let's do some split now first of all as i said i would like to pick one of the edge from the square so let's do this what i'm going to do is to well to create the explicit splitting line i'm going to do another loop or the wrangle okay i'm going to use the primitive wrangle and after one loop you'll be you currently the first for the first loop you have only one primitive right here but after a second loop you you you're going to have more primitives output from here so i want to deal with a deal with each primitive independently so i'm going to create another loop here which is for each primitive to deal with each primitives and for those i can i don't have to make it as a feedback loop but keep it as a merge h iteration all right now for each primitive i would like to create a splish and splitting line and let's do that and i do need some random values to define which side and which point position on the edge so let's have this iteration value value from the first loop maybe from the second loop as well so i'm going to click this one create a meta import node and con connect this one to the third input alright now let's call this divide all right now let's first of all i'm going to retrieve all the point numbers like this i want to make sure that the point is either and the point order is either clockwise or counterclockwise okay have to be zero now in this case if you start from the original grid like this one the point order is not like i want if you show this point number it starts from zero one and goes diagonal places and goes to here and three but i actually want to point order to be clockwise or counterclockwise because it's going to be useful in this in this sample in this case so first i'm going to sort the point order maybe i should do it inside a loop somewhere around here and do the point order based on the vertex order now the point order has become clockwise that's good now let's go back to the divide function and let's see let's see what i could do um first of all i can retrieve the random side numbers but actually i do like to set some criteria which side to take okay so if we have a square like this and we have a solution like this and if we are working with this primitive and this primitive then i would like to get the longer edges than the smaller edges if you take the smaller edge to pick one point then you'll have more linear or more narrow polygon polygon be created by splitting the polygon but i want to avoid that so i'm i would like to get the longer edges to create displacements to create this split in this case this one at some point right here to make the size of to make the shape of these squares become not too narrow now it's based on your preference but i that's my preference all right now let's do that so where was i so that's kind of the reason i also i have or reordered or sorted out the point number okay this so in order to pick the longer edge i need i first need to get the point position each of the point position and then calculate the lengths for each edges so i'm first going to create the array for the positions and access each of the point and retrieve the point position from each of the point number and append this value into the vector array all right now after i have created the vector array i'm going to access each of the vector positions using another for loop to calculate the edges to calculate the edge you need the neighboring point numbers never point number or adjacent point number so the first one positions at i index and by retrieving the second point position which by using the i plus one as an adjacent point and since this is a looped polygon i'm going to calculate the modulus like i always do now i have two points so i can calculate the lengths between those two let's say let's call this l and calculate the distance between the position one and position two right all right now i can maybe i have i can have another array to store this length value and append things l now i would like to get the [Music] the longest um value right here right from this length and since this is always a square value uh but maybe not there might be well yeah since we are only dealing with the rectangle right now so we only have four sides okay and meaning there's only two different lengths size one is smaller and one is bigger okay and that is stored next to it inside the length array so if you have shorter lengths in the first index then the second index should have the longer value right or vice versa if you have the longer value and the first index and the second index will be the shorter all right so keep that in mind and let's have a integer called index to pick to define what which index to pick which edge index to pick and then calculate i would get the conditions if the second index inside the lens is bigger than the first index then i would like to use the second index so update this index to one otherwise keep it to zero this condition will be enable you to choose the bigger or longer length edge index right now that i have chosen the longer index longer edge index i can now create a random points on top of this edge to create a perpendicular line all right so to so next thing i need to define the random position on the edge let's create this random values for float let's call this w and let's also have this as random numbers and i can create some seed using two iterations from two of the meta node for each loop so from the first loop i can get the detail attribute for iteration also from the second loop method node you can get iteration another iteration value and then use those two values with some constant value with some seed parameter you can set by yourself okay and let's also promote these parameters the c value you'll be able to create a random values for which is different for each iterations for loop now the range is currently in between zero to one so i would like to make this in between um some minimum value to maximum value since if this random value is equal to zero then the point comes here which creates a really narrow uh line which we don't want that so let's have let's clamp this value using some first of all let's fit this value maybe clamping is okay or let's use fit instead since it's from zero to one i'm going to set the range from some defined parameter to 1 minus the same parameter value so if it's 0.3 then it's from 0.3 to 0.7 all right apply show up parameter w all right okay now we can now use this value to create a random point on the edge so let's do that to create the random edge on the point we need to have two point which creates the edges so we can refer to this index right here and get the point position so the first point position will be let's name this um one one point zero p at index and the second point position let's name this one two is index plus one and again this is a loop polygon so if it gets more than four i have to make back to zero okay so now i have two points now what i want to do is to calculate the point position in between this point with let's say this one here and this point say this one here with the ratio of this w so if it's 0.5 then that's down the middle if it's 0.3 that's on somewhere 30 percent and so on all right so the final point position let's name this one m is cos one one plus cos two one minus plus one one multiplied by w okay and finally i'm going to add this point p t one m is equal to at point zero plus one m all right now i have errors here where is that thirty three poss two one is undefined okay should be one two now i see one points being created on the grid and if i change the seed i should be able to change this point position randomly and by changing this w i can set also the the maximum minimum of the point position all right okay let's keep this to 2.2 all right so next thing i like to do is to create a perpendicular line which connects this point to the other side so and to do that i need another point information right here using these two point information and calculate the the other corners point that's pretty similar to what i have just just done here i'm going to copy all these and let's name this 2 1 2 2 2 m and two two two one two one now i think i need to change one thing here which is the order since we are calculating the point in clockwise order the first one right here was using this point as the first point and this one's a second point now for this these one to use the same value w we need to use this one as the first point and this one as a second point to use the same w to calculate the same position on the uh the corner the the other corners point position so we need to change the order of all the point here so for this one for the position two one this should be equal to this one and also i need to add a i need to add two for each of the point index so if it's if this one if it's zero then you have to add two to get this point if for this one to add two you get this point so i am going first going to add two to the index and for these one both of them need this modulus calculation for this one becomes three now i need to make this index comes right here and this index comes right here and as a result you'll be able to create the other side other corners point now let's check this by changing the seed and all the position of the newly created point it corresponds to the other slide all right now now that i have two points i can just connect these together to create the line so at prim zero polyline p t one m and p t t2m like this did it show up i am not sure yet did it did okay so and finally i only need this line so i'm going to remove the original primitive all right so i have just created the splitting splitting line here and previously i have this polygon here so by having this polygon and split splitting line i can use the node called polysplit poly split to divide or split this polygon into two using the line and let's have this right here okay and since this is a feedback loop if we do this you can do this 10 times you'll be able to split like this recursively now as you can see some of the faces become too small obviously so we next thing we need to do is to set some limitation what will be the minimum size for this final square or final rectangle okay so let's do that next so we i would like to set two like limitation one is the side lengths for the square or rectangle and one is the area for the rectangle i mean maybe just setting the side lengths is enough so let's do that first so to get the side lengths i'm just gonna make it really easily by first of all convert it into line using convert line node which converts each of the oops polygon into a line okay i think i need to go back a little bit let me make this feedback loop to one and also let's connect this right here so that we have this simple node here and if we do this convert line i am converting each of the primitive with these a bunch of lines right here now okay and what i want to do is to check the lengths of the created the splitted polygons edge using convert line by using convert line it just changes each of the edge with the lines and it also has a parameter called rest or attribute called rest lengths which is the length for each of the edge and we can check these to see if the minimum value of this rest length is is within the limit that i have set okay so i need to set some limitation for the length so let's create some parameter here and a new controller so minimum wrecked lengths and set the range from 0 to 10 for now let's set it to layer 5 okay and copy this parameter and so in order to check if this lens is smaller or not the easiest way i could think of to get this minimum value is to first use the sort for it for this primitive the line primitive using the attribute using rest lengths as a result the first item you get the first index you get for this primitive has the shortest length right here now i can maybe store this and connect with some new node like sorted links and use the switch node to connect this sort uh connect the the splitted polygon to the first input and unsplit it the one that's not splitted yet to the second input for the switch and use the condition uh together with the shortest links of this edges together with the parameter that i have set here to see which node which output should i use okay so if so the condition should be first of all let's retrieve the rest length from the sword sorted lengths the primitive the first primitive attribute rest length so prim sorted lengths at the zero index and then the name of the attribute is called rest lengths and zero is if it's let's say if it's smaller than the uh the limitation then you don't want to use this polygon so you use the original one before splitting so make it smaller than the one that i have copied from the parameter which is the limit value okay and connect this one here now let's see if this works so i currently have this five as a final on the shortest edge length limitation and if i raise this iteration up it stops at some points so if i keep this to 10 even if i keep this 10 it stops at this point which is because each of the edge lengths is already close to five let's check this out i do another convert line to check each of the the shortest edge lengths and the shortest is currently 5.0 so i guess it does make sense okay so but five seems a bit too big for the limitations so let's make this a bit smaller now you start to see more split or division let's make it 2.5 looks good all right now uh so let's say i'm good with these um division now next thing i would like to do is to use this information to create a grid like this which is a 20 20 by 20 point grid and each point at each point you have this color attributes and the name attribute and the name attribute is based on the color value as well so if the color is one one ones and the name is also one underscore one and the scroll one if it's if the color is black then zero underscore zero and the score zero okay so let's try to create the same structures procedurally out of this output okay so one that have the edges i want to make it white and what one that's inside the square a rectangle should be black okay so first first of all i need to have a 20 by 20 grid points and i can create that by having another rectangle or a grid node and let's copy this size value and this time use it for rows and columns rows and columns and if i look at this number of points it looks good now let's also set the size of this grid corresponds to this point right here which this one is also 20 by 20. now this is actually small so i guess we could use this same size value for the x and y value all right now i think and maybe i can use the center of this primitive as the point position but it seems like it's a bit offset compared with the original grid point which is this one you see there is some offset here and that is because let's say actually i want to convert this primitive to a point not i'm not going to use the edge of this primitive as a point value so to make the number of perimeters 400 i think i need to raise the rows and columns by one so plus one plus one now it aligns correctly okay now looks good uh in order to convert this primitive into a point with the attribute i can use a primitive wrangle edit grid first of all i'm going to add a new point at the center which is at p okay which have created the point and i don't need the primitive faces anymore so remove it using remove trim like this okay now now that i have those point information right here um i could relate this together with this um uh how did i say the grid that i have created now if i look it carefully right here by showing the ghost of this grid and with these lines here the line is not really on the grid actually but we can kind of estimate this grid position involved what we want to do is to to draw this intersected grid point with a white and not intersected point as black okay so to calculate the intersection between the grid face and the line if if it's we know that it's a square grid the size of one by one so the easiest way is to just calculate the distance on the horizontal direction and the vertical direction to check if it's within this square or not to calculate the the perpendicular direction we can just use the projected distance a minimum distance between the point and the line and that case we could use either a function called min pass or xyz distance now let's use xyz distance because it's you can also retrieve the primitive number as well okay so let's do a point wrangle and this is the one that i want to convert the attributes and this is the guide to check if there's any section or not now i know that the grid side is one so i need to check whether this the distance between the point and the line is in within point five that's the gold number here so first of all i am going to calculate the distance using x y z dist from the second input with using the current point num point position and then if the distance is less than 0.5 then that means the the point is close enough to the edge which in that case you want to set the color of the point as white and set the name of this uh point attribute to one under school one school one okay else set it to black zero zero zero and the name to zero underscore oops zero underscore zero okay how's it now let's check it's a bit hard to see if there's any changes or not go into the geometry spreadsheet and there is a color for one and there is no color for zero so something is wrong so [Music] let's let me check the distance first for each point this is okay everything the distance is set to zero so this one is wrong okay well i was calculating the distance with the polygon so that was the problem so let's convert it into line first convert line so like this now i should be able to create this edge of the point which is on the edge to be white and the one that's inside as black okay now it looks good all right so in it in it grid two okay so i think structure wise this one which was using the node called wc wafc initialize and this one made it procedurally have the same attributes well i don't need this distance attributes anymore so let's delete this so it should do the same it should do the same um things so let's try to replace this with this one and see if this still works and the good thing about this one it's not time dependent so it's not going to be updated by changing the frame so but this one was somehow time dependent i don't know why but that was making this uh solver for wavefunction collapse being updated every frame okay now let's open this up and seems it's working so that's good and if i change this frame nothing changes so that's also good all right now going back to right going back to the initial uh state here which which is this one let's try to change some parameters to see the differences uh difference of the output from this procedural grid now i'm going to delete this one maybe i'm jim's gonna keep it somewhere else and let's say let's set some parameters like set the minimum leg lengths to smaller like having a lot of um great opening like these okay and it's a bit hard to see what's going on here so i might would like to create a visual guide with the rectangle and set the grid size to one by one grid two by two so it's easy to see what's going on here so currently we have a lot of small squares and see let's see what this uh this can what kind of uh grid bits it will be created using the wave function collapse now by using it you have a lot of small squares right here and as a final output now we can delete this file cache and the final output you see a lot of small building which is small enough that i cannot really see here which is still interesting but let's keep the size of the edge a bit bigger like having more than two pixels so going back and let's raise up some parameters okay maybe 2.5 is a good number here and we could also try increasing or decreasing the this the total grid size here as a sampling if i make it 10 and make this like 2.0 let's see what kind of patterns it will create it creates more more generic more constrained grid if i make it the 30 you have more randomness appeared if i set it to 40 not much changes 20 still good enough so let's keep with 20 and let's also raise this min rectangle up a little bit now looks good now at this point which is working just fine but i would um this will create a procedural like grid like i wanted but i would like some additional like constraints to the original grid the pre-series procedural grid like just making the square grid is actually not that interesting is it i don't think so and what i want to make is a some part to be l shape some part to be more irregular size not rectangular shape so that's the final step what i want to do here which is uh the last step why i'm going to explain and it's already been three hours so you can leave at any time i know it's a really long one i'm just doing it for my interest right so let me explain how we can do that well you can just finish at this point i mean basically it does what it does at this point but i'm just adding several constraints to make it a bit more interesting to me all right so going back let me check so what i'm going to do is after i have created these square grid or rectangular grid i what i'm going to do is to randomly pick some rectangle um out of this list of primitives and get the adjacent primitive like for this one get either this primitive this this this or this and then connect connect them together to create as one primitive and continue doing that for other primitives and it may it might make sense to choose from this smallest area for each feedback loop okay so that the smallest becomes a bit bigger and then again for the next loop choose the another smallest group to make a bit more bigger all right so let me do that so let's keep this as one set here maybe i'm gonna group this out then create another for each loop another feedback loop with a number let's set it to fetch feedback fetch iterations and this one to fetch feedback all right and then connect this one right here okay now let's think how we can deal with it the first thing i would like to do is to get the minimum uh get the primitive which has the minimum's area size so first i'm going to calculate the area using the measure node yes and then sort the primitive based on the area based on the area and after doing it i am going to split the primitive the first output i want to get the minimum polygon which is in this case this one and from the second input i'm going to output the other rest of the primitive right and what i'm going to do is to find a adjacent primitive for this small list from this these primitives so in this case either this one or this one right and to do that to find out the adjacent primitive all you can do is to retrieve the point position of this primitive then check the distance between each of the primitive within here which is in this node and then get the if the distance is zero then that if the distance between the points and the primitive zero then that is equal to either this primitive or this primitive all right and then randomly choose one of the primitive so let's do that and to do that uh again i am going to use another pointer angle so for the first parameter here second primitives here the i'm gonna call that rest and check closest okay now well maybe i should use the primitive attributes okay a primitive wrangle instead of points because i'm only from the first input i only have first primitive and i'm going to calculate the close of this pin distance be using all those points on the primitive so first get all the points and loop through the points like this and get the point position at pt then calculate the smallest or shortest distance closest distance between this position and second input using the xyz distance x y z dist and one at position now i also would like to retrieve the the primitive number for this from the second input like which one which primitive was the shortest in the shortest position so i would need additional output parameter one is the prim one is the uv so the third parameter is prim and this third fourth parameter is uv and the prim will be updated to the primitive number from the second input which is on the shortest distance okay and and i can create a condition if the distance is small enough which is close to zero then let's use this primitive now i could create an array uh and for m's to store this number of r a number of primitives that i have found like this okay now that i have a list of primitive uh which is in the array i could get the random numbers from this array so first random frame is equal to prims and inside here i can create the random index based on the the point position of the primitive using some seed value again and maybe using the iteration value as well so let's connect this one the third input and retrieve the iteration value and detail second iteration and okay now and i this is this is zero to one i have to multiply it by the length of primitive and finally make it uh integer value i'm gonna make it as a flow value all right now i should be able to get a random primitive number from the array which is adjacent to this primitive uh all right so next thing i am going to do is to actually retrieve that primitive number right this primitive so let's keep let's set it set this as a integer attribute to this primitive first so at r prime is our prime all right now next thing i'd like to do is to retrieve the primitive from this right here so going to create another new node name this min prim and then i'm going to create another split node for the rest and get the primitive attribute from this one the our prim so our prim min prim arc zero no uh zero r r prime zero is actually the one that i want to retrieve it's not adjacent is it what's wrong with it okay something is wrong which is not in the distance of equal to zero okay let's see why let me also have this crims okay well well let's see let's have this prims attached as an attribute for this one let's check this out okay something must be wrong here why do i have every but might be okay if i look at this primitive okay well obviously it's not correct it is not correct i should be i should be able to have seven or eight is it eight yeah seven or eight for this list but i have 10 for all them now why is that why is that let me check if this one oh well this has to be zero first of all let's check okay it's still wrong so i have retrieved the point position from the primitive and calculated the shortest distance let me open up the houdini backs functions to check the xyz distance functions if i'm using it correctly so i think i was using this one geometry origin frame uv looks good now and print points that's fine uh wait a minute what's this i should be doing like this i am getting the point from the index i i was calculating the lengths obviously that was wrong now i have seven seven eight and seven eight so looks correct now okay that looks good so this point is close to seven this point is close to seven this point is close to eight so this seems correct now i have retrieved the random values from one of the array in this case eight and as a result using that eight value i'm still retrieving something weird here so i'm using our prem and this i'm using maybe i should make like this okay okay now it looks correct yeah i needed this backslash here more back quote to make it able to use this expression in the group filter parameter all right now i think it's retrieved fine now what i want to do is to merge these two together and then make it as one single polygon right here okay to do that i mean in this case this is pretty easy because the point is being um at the same positions but there are pause there is there is a possibility that the point doesn't much like you you have one rectangle right here one rectangle right here somewhere like this in that case you cannot use like a fuse node to merge those point together to together with the divide node but you have to think about the other way now what i have found out is to use a first of all triangulate 2d to calculate the delaney triangle using all those points and this is actually not a good example to show why i might i'm using this one so let's let me ch change the the um initial values by changing the seed here let me also create the seed value range from 100 to zero to a thousand copy this one and go to debug node where it has a seed parameter here paste it right here okay now let's see let's check until we have a connection which has irregular shape which sometimes is not l but sometimes more like a pure shape so oops okay did it again all right now i hate this thing when we reopen this file [Music] now i'm not sure if i have saved it but there's a temporary file being saved so i'm gonna open this one okay so so this bond has been picked and the one that has been picked from here is this one it's still rectangle not good not good let's change the seed again now how's this so this is oops hmm let me change this to zero now okay okay why i'm not seeing it because i'm not okay getting anything here let me connect this one to right here for now okay and let's also make this one okay this is not good okay so this might be a good example showing a size differences here but let me also see more irregular shape like this one yeah this might be a good example so i still want to have this concave wrapped geometry out of these two and meaning i would like to get the silhouette of these two geometries now unfortunately we don't we cannot use this fuse because the point is not on the same positions and we cannot use like the silhouette labs extract silhouette from the side effects labs because this only works if the point is fused i think if i try to use this for the y direction it seems like it but it doesn't work seems like it's working is it no it did make it as one primitive okay so probably using this extract silhouette is might work after all let me check with other parameters last time i tried it didn't work okay so this one doesn't seem to work with this not sure why so this one keeps as two primitives somehow even if i fuse it or if i unfuse it i still have two primitives and this extract still it doesn't seem to work not sure why but so there are cases like these so in case i want to merge these together as a one silhouette one polygon one primitive what i found out is to use this triangular 2d first to create a dylan a triangulate triangulation then this will create a convex geometry out of all those points and what i need to do next is to delete the additional triangles being created which is not on the original polygon shape so to do that i am going to use the primitive wrangle for each of the faces together with this on the second input the original polygon to the second input and check the minimum distance between the center of the polygon to the original polygon and if distance is zero if this distance is close to zero then that means the triangle is on the original polygon if it's not then the triangle is outside this polygon then that for those polygons you can delete so do another calculation for the distance x y z dist at p and if the distance is small uh bigger than point zero zero one meaning if it's not equal to zero then remove prim zero prim num one okay now i can use the divide node to delete those edges inside with this option remove shared edges okay and this will create what i wanted okay that looks good and what else that's pretty much enough and connected to this feedback loop all right and i think i'm missing here because this since this is a feed back loop i need to merge this one with the rest of the primitive which is coming from this node output second output for the split so let's check this out yeah that was it so combine these with merge node we don't really care about the direction of the normal because we're going to convert it into a line later so it doesn't really matter about the direction okay now we have created this irregular shape and by increasing increasing iterations we can have more of these irregular shape by adding the adjacent primitives and then we can convert this into a line using this one right here to create more irregular shape right now i think having this iteration as a parameter is also a good idea so let's have that let's name this combine iteration combine iteration okay it's with l shape and diagonal shape might be interesting yes maybe having diagonal shape might also be interesting let's try that next if i have time all right so for the combine iteration i'm going to set as 0 to 10 should be enough so let's copy this one to right here so if you want to only use squares you can keep the combined iteration to zero but if you raise this up you can have more irregular shape shapes and together with the seed value you'll be able to create several different shape now if you if you want if you want to avoid creating this kind of like peer-like shape but only want to have a l shape like these you can have more conditions inside here when you are checking for the adjacent primitives but i'm not going to go through that you can if you want to do that just try going here and do it change the conditions right here okay now what else i could do now let's check what kind of geometry we will create using this setup like in this case we have this kind of shape here now let's also change some parameters here i think i can also copy a seed and use it somewhere inside this loops what was this doing okay this was deleting the triangle so they'll try and for the check what's this okay let's promote this parameter seed here and let's paste see it here okay so we can create a bunch of irregular shapes more than square so let's try with this kind of setup to see what kind of output we could get using a wave function collapse so by using this one we have now more l-shape like squares being created and if we show this up as a 3d maybe showing it as white first looks more like it yeah i like it well this is this might be too small but that's fine okay so it does what it what i want it let's also change some parameters if i change the seed also changes pattern now this creates a more like stair-like shape okay now what if we change this to uh something more different go back to this one the guide the initial grid and let's say the minimum size is 3.6 now it gives you a bit more interesting shapes like these and let's see what kind of shapes we get out of this one and as a result you get something more massive more longer dungeon like building it's a bit hard to see with the background dark alright well that's also interesting and the animation still works so after this it's a matter of the playing with the parameters what kind of output you like and you can test out by creating a bunch of initial procedural sample grid by cream which is which has been created in this process and then fitted into a wave function collapse node to create a bigger scale grid interesting isn't it isn't it now i might want to keep this to 2.6 or something and then have more l shape maybe keep it l eight then change the seed all right as you go all right like it i like it now if you have if you want to have more bigger size for the output you can go back to this wfc initialize one which has connected to the first input of this to the wave function and let's say if you want to have hundred by hundred um just set this hundred by hundred and recalculate it which won't create the bigger grid using the same sampling rule all right looks good isn't it and if you zoom it up and play it you'll have something that i have shown you as an animation now maybe i can remove this disabled lighting topple to make everything light up lit up black and white all right now let me also try with the diagonal shape if i could do it well it's still in a you still need to express the express it with the grid so even though it looks diagonal it's all going to be something more like uh how do i say that stair-like shape to make it make these things really diagonal you i i think it's a good idea to use other colors i mean you can use more than black and white colors but you can use many more colors for the calculations for the wave function calculations so for each colors you can let's say the red is right bottom direction corner or for the blue uh bottom to bottom left to top right corner direction and so on and so use those each of the different colors with different purposes might also make sense i'm gonna get into that uh because it's going i think it's going to take more time but if you do have do you have some that kind of informations then you'll be able to have the final outputs as a diagonal with the real diagonal geometry the other way you could think of is to if you have this kind of black and white layout and you see that there's a the the corner information has some different information like this one has three whites on the left bottom this one has the three white on the right bottom corner this one only has black on the neighbors and so on so based on those states you can replace the geometry what you want to place by using wfc what was it uh wait wait uh wang tile decoder okay so by using one divided quarter you can set or you can apply a new attributes to each of the point based on the relationship with the neighbor foot if you look at the geometry spreadsheet for the points you'll be able to see a new attributes being created [Music] which is i'm not seeing it is it or is it for the primitive nope hmm oh okay needed to touch this one now the name has changed from 0 to 255 which determines the the the neighboring relationship between the points and you can use those values together with a wang tile sample to place a already defined stash of geometries [Applause] to replace the point with uh jump distress geometry so if you look at this wang sample tile this is just a sample which it which has bunch of geometries and if you align it it looks like these and each of the attributes each of the primitive has a attribute called name i think primitive nope was it let me okay i thought okay so if you go to the primitive attribute there is a attributable name for each primitive and this name corresponds to the name attribute for this wang tile stick order so you can use copy to point node using the oops using a piece attributes using name you can place these um geometries which doesn't really look correct does it oops okay i guess that is because that is because of the oops because of the alignment of the grid i guess because i have made this grid procedurally maybe the point number for the grid must be something different than the original one being created right here so we'll look at the point numbers for the grid let's see where the zero starts from uh it's too big let's make it 50 by 50 again 50 by 50 or 40 by 40. and the zero starts at the right bottom corner right here and if i look at the grid if i look at the one that i have created procedurally now it does seems the same does it doesn't it okay well i don't see any problems here here i just didn't copy this note and right position somehow what if i use this one no it still doesn't all right not sure why maybe i'm doing something wrong here source group type primitive nope points pack and instance oops not really sure maybe i should use the pack with the name oops transfer attributes name well well forget about it i don't really use this for this example okay well let's let me try with the diagonal shape now like what i can do is going back to right here for the first one where i was splitting the grid and just change a few of the code for the divide the place where i can change is this w okay so by changing um so this is the co the second corner this is the first corner and for the maybe for the second corner let's try by adding by like 0.1 you'll be able to have a bunch of diagonal curve like these okay now let's test this out together with a merge node which creates really irregular shape and the final grid looks like these now since if you want to have a diagonal shape you might want to have more resolutions currently this is pretty low res so as a result you get something really uh not wanted something like these yeah you might need more resolutions when you have a diagonal shape so having tons of diagonal shape doesn't really make sense so let's set some limitation so let's say there's some random values is there a seed for this okay so if rand and if rand e21 multiply by e to the two multiplied by some constant value plus c is less than point one then add or update dw by point one point two what was the minimum we have to also look at the minimum value which is this one right here so this this has to be a bit smaller so let's say 0.5 okay so some of the line became that um curved or diagonalized and some of the curve being straight doesn't really look good though let's say 0.05 well still if i change the seed okay and go in well because it's pretty low res it converted into really square grid now if i have set this to 30 and now i'm if i have more the bigger size start to have this kind of shape now okay maybe i might want to have more diagonals it's parameterized this is well for this threshold okay let's see with these now looks a bit better than the last one but still not that good is it maybe i should keep it as zero okay so it's pretty much uh all what i wanted to show and i have spent like three hours and a half sorry for that if there's anybody still watching all right well it's time to well let me give me some time to make all these parameters that i created stored inside this controller and i'll finish this so first of all i i think i have stored all those parameters okay this one was to change the the minimum or maximum edge length so let's give it somewhere here and min edge red point toss keep it to zero to one let's set it to 0.2 and copy this parameter go back here and paste it right here okay now going back to here what was the parameter i could change think i have all these parameters being stored okay these are good okay i think i can also control the iterations of this one but i mean this iteration doesn't really matter because it stops um if if you couldn't find any like bigger lengths to divide so keeping as high value is fine i guess this one is small so let's just keep it as 10 and for the initial grid that's also good yes happy new year this is yeah december 31st so we are ready to celebrate the year and 24 hours at least for me yes some of you lives in different time uh scale so you might have a new year later or earlier probably for this one okay i i can set the size of the grid as well let's keep this to a default value like 2.5 and which this looks a bit too small isn't it let's keep this to three or four [Music] and 2.607 yeah this looks better okay now final yeah i could parametrize these as well i guess so and i can also parameterize this one as well just in case so let's go and let's make a separator so that i'm i know that i'm updating the functions or parameters for the wavefunction claps the first one is the grid the output grid size well more output size you have the calculation becomes slower for sure but let's keep it hundred as a maximum and then the sampling number so sample num the minimum let's set the minimum to two and a maximum to four okay and for the output grid start with the 50. mean you could also make it like rectangular shape i guess didn't try that out let me try this and for this sampling three is default so keep it as three now open this up and oops now it seems to create a bit more to still like shape let's see why and that is probably i there was two big squares right here maybe i needed to split more of these in order to make it more to have more smaller grid or you can update the sampling number to 4 which will sample the larger part of the initial grid to make it more to preserve more original shape yeah looks good but the building is a bit too big so i'm going to keep it to 3 and set the minimum last length size to 2.3 which creates well let's keep it 2.5 that looks good isn't it okay so i like this defaults this settings currently now what if i change the size for the columns does the shape also changes that it does seems like does seem so okay seems like if i changed either side of the width or rows it also changes the pattern not show why what if i change the 0.6 right might be might be because i might need to uh okay wait a minute [Music] i'm it might need to be that the if this the ratio of the width and the columns and rows must might need to be related to the the source that might be the reason is that so i don't know what looks like it yeah if i set it to one one by two ah this one seems to work this way seems to work but if i increase the columns more and set the rows smaller this starts to give you some weird result i don't know why let's set it to just set it to square size shall we i guess is how it's being implemented using python if you look at this one there's a python note here so i guess this is the one this is the place where the side effects has implemented this algorithm okay so in terms of the parameter this is good what else going back going into the later node views divide sort simplify okay so those are parameters i could change let's open up the node control again another separator oops not the label not the label okay and simplify let's unlock for a bit linking parameters and then drag and drop these wait a minute this seed can be coming from this one i guess but no no no since this seed also changes the output for the wave function parameter we should differentiate this seed value because if i change this one then the another um calculation for the wave function collapse another solver would run so we need another seed value here let's name this c2 set the range from zero to thousand or i could just drag and drop this one drag and drop this one drag and drop this simplify small let's see set the seat same to zero to thousand now what else extrusion so i have this power extrusion power hs this is the window okay well i don't use this anymore so let's ignore that min sc so this is the minimum scale value for the window size so min window scale scale okay what else seed okay for this seed i can just copy the one from here so let's leave that for now max layer height okay that's the value to determine the layer height differences for each building from one to this max layer used as a multiplication value so set the range from one to two that's fine okay apply except going back to the null node copy the seed value here and then paste it here okay and going to the extrusion if you just want to show this as a shaded building that might also is interesting might be interesting to do that what's this to do that we can have additional code here well first let me delete those hs and bs which i don't use this anymore and then i am doing this for each primitive okay and for each point i can set some color related value or height related value where is the point creation uh search for add point okay so this is the one this is the position where i'm adding the point so i can add a attribute to this point like call based on the height so new paths dot y divided by the height was defined where was it the new pass the c plus wait a minute okay oh yeah this right here and using this h value so the new pos divided by the maximum height is the one that i need and h that will be h multiplied by l what's the maximum lhs okay oops at wpt still so call set point attribute call wpt uh and pause new pause right now if you just want to have a ambient occlusion shaded color you can just update the point color using the ram from attributes using color now i think i have some issues with those points here i guess i think i need to look back into the extrusion there should be other code adding a point okay so this one so set point attribute add the same color call attribute to this npt and pass dot w i mean and pass dot y divided by h multiplied by lh s okay now if i hide the wires it will show you a clean shaded building which also looks good based on the height now that was the side effect and going back to the window and there's another parameter you can set one of the ratio ratio is based on the time frame so we don't really need to care about for the minimum maximum well i guess it's so okay with those constant values so i guess i have just done i have just transferred all the parameters that i need in order to create this set up okay now finally i'm gonna make this dark and set the size for the output 200 to make it big enough all right now some of the building looks too high so to reduce that i can go to this extrusion power and make this lower value like 0.8 since this is based on the area of the building okay well maybe i could have another type create a seed change the seed whoops that's too much that is too much now this is because i think it's because you have more diagonal shape and now this one becomes 2 squared grid now that's not that interesting let's go back here and see what will be the best parameter to make an interesting shape together with the diagonals i mean the not the diagonal but with the l shape or irregular shape there's the ball what about these i guess if we want to keep those structures more we should increase the sample rate as well current i don't want this kind of too long too linear stuff do we so first of all i'm going to raise up the number for the minimum rectangle lengths to like 2.7 then minimize the value for the combined iterations raise up some change some seed values and then set the sample numbers to four i still see some small edges okay now this looks good okay so how's this how does this go since i have changed the sample number to forward uh calculation time guess gets up longer much longer now it doesn't look good it doesn't look and what if i change this to three does it still look uh well no nope 2.5 [Music] looks too small to me yeah it looks too small so i should have more than two right here this one looks good in terms of the oops okay well um i do see a bit too rectangular shape here now let me also check this allow rotation and see if this changes a bit okay now it looks much illegal but a bit better but there's too many ladder-like shape let's change the sample to four again all right well maybe that's not my b looks might be better okay looks too high but i can reduce that by changing this power to 0.5 that's too low yeah that looks good enough okay so the was you can see setting the balance finding the good balance for the wave function collapse is a bit hard but i guess i mean for me it's the first time i'm using this node this algorithm so i think i'm gonna try this out a lot more for other usage okay that looks good now finally let me also have some additional value to this one and and this tutorial i'm going to add some yellow light and the last then i'm going to finish this so first of all i'm going to create another random value based on point and some seed maybe seed for this one as well and then loop between the white color and yellow color which is one one zero with l and that's it more like a building now okay that's it what time is it one 1 am so i have done like four hours uh sorry for being so long this is the last uh algorithmic live for this year i will plan to continue next year as well at least until 50 this is the 42nd i haven't thought about if i do for the next week since next week is the new year's holiday but let's see um so thank you for watching if anybody's here everybody's still here and i am going to keep this as an archive so you can go back to the same url to check what i have done and also i'm going to upload the hip file or this one that i've just created to and paste the url to that file in the video description page so you can download it but in order to use this file you have to have a houdini 18.5 because i'm using the new structure school dictionary and as well as the side effects labs being updated to the latest to use the wavefunction collapse node okay so that's one thing you have to be careful of all right so thank you for watching and i if you also find this video interesting i mean and helpful for other videos i have also started the patreon myself so it will be great if you could support me on that as well if you feel like it you can go to that patreon page from the video description page as well okay so good night everybody and i hope you have i mean happy new year to everybody and hope you have a great year next year okay good good night and see
Info
Channel: Junichiro Horikawa
Views: 418,362
Rating: undefined out of 5
Keywords: houdini, sidefx, live, tutorial, procedural, procedural modeling, parametric modeling, parametric design, parametric, fabrication, digital design, computational design, 3d, design, isosurface, lattice, structure, 3d modeling, modeling, computational, generative, line drawing, drawing, illustration, fractal, reaction diffusion, celullar automata, simulation, trail, particle, vfx, mitosis, magnetic field, magnet, field, volume, rendering, computer graphics, visualization, algorithm, motion graphics, graphics, voxel
Id: 6jVk4tLTVjQ
Channel Id: undefined
Length: 237min 54sec (14274 seconds)
Published: Wed Dec 30 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.