Jump to content


  • Content count

  • Donations

    30.00 CAD 
  • Joined

  • Last visited

  • Days Won


ikoon last won the day on April 17

ikoon had the most liked content!

Community Reputation

180 Excellent

About ikoon

  • Rank

Contact Methods

  • Website URL

Personal Information

  • Name
    Jiri Miratsky
  • Location
    Czech Republic

Recent Profile Visitors

3,128 profile views
  1. How do pyro collisions work?

    So, one more notice about the creation of the collitionvel field: Inside the Smoke Solver, there is the Gas Build Collision Mask node. From the docs: The Gas Build Collision Mask DOP builds a collision field that represents where affector objects overlap with the fluid field. It generates a signed distance field which is negative inside colliding objects and positive outside. It also generates a collision velocity field that stores the velocity of the affector object closest to each point. http://www.sidefx.com/docs/houdini/nodes/dop/gasbuildcollisionmask.html
  2. How do pyro collisions work?

    Hth, few more notices: - now I found this great answer: https://www.sidefx.com/forum/topic/55015/#post-246795 - collision field is just a scalar field - btw have you seen this great explanation? At 29:00 Jeff talks about divergence https://vimeo.com/42988999 The "make_divergence_free" part of smoke solver is three steps ( 2.A or 2.B or 2.C, depends on the method you choose) 1. Gas Enforce Boundary http://www.sidefx.com/docs/houdini/nodes/dop/gasenforceboundary.html 2.A Gas Project Non Divergent https://www.sidefx.com/docs/houdini/nodes/dop/gasprojectnondivergent.html 2.B or 2.C Gas Project Non Divergent Multigrid (or its OpenCL version enabled) https://www.sidefx.com/docs/houdini/nodes/dop/gasprojectnondivergentmultigrid.html 3. Gas Feedback http://www.sidefx.com/docs/houdini/nodes/dop/gasfeedback.html
  3. How do pyro collisions work?

    Btw you can also add Visualiser to the "collisionvel" field (it is not visualized by default) - unlock the /obj/smoke_no_vel/dopnet1/pyro/smokeconfigureobject2 - find the "collision_velocity" node - add a "Vector Field Visualization" node Connect and set it, something like this:
  4. How do pyro collisions work?

    Hi Evan, Here is what I think: 1. Afaik, you are right. Important field here is the collisionvel. In the second example, in SOPs, you set the collider's velocity to 0 ... so although in SOPs, the object is "moving", DOP sees its velocity as 0. So the "collisionvel" field is not affected by SOPs. 2. You are also right. If you keep the default "Correct collisions" on, then the "unaffected" density gets erased inside the collider. I created this script "Find all parms referencing this parm" to dig deeper into DOPs. If you have any questions, I will gladly explain how to work with the tool. The blog post is rather minimal: http://lex.ikoon.cz/find-all-parms-referencing-this-parm/ The script found the "collisionvel" here inside the Pyro Solver: NODE: gasenforceboundary1 // PARM: Collsion Value // RAW: collisionvel NODE: buildcollisionmask // PARM: Collision Velocity Field // RAW: collisionvel NODE: clean_collisionvel // PARM: Dest Field // RAW: collisionvel NODE: clean_collisionvel // PARM: Source Field // RAW: collisionvel The "Correct Collision" is referenced by these: NODE: smokesolver_build2 // PARM: Correct Collisions // RAW: ch("../correctcollision") NODE: enable_correct_collisions // PARM: Default Switch Value // RAW: ch("../correctcollision") NODE: clamp_inside // PARM: Field // RAW: `chs("../correctcollisionfields")` NODE: color_correct_collisions // PARM: Enable Solvers // RAW: ch("../correctcollision") And the "Velocity Scale" (collisionsource1) is referenced just by this node (Trail SOP) NODE: compute_velocity // PARM: Velocity Scale // RAW: ch("../velscale")
  5. Hi, here is the Houdini Apprentice HD to Houdini Indie Converter https://www.orbolt.com/upgrade-houdini-files Quote: This online service is being provided for a limited time to help Apprentice HD customers convert non-commercial files to limited-commercial assets, scene files and image files for use in Houdini Indie. Scene files and image files have an "nc" extension added to the file name and will be converted to files with an "lc" extension. While Houdini Digital Assets created in Apprentice HD probably do not have an extension, these .otl and .hda files still need to be converted into either .otlc or .hdalc files.
  6. affect all except a group

    You can also use * ^group1 syntax. Here is the complete list of possibilities: http://www.sidefx.com/docs/houdini/model/groups.html#manual
  7. Offset points

    Hi, you probably want the Sort SOP
  8. Scipy

    Hi Petero, afaik: On Windows, you need a version of scipy that’s compiled with Visual Studio 2017 to match what Houdini 17.5 was compiled with. I also want to learn SciPy and I am not able to compile it myself, so I asked friend to help me install Linux + Houdini + SciPy as a dualboot. It seems to be easier than to compile. I will write down the whole procedure (probably this or next week). We can hope for a solution for windows.
  9. Hi, I hope that I understood it right. I have attached the file. You could do "for each primitive" loop and wrangle something like this: int first = 0; int last = -1 + primvertexcount(0, @primnum); if (@ptnum == first) @Cd = {1,0,0}; if (@ptnum == last) @Cd = {0,0,1}; Or you could inside one Primitive wrangle: int first = 0; int last = -1 + primvertexcount(0, @primnum); int first_pt = primpoint(0, @primnum, first); int last_pt = primpoint(0, @primnum, last ); setpointattrib(0,"Cd",first_pt,{1,0,0}); setpointattrib(0,"Cd",last_pt,{0,0,1}); setpointgroup(0, "first", first_pt, 1) ; setpointgroup(0, "last", last_pt, 1) ; first_last.hiplc
  10. Hi, maybe this approach might work: int count = npoints(1); for (int i = 0; i < count; i++) { vector camP = point(1, "P", i); vector dir = normalize(camP - @P); float bias = 0.01; vector hit_ps[]; int hits = intersect_all(0, @P, dir * 100, hit_ps, {}, {}); if (hits && distance(@P, hit_ps[-1]) > bias) // or just check number of intersections: // if ( length(hits) >1 ) { @Cd *= 0.6; } } cull.hiplc
  11. VEX - foreach - I don't get it

    You are most welcome. You do great and inspiring work, I am glad I was helpful with my little vex knowledge good luck with your amazing work!
  12. VEX - foreach - I don't get it

    Btw there is also D. which does the same as A B and C: foreach(int point ; {25,2684,654,489,9846,64} ) { setpointattrib(0 , "Cd" , point , {1,0,0}); } It works, but it throws a warning. Houdini reads 25, 2684, 654 etc as floats ... and stores them into "int point" is an integer.
  13. VEX - foreach - I don't get it

    I have tried the method you were talking about, and it works. So here we have C. which does the same as A and B. So you were right: vector pos = point(1, "P" , 0); foreach(int point ; pcfind(0 , "P" , pos , ch("radius") , 300) ) { setpointattrib(0 , "Cd" , point , {1,0,0}); }
  14. VEX - foreach - I don't get it

    That entagma example could be rewritten into this (if I assume those numbers are those close points) A. int points[] = {25,2684,654,489,9846,64}; foreach(int point ; points) { setpointattrib(0 , "Cd" , point , {1,0,0}); } B. And the following code does exactly the same thing as whole A does. So, the foreach() does in fact this: setpointattrib(0 , "Cd" , 25 , {1,0,0}); setpointattrib(0 , "Cd" , 2684 , {1,0,0}); setpointattrib(0 , "Cd" , 654 , {1,0,0}); setpointattrib(0 , "Cd" , 489 , {1,0,0}); setpointattrib(0 , "Cd" , 9846 , {1,0,0}); setpointattrib(0 , "Cd" , 64 , {1,0,0}); My english is poor I wanted to say that A = B. Third argument of the setpointattrib() is the number of the point to set the attribute on: http://www.sidefx.com/docs/houdini/vex/functions/setpointattrib.html
  15. VEX - foreach - I don't get it

    There is a specific syntax to create attribute arrays: i[]@name to create array of integers f[]@name to create array of floats I have more examples here, I hope that all are valid but you will see the pattern: http://lex.ikoon.cz/vex-arrays-and-matrices/ So if you want to store an attribute and see it in the Geometry spreadsheet, just add this line: int points[] = pcfind(0 , "P" , pos , ch("radius") , 300); i[]@points = points; //add this line Btw for me those [] were quite confusing. And still are. When working with variable array, you write name[] only when you are defining it. Then use just the name. When working with attribute array, you write i[]@name even when you are reading from it.