Jump to content


  • Content count

  • Donations

    50.00 CAD 
  • Joined

  • Last visited

  • Days Won


Fenolis last won the day on March 4

Fenolis had the most liked content!

Community Reputation

38 Excellent

About Fenolis

  • Rank
  • Birthday 09/10/1994

Personal Information

  • Name
  • Location

Recent Profile Visitors

2,524 profile views
  1. Procedural Cogged Belt

    You can use the Chain SOP directly with mesh input. jk_belt_chain.hiplc
  2. PolyExpand2D is not like PolyExtrude, they are different nodes. PolyExpand allows you to "widen" a curve shape, like your Boolean edges. You have options with PolyExpand2D also to determine if the output is 2 separate curves (inside/outside), or a skinned surface. You can use 2 PolyExpand2D nodes to create the extended shape in your example, the first to offset the edge/curve, and the second that generates the surface.
  3. You can use the Chain SOP to place your brick models along curves with less overlap issues. Gaps are formed because your model is rigid and low-poly - you can give your brick models more geometry resolution and use Copy + Creep SOP to "bend" them along a NURBs surface, which can be created by extruding your curves upwards and Converting them to NURBs surfaces.
  4. Why not keep the point numbers in another attribute, like i@temp_id = @ptnum;, then after your operation sorting the point numbers back with that attribute?
  5. Random value hold 1 or -1

    For the case with same sub-sequence run length (run in Detail wrangle): int seqLen = 30; int subSeqLen = 2; int offset = 0; i[]@seq; for (int i = 0; i < seqLen; i++){ //this value is constant for the length of the sub sequence int seed = floor(i / subSeqLen); //rand returns 0-1 float //rint returns 0 or 1 //math turns 0/1 to -1/1 int value = (rint(rand(seed + offset)) * 2) - 1; push(@seq, value); } For the case with random run length: int seqLen = 30; int minRunLen = 2; int maxRunLen = 10; int runLenArr[]; int valueArr[]; int seed1 = 123; int seed2 = 456; i[]@seq; //generate a smaller array to hold run lengths //maximum length of this array is seqLen / minRunLen for (int i = 0; i < seqLen / minRunLen; i++){ int value = floor(fit(rand(i + seed1), 0, 1, minRunLen, maxRunLen)); push(runLenArr, value); } //for each value in the run length array for (int j = 0; j < len(runLenArr); j++){ //generate that number of random numbers and add these values to valueArr for (int k = 0; k < runLenArr[j]; k++){ int value = (rint(rand(runLenArr[j] + seed2)) * 2) - 1; push(valueArr, value); } } //finally, copy the desired values into the target array for (int m = 0; m < seqLen; m++){ push(@seq, valueArr[m]); } There may be a better way to do this, but this is the thought process I used.
  6. You can create a base shape using a Grid + PolyExtrude, or a simple Box. Then use Boolean SOP to cut out your shape from it. Note that the Boolean SOP generally works best with geometry that intersects and do not have coplanar faces, so your cutting shape should be thicker than the base shape (or just positioned such that it doesn't line up exactly with one side). Make sure that your cutting shape is also solid geometry, consider using VDB to ensure this but it may be slightly overkill.
  7. More complexity in setups

    If you are solely responsible for the projects you've worked on so far, then areas for improvement would include: - leaving a note beside groups of nodes (you could also netbox them) so that you understand what they do even if you leave the project for a long time - colour-coding nodes so you can see at a glance what purposes nodes serve, without having to click each one - reducing nesting depth of nodes where possible, or use Compile blocks to optimize the performance of loops - using Object Merge to avoid many intersecting network lines, but be warned that over-use can impact performance negatively If you have worked on projects with others, then you can also get feedback from them on what else can be clarified in your networks. For instance, a colleague showed me his node colour-conventions and I found it fairly useful so I implemented it in work I share with him. Also, check out this talk by @mestela
  8. Using string as a filepath problem

    What's wrong? The file path seems to be working for me. You can middle-mouse-click string fields to evaluate an expression's result. This is different from clicking on the parameter name for int and float parameter types. I would suggest using a relative reference like: `details("../attribwrangle1", "file")` for parameters inside a HDA so that absolute paths don't break if the HDA exists in a context it's not expecting. If you mean, "Why isn't my texture showing?", then the answer is that the Grid does not have UVs. Drop down a UV Texture or UV Project node before the material and you should see any image linked from the subnet.
  9. [SOLVED]Procedural LetterForm ?

    This feels like a really terrible way to display code...
  10. HDAs that are part of Unreal Blueprints have their parameters in the Blueprint's Details tab. You need to have the HDA component selected in the hierarchy to display its parameters.
  11. Are you sure your netbox is named "Mynetworkbox"? The title of the netbox is not its name, rather it is a "comment", which you can retrieve with the comment() method. If you use the networkBoxes() method, you can get the names of all the netboxes in the specified node. The names of netboxes are typically in the form [double_space]netbox#
  12. Yes, a reminder that the modulo "%" operator returns the remainder of a division operation. e.g. 5 % 2 = 1. Assign an integer attribute to each of your objects with the iteration detail attribute (which you can get with a Block Begin node set to Fetch Metadata). Switch the output of the loop between the Object Merge and a Null node, using "% 2" to get either input0 or input1.
  13. Here is one way you can do this. If you are building a HDA, the multiparm block should be in your HDA parameters instead of a nested node, otherwise it can be quite difficult to manage. multiparm_sample.hiplc
  14. 2D Differential growth to 3D

    Also, have a look at this https://forums.odforce.net/topic/47127-how-handle-this-mushroom-shape-procedurally/
  15. This is a fractal structure. The basic unit of this can be thought of as a single cube's edges, with one vertex marked as "empty". Running a loop over all 7 non-empty vertices, identify if a vertex is connected to an "empty" vertex by an edge. If there is more than one vertex that neighbours an empty space, randomly select one of these candidates and swap its "empty" status with the previously empty vertex. Repeat and nest.