Houdini – Procedural Chiseled Bevels Font

in this video i will show you how you can make Procedural Chiseled Bevels Font or object using vex and volume inside Houdini.

Create Attribute and Group pull-down list in digital assets

Tow week ago i create digital assets then i search everywhere about how can i Create Attribute and Group pull-down list in digital assets and there is an awesome Houdini artist name Elias in Think Procedural Discord website he show me this and it’s turn out it’s required python code and unfortunately i am not good with python maybe i will learn it after vex 🙂 anyway this is how you can do it.

1- Create your channel reference and make sure it’s string.

2- Go to Edit Parameter Interface.

3- click on your channel reference and from Parameter Description open Menu.

4- check Use Menu and change it to Toggle (Field + Multiple Selection Menu).

5- open Menu Script tab and type this python code

for Attribute :

result = []
try:
    geo = hou.pwd().inputs()[0].geometry()
    
    for attr in geo.pointAttribs():
        result.append(attr.name())
        result.append(attr.name())
except:
        result.append("")
        result.append("")

return result

for Group :

result = []
try:
geo = hou.pwd().inputs()[0].geometry()

for attr in geo.pointGroups():
result.append(attr.name())
result.append(attr.name())
except:
result.append("")
result.append("")

return result

6- now you will find this is only work for point Attribute and Group so what if you want primitive Attribute and Group you can fix it just by change it like this

for Attribute :

result = []
try:
    geo = hou.pwd().inputs()[0].geometry()
    
    for attr in geo.primAttribs():
        result.append(attr.name())
        result.append(attr.name())
except:
        result.append("")
        result.append("")

return result

for Group :

result = []
try:
geo = hou.pwd().inputs()[0].geometry()

for attr in geo.primGroups():
result.append(attr.name())
result.append(attr.name())
except:
result.append("")
result.append("")

return result

i think you know we only change the word point to prim in the code in this line

for attr in geo.primGroups():

 

Fit Attribute max && min by Array

1

Fit attribute value to 0 and 1 is one of my favorite thing to do in Houdini and i always look for new way to do it and i wish if SideFX make node for this, it’s really important thing to get the the best result for example drive the color by attribute.
I write a blog here about this topic and this is another way to fit the attribute value to 0 and 1 “only try it with float attribute”  and this method is store all the attribute values in an array and then pop the last and first value from a sorted array.

1- store all the attribute values in an array use point wrangle.

float attrib[] = array(@attrib);
setdetailattrib(0, "attrib", attrib, "append");

2- sort the array “Returns the array sorted in increasing order” to get the attribute min value and it’s important here to use detail wrangle.

f[]@myattrib = sort(f[]@attrib);
f@attrib_min = pop(@myattrib, 0);

3- in the same detail wrangle reverse the sort array to get the attribute max value.

f[]@myattrib = reverse(sort(f[]@attrib));
f@attrib_max = pop(@myattrib, 0);

4- promote min and max attribute from detail to point use point wrangle.

setpointattrib(0, "attrib_min", @ptnum, f@attrib_min);
setpointattrib(0, "attrib_max", @ptnum, f@attrib_max);

5- fit the attribute to 0 and 1 use point wrangle.

f@attrib = fit(@attrib, @attrib_min, @attrib_max, 0, 1);

in the end this is really interesting way to get value from attribute but it’s really slow compared to other method i talk about them here.

Max && Min of Attribute

I used to be think like just use the max and min function and you will be ready to go, however i find it more difficult to get the max and max and min of attribute or maybe it’s just the stupid me. anyway recently i find how to get the min and max and here is how:

1 – loop over all point to get the max and min but this some time is really heavy in calculation.

int all = i@numpt;
string attrib = chs("attrib");

float min = point(0, attrib, @ptnum);
float max = point(0, attrib, @ptnum);

for(int pt=0; pt < all; pt++){
    float comper = point(0, attrib, pt);
    
    if(comper < min){
        min = comper;
        }
        else{
            if(comper > max){
                max = comper;
                }
            }
    } 

2 – promote the attribute to detail then import it back to point i find this way more faster in calculation.

setdetailattrib(0, "attrib_min", @attrib, "min");
setdetailattrib(0, "attrib_max", @attrib, "max");
float min = detail(0, "attrib_min", 0);
float max = detail(0, "attrib_max", 0);

3- and if you like VOP there is a way to fit max and min of Attribute inside VOP

  • use attribute promote node to se the max and the min of your attribute
  •  merge the max and min with merge node.
  • copy the max and min with copy attribute node to your geometry.
  • inside VOP import detail attribute min and max and set them as source max and min in fit node and dest min and max as is it 0, 1.
  • export your Attribute or use it inside VOP.

 

that’s all for now please share with me in the comment below if you know better way.

 

 

 

11