Houdini Algorithmic Live #106 - ASCII Art

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hello hello can you hear me you can hear my voice good afternoon so so this is the uh this is ginger horikawa and this is the weekly Houdini uh live stream which is called as Houdini algorithmic live to do some tutorial live stream using Houdini for a bunch of algorithmic design themes and today I am going to try to create a process to convert a given geometry given 3D geometry into a ASCII art so-called asciard which is a art made by all the letters by picking up the features from the 3D geometry now most of the time when you create an asking art and computer Graphics you just use a contrast from a 2D image but since we are using 3D geometry in this examples rather than just using the contrast information or brightness information I'm going to add additional features to try to visualize the geometry using letters such as like curvatures or tangent field something like that which you could retrieve from the 3D geometry to make it a bit more interesting than the original ordinary asciard conversion okay so that's what I would like to try to do right from scratch so let's see how it could do this if you have any questions during the live please ask you or if any feedback suggestions anything is welcome okay let's start from scratch we're going to create a geometry node to start with and the first thing I would like to create is obviously the base geometry which you want to convert it into an ASCII art so let's do that by first of all just using some test geometry like cut as always all right so let's try to use this as it is and first thing I'd like to do is to apply some diffusion information to each point meaning some shading informations which can be used as a contrast information or brightness informations in order to uh convert these points or convert these surfaces into an osteinaut based on those contrast Okay so so to do that first I'm going to remove all the material informations from this and try to create some shading information using a simple node from Houdini so I'm going to use the attribute delete first to remove such as material or UV Maybe I could keep the UV bot let's try to delete the material okay it's just delete the UV as well which I don't think I needed okay and probably I might want to have a bit more resolutions to this big head in order to make a high whereas um shading information so let's just bring up subdivide node to subdivide the geometry a little bit maybe one or two to make it a bit more high-res like this all right now uh next thing I would like to do is to create a shading informations using maybe a pesado or some fake lighting or something like that and I found out that the easiest way to create a fake lighting stuff is to use a node called um what was it called mask by ambient occlusion node which is the first time I use but this is this was pretty useful in order to create this is to create a masking on top of the surface um by creating a fake or virtual lighting directional lighting or ambient occlusions in this case I'm going to try to create an ambient occlusion as a mask so let's see how what it does I'm gonna turn on this one to see how it affects the geometry and then by using mass by ambient occlusion node the check the toggle calculate ambient occlusion is checked as a default value and there you can control how much ambient occlusion value you want to this geometry the red part will be a value close to one the white part is where the value is close to zero and you're going to get a attribute called mask on each point okay uh hi everybody thanks for coming Okay so well Arts is asking please explain the idea concept please okay so to briefly explain the concept what I'm gonna do is to try to convert the given geometry into an ASCII art meaning um picking the letters like ABC alphabetical values or all the letters of your choices into to draw a 2d Graphics of this representation of this geometry and in order to do that what I'm going to do is to create first of all create a brightness information on top of the geometry in this case using ambient occlusions so to create a virtual shadow so meaning you'll get a value in between 0 to 1 in terms of the brightness and based on those brightness I'm going to choose which letter to use which which letter to represent that specific point if the if the point is really dark then you might want to use the letter with small density like dot or comma or small lowercase i or something like that which uses small space for one character if you if you have a high density value if the point you picked up is bright enough then you might want to use the character which fills the space a lot more than dot or comma something like M or Q that Mark or something like that so that's the basic rule to visualize those points with the letters and additionally I'm going to get additional features from the geometry such as curvature Direction like principle curvature directions [Music] or tangent field to use that directional value to pick the corresponding letters now from the letters you uh can't you don't really have the directional informations from it but you could try to assume its direction by using a bit more geometrical analysis on those letters such as using um trying to get eigen vectors to see the flow of that character geometry So based on those flows and based on the curvature flow on top of the geometry we could match the letters so so I'm going to try to use at least two features to pick the corresponding letters for each point on the surface which is going to be projected on the 2D plane so that's my plan so let's do that okay so the first thing what I was doing is to try to get a nice ambient occlusion parameters using by tweaking these parameters but I'm not sure which one's good because it's right now it's white and red it's a bit hard to see so let's try to convert these value into a bit more shading friendly look by making from black to white the darker area will be black the bright area will be white so I'm going to use a pointer angle and let's check the geometry spreadsheet so we have this mask information which is from zero to one so let's use this to visualize the geometry with a shading so what I'm just going to do is to just color these age point with a mask attribute and that's pretty much it and there you go you are going to get a nice ambient occlusion shading here based on all based on the this visual maybe I can tweak a parameter a little bit more let's just to have a bit more contrast on the geometry like that okay looks okay I guess all right not bad okay so let's try to go with this for now thank you everybody for all your comments right so I'm gonna name this mask transfer and I'm going to also copy this mask rename this mask to something else or maybe I can just use mask as it is yeah maybe okay well so um one thing I could try in order to make probably I might want to have these uh darker areas to be a bit more darker a bright area to be a bit more brighter so in order to do that I am going to try to modify the mask by using power functions to see how it works using power of two yeah a little bit better you have a bit more high contrast in between the dark areas and bright areas okay sounds good and if let's go to the next step now the next step I would like to do is to project this um geometry onto a 2d plane and in this case I'm just going to use the orthogonal projections to make it easier you could try to do the perspective projections by using the real camera but that's going to take a bit long time so I'm just going to project this geometry onto a 2d plane somehow to be able to create an ASCII art as a final visual so to do that first I'm going to create a 2d plane or 2D grid which covers the whole geometry okay in either Direction X Y or Z Direction okay so shall we do that so in order to do that um what I'm gonna do is to first of all create a single size grid geometry foreign like that and make the rows and columns to two and two so that you don't have any inner lines and make the size one and one so that you'll be able to it'll be easier for you to scale it using vex and let's make it placed on X Y plane so that you can project IT project the pick head on top of this face Maybe x z plane my Z plane yeah this will be better okay now obviously the size is not big enough so let's fit this plane with this big head what I'm gonna do I'm going to use the point Wrangle to modify the size by retrieving the informations from the original geometry in this case epic head and then resize I'm gonna name this resize quad okay first thing first uh what I need is the the boundary box information of this pig head so first of all I'll get a size information by using a function called get box get B box size which you'll be able to get a size informations and vectors and also let's get the center point position off the bounding box from the pig head so that this will be the center point position of this plane okay now that I have this informations uh actually I want to make the grid as Square meaning the width and height is the same value so I'm going to choose either with or height or X or Y or Z size of this pig head probably I'm gonna just use the try to get the height information off from this big head so that case the height is size dot y okay so this will be the size the base size informations for this plane but if the height is smaller than the X directional Z Direction size of this pick head than the plane the pick head will not fit on the plane so I might need some offset value as an additional parameter like that now I can just use this to be a size of the quad in order to modify the size of this quad you can just change the point position information by scaling the current Point position so currently we have square and you have a total Four Points and what you want to do is to move each point to a diagonal direction from the center with some Vector value so that the size will be H and H right in order to do that currently you do know this size right for X and Y so the actual directional value for this value you do know the vector Direction the vector direction is just a normalized p am I right and correct it's just it forgot which ones they're normalized okay so you do know the direction but you don't know how much you need to move from that direction okay what's this A so you can retrieve this a from the height informations by just using some simple trigonometry or just use a triangular formula so this is 2H this is 2H so 2 h squared plus 2H Square root and then you'll get a this is the calculations you'd need to do so let's do that so um float a is equal to H divided by 2 power of Q meaning square of this value multiply by two and then square root okay now you can just create a directional Vector which is a normalized p and then multiply by a then you can move the point to that direction and from the center and you know which ones the center this one here so from the center move to that direction there okay I think I'm missing something and there you will get a um Square which will which can be used to fit this big head if it's equal to zero it fits with the height but as you can see it's the height is not enough for the width so I am adding some offset here okay okay it's good okay so this is good for um our everybody [Music] size functions within automatically recognize well you can use get bee box size to um using Vex and this is a prepared function for Houdini back so yeah you can use that um hello everybody when you used in Durango when you use the internet I usually just use the match size node ah well I realize there are no cool match size as well which might be which could be much better in this case I haven't used it myself so I'm not sure how to use this require geometry to move and resize bounding box so this should be it is it is it I'm not sure scale to fit ah nice okay this is much easier I'm not sure how I can able to make it as a square maybe you don't have that option this is cool well I'm gonna remember this thank you I'm gonna go with this one for now okay so where was I so now that I have this grid which covers the pig head and next thing I would like to do is to divide this Grid or divide this square into some bunch of rows and columns so that I can use each cell as a placement placeholder for the letters okay so to do that you might want to have a parameter how much divisions you want on X and Y Direction okay so let's try to uh first of all let's try to have that parameter informations applied maybe As a detail attribute so going to use the attribute wrangle to try to divide this grid using detail attribute first of all I'm going to set a parameter for integer to see to say how many rows and columns you want maybe let's make this maximum like 300. okay and in order to divide the grid the easiest way I could think of is to use a divide node and inside a divide note there is an option first of all check off turn off this convex polygon and turn on the breaker polygon here and there you'll have an option to choose the size of the division here by choosing these values yeah I want by choosing these values okay it's not changing somehow maybe X is not really doing anything but I might need to change z and y oh yeah so by changing these values you can divide these grids grid with the size defined here this is the size for the cell and Z this is the size for this Z directional cell size and this is for the Y Direction but you cannot just use like any random numbers here because there is some problem in the top as you can see the size is not matching with other cells so the best way to make the clean grid is to divide or get the height or the way the information is from the square and then divide with some numbers you have defined then use that divisional value created from a value evaluated with that divisions to use it with this use it for these height or width informations or divided size informations so that's what I'm gonna do here try to estimate the value of each size of the cell by dividing the height the total height with this division so in order to do that you again you need to have a height or width informations from this grid so I'm going to use the get B box size function again and since I'm I have set the X and Y the same size I can just get either one of it size.x then divide it by division then you'll be able to get the cell size I'm going to apply this to a detailed attribute so that I can retrieve it inside this divide node now going back to the divide note I'm going to try to get that attribute from the detail by using detail function get the own input and delete attribute name is cell size and get the first value okay I think I did something wrong here see the cell size on the detail okay it says zero so something is wrong so probably I'm doing something wrong here let me check if I have got the size correct okay first of all I shouldn't use x but I should use Z all right now it works because X is this direction it's equal to zero so yeah that was the reason so it looks good I can now go back to the Divide node and just copy this parameter and paste it to here since zny shares the same size okay now you get a divided Grid in clean manner every great cell has the same size and by changing this parameter you can control the resolution of this grid all right let's go with the 80. okay now uh the grid is ready now it's time to project the information of this 3D geometry on top of this grid now the first information I want to project is the brightness okay so meaning I just want to transfer those black and white value in this case control manage with the attribute called mask onto this grid and this direction meaning in this case X Direction okay so let's do that it's pretty easy I can what I want to use is to project in from each information onto a cell as a primitive so I'm going to use a primitive wrangle right then try to get the informations from the the masked geometry which was this one by connecting to the second input and how do I call this projection okay so in order to project um or in order to get the projected informations for this geometry to this one what I could think of is to do some intersection testing so if this is the ball or if this is the 3D geometry if this is the grid I'm just going to cast array from each grid orthogonally in this case extraction and if it hits then get the mask information if it didn't hit just apply something like negative or zero as I'm asking information okay so let's do that but the thing is currently the geometry and the grid is penetrated like that so we need to have that as a consideration so in order to use the intersectic functions in Vex you first need to have a I'll put information as a variable something like intersected positions and UV now you can calculate the intersection calling intersect function intersection test to the second input which is this geometry picket geometry then the starting position should be somewhere outside the packhead so somewhere around here or maybe here either way probably better here so that is the positional uh positive X Direction from the current grid so we need to move each grid position to the X positive direction so the starting point of intersection it will be P which is the centroid of the Primitive Plus some offset at Value in the X Direction which can be really big just in case that the geometry could be really big or we could check the size of the geometry by getting the minimum and maximum of the pig head and based on those values maybe that's more safer so get the maximum and minimum informations from the pig head and what we want to do is to use the max dot X which will be the maximum X directional position and just in case I'm going to add some offset value to this so this I think this will be enough as a position now next you want to have an intersecting Direction the direction which you want to raycast so which will be negative X so in this case I could use a size of the pig head geometry to Define how much I need to uh throw a raycast so get the bounding box size from the pig head the second input then use size.x and just in case added by some additional offset value into the negative Direction as an output you get into intersected position and UV all right so if there is any intersection the inter the integer enter will be more than zero equal or more than zero meaning you're going to get the not primitive numbers so if enter is equal or more than zero then you'll be able to get The Mask informations so get the mask information by using Prim UV function from the second input the attribute you want to get is the mask enter is the Primitive number and UV to specify the position now once you get that value you could try to visualize it by changing the color of each primitive to see if you have correctly projected and seems not seems it's not working everything is whitening I think I have done something wrong here yeah let me see okay push the ball I need to check if the intersection has success or not so let me check if intersection is equal or more than zero then make it white if not make it black and see if the intersections itself has success or not okay not so I think I did something wrong here see why hmm so this is the point position okay and this is the let me try to change this to some random numbers like 1000 and 2000 and see if this is going to work okay it did work so um the things that I set using minimum maximum was obviously wrong which which I want to fix it okay so let's see how I fix it versioning first um using the maximum value retrieve from the pick head will be okay seems okay adding a little bit of offset still okay yeah so seems like the one that I did here is some problem the size value hmm okay why size dot X nope okay I might need to multiply it by two no they don't still work let me check what's the size here kind of attribute do I get and also I'm going to try to get the max as well to compare so the max is 0.9 okay the size is okay well it looks looks okay to me I mean I'm just using the x coordinate of this size and to the negative Direction shouldn't be wrong hmm funny so why it didn't really work I'm not sure if I multiplied by 2 and 10 okay now it works so probably the array cast Direction was not enough well obviously I need to maybe this offset value was necessary yeah probably like that okay by doing that the the pros of doing like this is if I change the size of this big head to something really big it should still work yeah like that now the plane offset is a bit off but it's fine Okay so now this seems to work now I can continue now I actually what I want to do here is to use the mask to color okay so seems like the I have successfully retrieved The Mask information as well so it looks good and let's also apply some primitive group to where it has intersected so set cream group hmm intersected to these primitive because you might want to choose whether you want to apply a text to those empty spaces or not you could do that or you could remove the text to those empty spaces so in order to do that you might want to have that kind this kind of information whether this grid is intersected or not okay all right now that I have a mask information I mean let's also apply the mask just copy the mask to the grid as is and this can be used as the brightness the information okay so I could try to move the letters by using this brightness informations as a initial test then later I can add additional features from the geometry like curvatures to to give a bit more optimize or detailed letter selection algorithm so let's try to use this one for now to pick the letters in order to do that I'm going to use the font node to create a bunch of letters on Houdini as a geometry to create the surface or to create the letters okay just choose the font of your choice um arayo maybe I might want to use the Bold font so Raya Bolt okay one thing you could do here you could just type any letters you want to choose you want to use like this but it's gonna take a lot of time so I'm going to list up all the um latin-based possible characters by using some python code to get all the possible characters by translating the Unicode into characters so what I mean by Unicode is if you search for Unicode on Wikipedia you could actually um Translate the Unicode value which is these decimal value to this corresponding chapters like that so that's what I would like to do here um prepare it a bunch of numbers maybe starting from 33 until maybe 126 or you could add additional characters and then convert it into a letters using python now this cannot be done in Vex so that's the reason why I'm using python Okay so since I'm using Houdini 19.5 as a version the python version is three dot something so I have to write in Python 3 grammar okay first thing first let's create the empty string and then create a bunch of number arrays which you'll be used as a Unicode value so from 33 to 126. so range from 33 33 to 126 okay and then for each numbers I'm going to convert these I value which is this decimal value into a character by using a function called ch R which is to convert a decimal value into a characters the text characters and then add that character to the text one by one okay I think I'm having an error where is that okay looks good is it not sure now after I have created this string I need to apply this to a Houdini attribute maybe in this case detail is fine so let's do that first I'm going to create a Geo detail attribute by accessing to the Geo node or Geo information call the function call attrib and the type of the archery attribute is global which means detail and I'm gonna name the attribute letters then the default values empty or maybe I can just set the default as text that will be fine didn't work uh for I okay I need in okay now let's look at the detail and I have okay it's empty so it didn't work so I'm gonna make this empty then I'm going to create I'm going to call the function called set global attrib volume the attribute that I want to set is letters and apply text see okay now as you can see I have bunch of letters converted from the integer to the letters all the possible alphabetical characters numbers and some unique characters okay looks good now I want to access to this detail from this font node so give a no node with the easy to remember name connect with the python let's name this letters okay now it's time to get that informations in order to use the Expression inside a font first you need the the back quote then call detail the name of the node the name of the attribute and actually we want to get the string so it should be detail s and that should give you a list of characters like this all right now what I want to do next is to calculate the the density of each character's corresponding to a grid cell and yeah in order to do that you need to separate each characters into a separate Square so in order to do that I need to add additional text attribute to each primitive and as a result for each primitive you you'll get a attribute like text index and text symbols a text index is what I want this is the number of each characters if it's if the characters separated into multiple primitive like this one one two three you'll get the same text index starting from 0 0 1 2 3 4 and so on okay now that I have these let's try to calculate the density now the density can be retrieved by just first of all set a base quad which will cover the letter and then calculate the area between the base quad and the letter so you can just divide the letter area with the base area and then you will get the density if it's 100 then the whole quad is being used if it's 50 then 50 of the Quad size is used as the area okay so in order to do that first thing first we need to create a base grid for each letters so note that in order to do that I am first going to move this grid to organize this text a little bit for example move this letter a little bit to the upward by the center okay so that the center of the font will now be at zero okay now let's create the grid the simple grid geometry two by two 1.1 and I think we need to make this grid Direction same as this pick head plane so now that I think I can just reuse this grid for this text okay so let's connect this grid to a new node named as grid and then link to that grid using object merge at yellow to know that this one this one and it's being linked then linked to this grid now you can turn on the link Network which one is connected to which pi uh toggle this show for selected node and by selecting to this grid you see which one's being related this font is related to this letters and so on okay now now that I have this Grid it's try to cover these font with this grid now direction is 90 degree at different so let's also rotate this by 90 degree all right okay now in this case based on the height of the this font let's try to choose the size of this base quad so just like I did for resizing the grid which covers the pick head I'm going to resize this quad based on the text but with a bit different information okay and in this case I'm also retrieving the size y from the second input that's fine having an offset that's fine everything else this one is not really necessary I think we don't really need to change the center so just remove it and instead we're just going to start from the own Center so like this or you can just say direction as it is okay then you can change these offset to C say how much quad size you want for how much base size you want for each letters okay let's make it point one for now all right now that I have this grid let's try to calculate the density for each letters at this point so in order to calculate the density I'm going to use the area first of all I'm going to calculate the area of this quad as a base and do the same for each characters and I wanna I want to pack the area for each text index so instead of each primitive I'm going to choose per piece and then use text index to pack the area or get the total calculated area for each text index okay and if I do like that going to the Primitive oops didn't really work is it did it um per piece am I using the text index okay hmm um if you have the same text index you're supposed to have the same um area but not doesn't really look like so so after all you might need to just add it yeah it's not really equal uh this doesn't really work does it no this not just okay so what's this for not sure do I need to make this as a string no I don't think so hmm refine to connect it okay now it seems to work I guess I needed to check off this thing here but I need to check if this is really correct if this area this this calculated area for text index 0 1 or 2 is correct right now you have zero the same area I am I would like to have make sure that this area is the total area of this text index equal to zero so in order to check that I'm going to just get the text index equal to zero okay apostrophe recalculate the measure using and total area and compare it with okay so it says .084 and this one for each parameters zero eight four okay so it looks correct good now by having the total the area of the grid as well as the area for each characters you'll be able to calculate the density by just dividing them so use the Primitive wrangle calculate the density for each primitive first of all let's get the base area from the second input um and then divide calculated density by dividing the current primitive area by the base area this will be always in between zero to one since the quad always off will be bigger than the letters and the density let's check the density as an attribute okay let's check so you have round point from 0 to 3. okay so you don't really have much big density here the maximum is like 34 percent so in those cases you might want to maybe remap these density into zero to one for meaning normalize the value so that for a ease of use okay so that all the character has some possibility to be used okay so what the let me go back to here and use the attribute promote to get the maximum value of this density from primitive to detail get the maximum get the maximum density and then remap the density value using another primitive wrangle then see T is equal to fit density which is in between 0 to detail two zero two one now hopefully the density will become from zero to one like that okay looks good now we are ready to actually place these text to those cell each cell corresponding shading cell okay to do that I think it will be much faster to pack each text as a packed object so do that and in order to do that we I think we need to have a string piece information for each characters to use the option called name attribute so let's have another primitive wrangle I mean you could just do this here but I think it's better to make each process separately so name so the name just can be retrieved from the text index you just need to make it as a string instead of integer so the name is equal to i2a convert integer to string by calling the text index and let's check primitive and you have the name that looks equal but actually these are string these are integers which we don't we can't really see from the geometry spreadsheet okay going to the pack turn on name attribute to use the name to pack to Chris Pack the corresponding names and as a result even if the Primitive is being separated you can have the one that shares the same name as one packed object all right all right and I think we also want to transfer the area or density attribute to each packed object which can be used to choose which one should be used for each shaded value all right I think we have enough information to process the transferring so what we need to do now is to the easiest way I could think of is to place each letters onto a corresponding cells is to use copy two points right and just in case I'm going back to the pack and also transfer the text index as well as well as name okay now copy two point have a piece attribute option which can be used to um if the point and the geometry shares the same attribute then you can just move that object to the corresponding point so to do that you need to create the points out of this cells with corresponding size information right so let's do that hmm I'm going to create a primitive wrangle hello everybody so first let's create a point which is pretty easy you can just say at Point at p now there are a bunch of informations you need to attach to each point and one is the what text you want to uh use onto that point okay as well as the scale of each cell and also as an additional information if you want to set the grid to where the intersection is false so let's start from the intersection one I'm going to create the integer value which is use uh drill outside integer which will be either 0 or 1 so I'm going to create the toggle parameter here use outside or Draw outside like that and then call that parameters if draw outside value is equal to zero then you don't want to draw these so or maybe you can just say is if it's equal to one then just add the point a mistake and then you'll be able to choose whether you want to add the point okay but I think I need to have additional uh conditions in order to check if it if the point is inside or not so if it's draw outside wait a minute this is not really correct if it this is I probably need to well first of all I need to check if the Primitive is intersected or not so intersected in Prem group intersected frame now okay so if this is equal to one and um this is equal to this is equal to one then you obviously want to draw or drills outside and maybe this is what I need okay this will do the job so you have two conditions you're outside is equal to one or intersected if the drill outside toggle is off then the outside cells is not going to create a point but the intersected one will if it's checked then all the cells is going to be used all right now next I am going to find the best text characters based on the current mask information okay so to find out the best matched value you want to look for all the possible density from the packed information which have all the density value and you what you want to do is to pick the the closest uh text out of this list now I am not sure if there are any efficient way to find out um the the closest Value let me just check the Houdini X function and if there are no well there are function like PC fine so maybe I can use those probably instead of using position as a search filter so what I want to do is doing something close to a new point but instead of using Point position I want to use other attributes in this case density so probably I could use PC find Maybe since this can change the PC Channel instead of Point position so let's try to use this shall we I'm gonna make this aside this is a bit too okay and in order to use the PC find I think I need to have these density as a point attribute but in right now I have it as a primitive attribute those density and names so let's promote that to point attribute promote density from primitive to point let's not delete the original now you will going to have a density on points maybe I could do the same for text index and text um name and then text index so text index and name just in case I'm not sure how I'm gonna use this all right going back let's search for the closest value using PC point so um PC find from the second input the channel that I'm gonna use is density and it might be possible that the density must be Vector but let's yeah probably I might need to make it as a vector value so after all um after I have promoted the point I'm going to create a new Vector value just using density as an x coordinate so create the dense V density just set the density as an x coordinate to make it look like a vector that sounds a bit hacky but and I don't really know if it's gonna work but let's see you gotta try out Now look for the V density and the search base search attribute that I'm going to use is the mask but use it mask as x coordinate and the Y and Z will be zero same as the density value the radius I don't know it could be really big and the number of points you want to search for just one okay now I only need to get one so if the lengths of the PTS is more than zero then I could get the corresponding text Point information text Point index here hopefully and let's see if I have got any by set point address to this PT maybe I can create the points if I have found any density value right right okay and set point address the name will be I don't know text t okay this should be zero all right let's see and right now I have primitive so let's also remove primitive as well okay so that I only have points and for each point okay I have text points now everything is 62 so or not maybe I do have some random numbers so it could be correct 62 could be the one which has the lowest density to fit the black area shall we check um try to get the 62 one 62. so looks like a comma which obviously should be the lowest density of all the characters so it looks like it's working okay it's getting good now I can set the name to each point with the name retrieved from this text point so name is inside a pointer attribute that txtpt and set the name hmm okay let's see so I got the names and I also got the name here am I ready to use the copy two points right I haven't set the scale yet but let's just check without scaling for now and in order to move these to this one I might want to move each Pact object to the center yeah so how do I do that I can use the Primitive wrangle move it to the centroid position um just set it to zero nope didn't work primitive nope hmm doesn't it supposed to work for points okay it did okay so now it's being gathered on the center now I can I think I'm ready to although I might want I might not want to change the height position so just keep the white here just move the zero X and Y all right let's see now something is weird okay I guess it's due to the direction and what's Happening Here yeah I guess due to the scale and uh Direction probably not sure is it what if I do like this nope let me check by applying some scale some random scale value um like that hmm still not kind of getting the point which is funny okay I think I was missing here name interesting well the geometry has not been copied but instead Point has been copied why is that why is that oh wait a minute it's the other way around yeah this is the way I should supposed to be okay well it's a bit hard to see let's make the scale a little bit smaller 0.1.1 0.1 okay so I had I start to see something here and it looks like it is correspond to the text density somehow all right so what we need to do now is to set the correct scale value which can be retrieved from this grid here and the corresponding the current grid size so we need to create the scale value by dividing this scale and this scale so bring this to the second input how do I name this um copy to point info or search for best letters so let's get the size information from the third input somewhere around here base size is again I'm gonna use the vector get B box size okay now let's also get the grid size from the current primitive which is this one just get one of the Primitive and calculate the size of that but actually this size has been calculated somewhere before which is which you have in detail I think this one cell size and hopefully this is still exist so let's get that value shall we so we have it yep so float cell size is equal to detail cell size now that we have two information and four from the base size I can just get the height information [Music] let's say base height so now we can calculate the scale value which could be a cell size divided by base height and this SC will be used for all x and y and z scale or I can just say P scale in this case because it's X1 Y and Z should have the same scale like that all right let's see and now the scale has been correctly matched with the grid and looks already nice okay and if I change the offset you can make the text covering the grid make it smaller or bigger like that okay so looks good and looks looks fast enough to operate I hope let's try to check how fast this could be by rotating the base geometry which one yeah this one animating this pig head with some simple rotation to see if it could work on real time something like that okay so three who rotates 360 Degrees based on those frame value like that okay let's make it faster by making the frame a bit smaller right so let's see how this is going to used okay I guess the speed is good enough um not so fast but I guess it's fast enough the searching part maybe PC find was a good option that maybe I can make this one see if I'm it's gonna speed up a little bit nope doesn't really change so I think it's fine okay now you could try changing the density of the Quad I mean the resolution of the Quad something like that something like that really high still works okay maybe that was too high and you could still see the text if it cools up now that's the um ordinary ASCII art generation just using the brightness right so what I want to do next is to try to use the additional information from the geometry to for a text searching the letter searching such as curvature flow or something like that to make to make it meaning more useful makes it make sense to make it sense to use it to do this kind of operation in three-dimensional editor or application because what I have just done could be done in 2D after all so the information you can get from 3D is something you cannot get from 2D images so that's what I would like to try out all right but so far it looks fine and I guess what's good about this operation is that you could change what letter to use you could just use a selection of letters of your choice using the font oops um for example if you just want to use a b and c okay something is wrong here okay I need to turn on this text attribute still works even with the small number of letters a b and c and U2 C sum pick head somehow interesting it could also use characters which is not one by characters we you could also use something like two by characters like Japanese shall I try that since I'm Japanese still works yeah and if you don't want to show up show the the outer areas which doesn't intersect with the geometry you can go back here toggle this off you can trim the outside just get the geometry side oh well that's that now let's try to get some additional features and before doing that I'm going let me just try to organize this a little bit to go for the next step uh and let me also look at the comments um okay sorry I forgot to look at the comments to do thanks for all the comments it's impossible to explore the geometry as a vector for plotting CNC curve yeah you could also do that I have I just I have a streaming live video archive just for that so try to try to search for that the name is something related to plotter drawing for hoodie plot a drawing with Houdini or something like that if you search on YouTube you could see that let's try to organize this so this part is the geometry part the projection searching e and ding the letter and this is where you have calculated the density and all sorts of attribute organization okay now what I want to do other than the brightness of the mesh I would like to try to get additional information from this pig head somehow so what could that be well if you use something like measure node you have a bunch of additional analysis analytical values such as curvatures gradient and all sorts of stuff let's try them with the curvature and let's change this to principle which you'll get a directional principal Vector value so let's try to use this directional value as an additional criteria to search for the letters sounds interesting smaller or larger not sure which one's better let's go with the larger one and if you look at the each point yeah I wanna apply this curvature to each point so make a point and you'll have a curvature Vector value like this I think it's this being normalized or not maybe not maybe not oh I think it's fine now what I want to do is to use this Vector to somehow pick the corresponding value which matches with the letters now how do I do that one thing I could think of you know is to get some Vector value out of each character's something like the directional value for example if you look at the dollar characters dollar sign Maybe as a human we could assume that the direction could be like vertical sharp could be somewhere in this diagonal Direction apostrophe obviously vertical and something like that and how can we get that kind of directional informations by not assuming by human but meaning doing geometrically now I have learned some technique from the last two live stream that there is a function called SBD decomposition in Houdini which you'll be able to get the eigen vector and eigenvalue out of The Matrix and by using that you could kind of assume the direction of the whole geometry using this function so I'm gonna try to get that way shall we sounds hard but it is a bit hard okay so first thing first I do already have the base curvature here so what I want to do next is to project this curvature Direction onto the grid just like as just like I did for a brightness okay so to do that I'm going to um probably [Music] connect this here before rotating now when you have projected the original geometry to the 2D plane you'll be able to get the crispawn attribute somewhere around here just like you have get the mask information you could also get the curvature information so that part is pretty easy and let's just apply this curvature as is to a curvature attribute see how it looks like okay let's visualize it curvature curvature make it vector okay so you do see a corresponding curvature Direction plotted on the 2D but I don't really need this x directional component or coordinate so maybe I can make it zero since I have projected on a plane so all has been projected and you do see some kind of rules to those curvature value some of you do see some kind of flow here and I want to try to pick the character which have the same flow same direction to be mapped to these tiles if it's vertical I want to get the vertical characters like I or apostrophe or no this is an apostrophe how do I call this I forgot such as I or bracket or something like that if it's horizontal Direction maybe I want to get this one I want to get the Dash or something like that or equal so and together with the brightness maybe you do have some rich selection and maybe by controlling the weight you can control you can choose either you want to have more directional informations or more brightness information to be used as a criteria to search for the characters okay so let's try to calculate that information from the characters and where should we do that maybe right after the brightness so this is the density this is being normalized Okay so maybe somewhere around here so let's think how we could do that now obviously we need to oh separate each primitive and calculate for each set of primitive based on the text index now looking going back to the uh Vex functions the one that I would like to try to use here is SVD comp this one to in order to get the uh eigenvalue an eigenvector value the S will be the eigen value you will be the eigenvector or you could either use v as well so um in order to use this you need the three by three Matrix and from the one that I did maybe on hundred fourth episode where I have implemented the paper called developability of triangle meshes I have you I have also used this for a vector which has been transferred to three by three matrix by using an outer product which is more like a cross Vector but in order to get the cross product but in order to get the three by three Matrix okay so I'm going to use try I'm going to use this to create a three by three Matrix out of vectors and for here I'm going to just put the same vectors for in for first input and second input just as I did on the papers so in order to do that I need a bunch of Point information for for each primitive so let's see how I can get that first thing first I don't really need those Edge information then maybe I can resample each primitive on as um outline curve to get the point so first I'm going to divide use the Divide node one thing I have to make sure that is to keep the text index attribute for each primitive let's check okay I still have it if I convert it into if I use the resample node to retrieve a bunch of points and more points you have I guess more um precise information you get so let's make it 0.05 something to make it enough points now I'm going to create a vector which will be from the center of the Primitive or center of the the maybe the centroid of the Primitive to each point and use that Vector to calculate the Matrix add them all together then use the SPD decomposition to calculate to get retrieve the eigenvectors and eigen values Okay so shall we do that and I think we have enough points let's try to use the point wrangle to calculate the the three by three Matrix first by other product Okay so first I would like to have a each center point of the characters corresponding to those points so in order to do that you need to get the primitive ID or primitive text index corresponding to this point so first get the Primitive numbers from point prims and then get the text indexed from the primitive let's make sure we have this information check for each point do we have it yep we have it now we also want to get the center point for those primitive which shares the same text index attribute so let's see how we could do that going back to the get B box center so we can specify the group which groups to get the center from right so I mean actually what I want is not the center point of this bounding box but instead the centroid which is based on the area but it might gonna take some time to get that or do we is there any functions to get the centroid nope so I am gonna just try to use the bounding box center for now but if it didn't really work well then I'm gonna try thinking about getting the centroid based on the weights okay so [Music] um Center get accounting box center from the first input the rule here is that the attribute text index shares the same value right now hopefully this will create the centroid of each characters let's check by temporarily create a point to that position if it so you do see I added points here points here so looks correct it looks we do get the centroid or the center point of the bounding box for each characters okay looks good now that I have the center point we could calculate the direction by subtracting the point position with the center and now we could calculate get the alter product using outer product functions for correction and direction okay now store this information to the attribute to check all right so we have these information now what we want to do next is to add all these matrices for each primitive then calculate the SBD decomposition so to do that what's the easiest way let me look at the attribute promote to see if we can add these points together based on the same shared text index or shared attributes or something yeah we have that we do need to have some peace attributes which could be string or index so let's uh store that information to a text or to a point hopefully this will work with the integer okay now so original class point to um maybe primitive text index and then in this case I want to calculate the sum add all the values together change the name to what was the original name then the original name is Matt change the name to sum matte some math okay let's see if it did work if it did work so I have this on matte hmm and the for those two primitive it shares the same text index so it should have the same Matrix as a summation and it does so look I hope this worked fine all right now it's time to get the eigen values and eigenvectors out of these matrices so use the primitive wrangle and at this moment I don't really need to do I don't really need to calculate the SPD decomposition for each primitive because some of the Primitive shares the same text index so maybe at this point I can just pack and calculate the SPD decomposition after being packed maybe that makes more sense in terms of the efficiency okay so after being packed I want to promote the sum matte which doesn't really exist here here we go okay so for each primitive now you have some matte transfer to a packed geometry and now we can try to estimate the eigenvalues and eigenvectors okay and the okay so here is the parameters Matrix three output Matrix Vector Matrix Kai so first let's create the output umv this is the eigenvalue now SPD D comp and use the sum matte then USB all right now out of these uh variables you could either use U of v in terms of the direction and you can use S as a scale now I think I just need the direction in this case so let's try just try to use act U to retrieve directional value now you can get three Direction perpendicular to each other so and the first Vector is always the largest and if you use the SPD decomposition as a function so which is pretty handy so B1 is U dot x x the first X is the row number and the second X is the column from The Matrix and you are going to get what you're going to get is the so this is u and each column will be a vector directional Vector value which looks like this E1 B2 B3 and B1 always has the largest scale B2 has a smaller scale B3 has the uh that would mean B2 has the second largest B3 is the smallest and this will indicate the features of the Matrix for example you when you have created the vertices retrieve from the characters you have used you have picked all the points from the characters and you have created the vectors from the center to each point right like that and you have converted this directional value to a matrix three and add all these values together and send it to a SPD decomposition as a result you'll get these two three informations which will in return will give you a three-directional value one is the most affecting Direction with these Matrix and in this case a could be a vertical Direction then perpendicular to this Direction could be on X Direction and the Z the the third main Direction could be a the depth Direction which in this case the size could be zero because this is the flat geometry if it's 3D you do have some size on the depth direction as well right so XX U Dot uh YX U dot ZX should be the vector we are looking for now let's try to visualize this um since I'm on top of the primitive I guess I want to set the vectors to Point spot I guess doesn't really matter okay so let's check create another marker with B1 okay does it have it okay well it's not really shown maybe this doesn't okay so looking at the direction maybe let's make it a little bit smaller for this explanation mark vertical as we assumed this uh quotes double quotes horizontal looks good sharp diagonal looks good so everything this is a bit uh irregular but uh maybe probably make sense in this direction and each of the bracket vertical makes sense these are a bit um could be random because it could be any direction as you can see like this it's pretty interesting right so maybe there are some there are some like um hierarchy where this could be really strong this could be a bit weaker in terms of the directional choice so in order to visualize that as well you could use eigenvalue as well could be retrieved from the s so multiplying Phi s dot X which is the first value corresponds to V1 you could also visualize the scale of this vector and now you could see this is really uh affecting this direction is pretty effective this is a bit too a bit smaller if you look at this one this this has less directional informations and so on and this one is well this is pretty strong somehow I guess there are a bunch of points to those zeros that's the reason Maybe we need to kind of uh control the number of points based on the position probably yeah to to remove the biases maybe it's a bit too biased to this direction for this one yeah we need me might need to fix that but overall looks pretty nice nicely distribute it and the direction looks pretty correct not so many horizontal Direction that's understandable okay anyway looks fine all right now let's see how we could use this then in order to uh search for the letters here and wait a moment actually I don't really want to use the resample geometry but instead I want to use the original geometry so we need to kind of replace that somewhere right and Maybe after this we got the primitive the number of Primitives didn't really change I think no it did change why so maybe uh what I could do is um let's see just copy this part connect it to the original geometry and this should share the same number 92 and 92 and just transfer the attributes that we need in this case a sum math so attribute transfer transfer the Matrix and hopefully it will copy one to one sometimes it does not so what looks correct okay okay now now that I have a two Vector informations applied on each geometry the projected geometry and this packed information that's Vector one let's try to update the criteria search criteria shall we right so how do we do this how do we do this first of all we need to in order to hmm actually um in order to make this search available together with the density I think it makes sense to convert the vector value into a scholar value meaning one Axis or value so we could try to compare the curvature flow on a projection by calculating the dot product between this Direction and the vector that we have calculated and use that dot product as a searching criteria to see how it works shall we so to do that um to do that we could first of all get the wait a minute but this in those case this that doesn't really work in terms of this um searching which has done using the PC find right so hmm we in order to calculate the dot product for each one you just need the for Loop each one of the possible uh values so that's gonna take a little bit of time to calculate I'm not let's see if there's any efficient way to do that just like I did here using PC find you could kind of uh try to make use the P the same PC find with the vectors probably um since this will accept Vector value but in those cases I mean even if the direction is in this way I could also the the direction could also be in the negative Direction so you cannot directly use this PC find as is with this one for these directions because if it's negative then you get the value will become smaller in terms of the distance so let's make all the vector value in this case a curvature value positive shall we going back to the projection I'm gonna make the curvature everything positive what what do I mean by positive the um what do I mean by positive that's the question maybe all the X component of the curvature is positive if the X component of the curvature is negative then make it flipped maybe that could be the rule maybe that could be the rule I mean the Z component so if curvature dot C is smaller than zero then curvature multiplied by minus one hmm that makes sense what about y yeah maybe I'm gonna use with the Y rule so every by doing this every curvature flow is kind of a h promise to go upward either left or right but is always upward so it will be more easier to evaluate or search for the best Direction now do the same for the one that I created here SVD decomposition [Music] wait what is this here now this one is kind of always upward somehow but let's just make sure no not this one this one yep so if E1 dot Y is negative then make it flipped just in case there then update it now obviously some Vector is too long to big and that might affect the distance calculation so I'm going to make it I want to make the maximum length of this Vector to be maybe equal to 1 at least yeah or normalize so maybe I'll try normalizing first even though I have multiply s I'm gonna ignore that and just get the directional component now going back to the search I can now try to create a new criteria here first of all the be masked Vector based value for the density could be mask mask and the curvature based value could be um what was it curvature based value will be the normalized curvature yeah the problem here is that the size the maximum size of this mask and the maximum size of this curvature is not equal although that's fine let's see how it works okay now I'm going to add these value together as a criteria The Mask plus b curve okay and then look for the corresponding value which is these value now to do that you need to have the same uh equations to this packed informations somewhere around here so let's do that in this case we have density which is the density density density as well as the eigenvector set or you can just bring up the V1 and probably I need to promote this from primitive to points because right now the point doesn't have that information only the Primitive have V1 so we need to promote that okay primitive the point okay now that we have two vectors we're just going to add them together how do I name this um just use the same name criteria density plus I again B right some weight this is for the point where it is where it where did it go oh yeah here you guys okay so I want to use this one to be used for the searching hopefully this won't work and going back to the this part here I am going to now search for a criteria which matches with this value here okay now as a result show up the projection let's show up the outside small now I do see some differences right now the outside the area should be the density should be zero but it's choosing something different other than coma well not sure why but it did that is because the direction of the empty space could be in any direction so maybe I still do need to use a scaled value of the speed composition not just by normalizing but if I remove this normalize see what happens now it now it tries to use the less scaled uh text but that's because this one is too big in terms of the scaled values so if I divide by 10 . and I kind of need to compare this direction of these text with the curvature and see how if it's really affecting or not right for now I'm gonna make it normalized and in order to change the weight between the area and the curvature I think I need to create some weight related value somewhere around here when you add these two values together so let's do that shall we we're going to multiply this by hmm density ratio and multiply this by curvature ratio or slow ratio and you gotta do the same things for this one so copy this here do the same where you have added those two values together so multiply density ratio [Music] flow I think I think that's what I thought but uh let's see uh what was the name flow so by doing this if you make this flow ratio zero it's all based on the brightness if you make density 0 and flow ratio to one then it's all based on the Direction now doesn't really look flow doesn't really look obvious is it Maybe it's not really correct so let's try to visualize the flow so you have some vertical Direction here so I would want to see some vertical related text apply somewhere around here do I see it um maybe but uh yeah this one it does this one it does but not really so obvious not so obvious is it maybe I do need to take an account with the s value here instead of normalizing see how it changes if I may get divided by 10 here five not really so obvious is it make it one now everything becomes really small the direction looks correct but not so really obvious hmm interesting yeah the brightness really isn't really necessary to make it realistic and has additional information I was hoping this flow ratio will do something better but so much maybe the way to create the criteria was not good enough I think I'm just gonna make it back to the normalized file going back to here now there are two supposed to have some directional related uh criteria added to the now this is when you don't really have a directional like preferences and when you add this one up to one you're going to add some ratio here which will take in account these Direction the curvature Direction maybe I want to change the direction to something else smaller yeah so in this case you have horizontal Direction on the top of the year so let's see if we could see that by raising up the float a flow ratio kind of I mean w used to be horizontal Direction so kind of working I guess less area hmm well not so obvious maybe it might still be better at you calculating the dot product in between the uh the two vectors instead of just searching with the PC find yeah maybe I want to do it that way because this doesn't really seem to work maybe just the brightness is fine maybe not with the uh flow ratio right let me think um if we can convert this into a flow value somehow at this point curvature um so the curvature is some more thing that goes from bottom to top and we can kind of uh make that as a flow value by calculating a DOT product between z-axis I guess zival Z dot in between Dot zero zero one and B curve so if it's going the right direction you get positive value if it's going to negative Direction you get I mean if going to the left Direction it's going negative if it's going up Direction it's zero right so that makes more sense I guess and by doing this you can just use a scalar value so instead of making a mask as a vector value let's make the criteria something like set mask and Z dot zero so you have a area based criteria on the x coordinate the directional flow value on y coordinate as a criteria that might make more sense yeah and do the same for the the calculation of packed geometry but before doing that let's also multiply the ratio what's the name density ratio hmm well let's see uh what was it slow ratio and probably I might not need to cut and I multiply these ratio to the pack geometry after all maybe that's not really necessary if you make it same value then you just get the same value so probably I should not multiply these value in the pack geometry after all okay going back let's re-create the criteria and so the eigen vector is this one but I'm going to calculate the Z value the dot C dot value between Z axis and I can B all right and try to create the criteria pretty similar to what we have done eigenv no no F density for x and z dot for y that's it and without multiplying any ratio value Okay so going back to here let's check so this if the flow ratio is equal to zero only the area searching is being used looks pretty correct if I'm enable this flow ratio upward it will also take a calendar Direction hopefully and if I make this density zero only the directional part will remain and looks pretty much correct this is horizontal Direction [Music] and if I change the curvature principal curvature to the loss larger this will become vertical so looks promising this is much better in terms of the as you can see this these points should be a going Vector upward and it is choosing the vertical directional value here from the corresponding ratio corresponding densities and if I change this to smaller let's try to use horizontal Direction instead so yeah this criteria is looks much better okay nice so I mean as a result maybe you don't really see much difference between just using the brightness or by adding flow value but you do you do just wanted to show you are able to add additional features for a search for searching to not just use the brightness which is often used for the 2D images but you can also take account the information from the geometry you could also try to use a new component from 19.5 like a one called tangent field which will create a clean tangent Vector field from the geometry which is pretty nice like that and you could try to use that as a guide information in those case this is named as field might need to rename it to curvature because I was using curvature as a name does this work okay in those case How does it go the first of all the curvature looks like this looks more cleaner than the principal curvature but kind of a weird Direction here but anyway let's see if it being used to search for the text maybe I don't know did you see some like diagonal Direction somewhere around here you look at the projection [Music] the curvature on yeah you do see some um Direction going this way so I think it is taking account so something like that I mean just by using flow Direction doesn't really make sense in terms of the ASCII art you can't really see what's happening here but combining with the brightness may you could enrich the result by addition adding additional informations to the image might be which is not possible just by converting to the image so that might be interesting as a process I mean this this is just an idea this could be transferred to something totally different but just to I don't know seed you guys with some ideas that I myself think could be really interesting maybe not the result of this one but maybe for some other usage could be interesting okay so that's what I wanted to show for today hopefully you have enjoyed it you have learned something new and let me look at the comments again sorry for um thanks for all the comments everybody I I really appreciate it um may I suggest that you make the characters Beijing and that'll be interesting okay thank you if I play it uh I have a suggestion from Olive something to quickly play the vector field sounds a good idea let's try that I'm gonna fix the rotation for the pick for now and try to animate the flow instead which maybe I could animate this tangent field flow which is a bit slow to calculate but it let's see um uh there is a value which you can use to rotate here okay and see how it affect result this is interesting oh wow I do see some changes here uh-huh yep so good to see that it is taking an account at least in some way nice very nice if I make the density ratio small nice I could see it I could see some flows hmm interesting yeah this is obviously only possible in 3D geometry for sure not really possible just from the 2D image okay thank you for the suggestion this is really great it's really great I love it love it love it okay yes try this in game will be really interesting for sure would be great composite it multiplied over a test strand yes well I will upload the file to the GitHub as always and you can download the file from the video description video description page of this YouTube archive yeah I'm gonna paste the link to the YouTube later I I'm also going to upload the files to a patreon page so you could also download from there for free so anybody who is interested please try to check it out after I finish the live stream okay that's pretty much it let me just organize all those parameters I have set to one node and I will finish this live stream okay thanks to all the people commented I have I think I've learned a new stuff during the live again that's what's good about it using live stream let's also test out different geometry like yeah and it still works okay cool thank you Olive for coming and all the feedback appreciate it have a good day okay let's create a bunch of parameters shall we first of all a shape to switch self divide well this could be this doesn't it's not really important The Mask I am the inclusion yeah this is not really important as well I'll just leave it this is also not necessary yeah this offset value could be parameterized base quad offset base quad offset evening animating the amplitude of the color value you could facing GEOS so much ah nice yeah that will be a nice idea divide this is also you could also animate this divisions as well you know that just like from the Super Nintendo effects what div what div um dungeon field maybe you could you might want to switch between the flow in between curvature and dungeon field or something different maybe you could add that flow by yourself later what else projection no parameters okay this is obviously important density ratio flow ratio font resize quad yeah this is also important this is for the text face offset um what else density normalized density Matrix I could just leave these as is we don't really need those parameters and that's pretty much it I guess okay so we have all the parameters let's connect this to a known node as a final output and let's check that we can change bunch of changing flows text-based size density ratio flow ratio shape yeah that's pretty much it okay well thank you very much for joining the live stream as always I'm really appreciated foreign color of the model texture would be good to add later yeah that would be another great features maybe without removing the material some painted colors and use that information to use four other criterias rgbn rgmb yeah there are so many options you could do with this just gonna end with this but uh please try to extend with your ideas uh changing the great divisions my last one now divisions animated on the visual curve then transform merged into an input you know to duplicate the grid across grading geometry that's also interesting [Music] um yeah it's a good one it's a good one I don't really have time uh right now to do that but that's that's really promising I think I think I would like to try that later transform change emerged into notification yeah that would be nice thanks for all the feedback everything is great now I think I would love to uh end the live stream at this point I guess there are still a bunch of things you could do as everybody is suggesting like Olive but hopefully hit a satisfied your interest okay so that's it for tonight thank you very much for uh joining me I would like to do another one on next week with some different topic yep as always as I said I'm going to upload the files to the GitHub you could download it from that video description page from YouTube or patreon so if you're interested please try to download and play it out with yourself okay that's it so good night and have a good day it's almost 2 A.M in Japan time so I think I'm it's time for me to go for asleep or to another work yeah all right and I know foreign
Info
Channel: Junichiro Horikawa
Views: 27,298
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, field, volume, rendering, computer graphics, visualization, algorithm, motion graphics, graphics, remesh, quad
Id: e-2_8SYJQx8
Channel Id: undefined
Length: 168min 10sec (10090 seconds)
Published: Sat Sep 24 2022
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.