Jump to content

All Activity

This stream auto-updates

  1. Past hour
  2. Yesterday
  3. In Solaris, I’m using RenderMan Lama shader displacement via Material Library. Displacement is evaluated at render time and renders correctly. When scattering rocks with Asset Instancer, instancing happens on the pre-displaced SOP geometry, so once shader displacement is applied the instances float or intersect the surface. Questions: Can Asset Instancer evaluate or reference render-time shader displacement? Is there any supported way to procedurally link Material Library displacement parameters to instancing so lookdev changes stay aligned? Or is SOP-level proxy displacement / ray projection the expected production workflow? I’m aware render-time displacement isn’t available at SOP level; mainly looking to confirm best practice, not hacks. Houdini 19.5/20.x
  4. Last week
  5. Guys! a huge bow down to you, I need time to digest your ideas
  6. Here is an approach combining resample nodes with sweep, noise and polycut. The VEXpression offsets the noise for each line. morse.hip
  7. Yes I think, maybe I just need some density controlling algorithms or short way to just control density. Maybe I am overcomplicating things. Thank guy for info. Going to check this out
  8. You can also use the clip node (clip attribute). The attribute can be generated by some random function (combined sin, cos, ...). You can clip your curve into two complement sets. One of these parts can be resampled for the dots and the other for the lines (ribbons). Here is a file with some ideas. clip_carve_lines_dots.hipnc
  9. @Librarian hey Thanks! Can you walk me through this, what’s the main steps, and do I also need Python?
  10. // DETAIL WRANGLE (run once) // Input 0: a single curve/polyline primitive (uses "prim" parm) // -------------------- Parameters -------------------- int prim = chi("prim"); int seed = chi("seed"); string msg = chs("message"); float unit_len = chf("unit_len"); // unit length in curve-u (0..1) float spacing_units = chf("spacing_units"); // base dot spacing in "units" float dot_mult = chf("dot_mult"); // density multiplier for dot float dash_mult = chf("dash_mult"); // density multiplier for dash (dense dots) float jitter_radius = chf("jitter_radius"); // world-space jitter radius around curve float jitter_along = chf("jitter_along"); // along-interval jitter (0..1) int max_pts = chi("max_pts"); // Morse timing (in units) float dot_units = chf("dot_units"); // usually 1 float dash_units = chf("dash_units"); // usually 3 float gap_symbol_units = chf("gap_symbol_units"); // usually 1 (between . and - in same letter) float gap_letter_units = chf("gap_letter_units"); // usually 3 (between letters) float gap_word_units = chf("gap_word_units"); // usually 7 (between words) // -------------------- Helpers -------------------- function void frame_on_curve(int geoh; int pr; float u; vector up; export vector P; export vector T; export vector N; export vector B) { P = primuv(geoh, "P", pr, set(u, 0, 0)); float du = 1e-4; vector P2 = primuv(geoh, "P", pr, set(clamp(u + du, 0.0, 1.0), 0, 0)); T = normalize(P2 - P); vector a = normalize(cross(up, T)); if (length(a) < 1e-6) a = normalize(cross({1,0,0}, T)); B = normalize(a); N = normalize(cross(T, B)); } function int emit_interval(int geoh; int pr; float u0; float u1; float density_mult; int seedbase; float unit_len; float spacing_units; float jitter_radius; float jitter_along; int max_pts) { float du = max(0.0, u1 - u0); float interval_units = du / max(1e-8, unit_len); float base_count = interval_units / max(1e-8, spacing_units); int npts = int(ceil(base_count * max(0.0, density_mult))); if (npts <= 0) return 0; vector up = {0,1,0}; int created = 0; for (int i = 0; i < npts; i++) { if (created >= max_pts) break; float t = (npts <= 1) ? 0.5 : (float(i) / float(npts - 1)); float r = rand(set(seedbase, i, 19.123)); float u = lerp(u0, u1, t); // jitter a bit along the interval u += (r - 0.5) * jitter_along * (spacing_units * unit_len); u = clamp(u, u0, u1); vector P, T, N, B; frame_on_curve(geoh, pr, u, up, P, T, N, B); // jitter in disk around curve float ang = rand(set(seedbase, i, 3.7)) * 2.0 * M_PI; float rr = sqrt(rand(set(seedbase, i, 8.1))) * jitter_radius; vector jitter = cos(ang) * N * rr + sin(ang) * B * rr; int pt = addpoint(0, P + jitter); setpointattrib(0, "curveu", pt, u, "set"); setpointattrib(0, "pscale", pt, fit01(rand(set(seedbase, i, 77.7)), 0.6, 1.2), "set"); created++; } return created; } // Morse lookup: chars and their morse strings function string morse_of(string ch) { string chars[] = { "A","B","C","D","E","F","G","H","I","J", "K","L","M","N","O","P","Q","R","S","T", "U","V","W","X","Y","Z", "0","1","2","3","4","5","6","7","8","9" }; string codes[] = { ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---", "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-", "..-","...-",".--","-..-","-.--","--..", "-----",".----","..---","...--","....-",".....","-....","--...","---..","----." }; // already uppercase before calling, but safe: string up = toupper(ch); int idx = -1; for (int i = 0; i < len(chars); i++) { if (up == chars[i]) { idx = i; break; } } if (idx < 0) return ""; // unsupported char -> treat as gap return codes[idx]; } // -------------------- Main: walk along curve-u -------------------- float u = 0.0; int total = 0; msg = toupper(msg); // iterate message characters for (int c = 0; c < len(msg); c++) { if (u >= 1.0 || total >= max_pts) break; string ch = msg[c]; // Word gap if (ch == " ") { u = min(1.0, u + gap_word_units * unit_len); continue; } string code = morse_of(ch); // Unsupported char: treat like a word-ish gap if (code == "") { u = min(1.0, u + gap_letter_units * unit_len); continue; } // For each symbol in morse code for (int s = 0; s < len(code); s++) { if (u >= 1.0 || total >= max_pts) break; string sym = code[s]; float dur_units = (sym == ".") ? dot_units : dash_units; float dens = (sym == ".") ? dot_mult : dash_mult; float u1 = min(1.0, u + dur_units * unit_len); total += emit_interval(0, prim, u, u1, dens, seed + total * 31, unit_len, spacing_units, jitter_radius, jitter_along, max_pts); u = u1; // symbol gap (but not after last symbol) if (s < len(code) - 1) u = min(1.0, u + gap_symbol_units * unit_len); } // letter gap after each character (but not if next is space) if (c < len(msg) - 1 && msg[c+1] != " ") u = min(1.0, u + gap_letter_units * unit_len); } multiple Lines // DETAIL WRANGLE (run once) // Input 0: multiple polyline primitives int seed = chi("seed"); string msg = chs("message"); float unit_len = chf("unit_len"); float spacing_units = chf("spacing_units"); float dot_mult = chf("dot_mult"); float dash_mult = chf("dash_mult"); float jitter_radius = chf("jitter_radius"); float jitter_along = chf("jitter_along"); int max_pts_total = chi("max_pts_total"); // Morse timing (units) float dot_units = chf("dot_units"); float dash_units = chf("dash_units"); float gap_symbol_units = chf("gap_symbol_units"); float gap_letter_units = chf("gap_letter_units"); float gap_word_units = chf("gap_word_units"); // ---------- Helpers ---------- function void frame_on_curve(int geoh; int pr; float u; vector up; export vector P; export vector T; export vector N; export vector B) { P = primuv(geoh, "P", pr, set(u, 0, 0)); float du = 1e-4; vector P2 = primuv(geoh, "P", pr, set(clamp(u + du, 0.0, 1.0), 0, 0)); T = normalize(P2 - P); vector a = normalize(cross(up, T)); if (length(a) < 1e-6) a = normalize(cross({1,0,0}, T)); B = normalize(a); N = normalize(cross(T, B)); } function int emit_interval(int geoh; int pr; float u0; float u1; float density_mult; int seedbase; float unit_len; float spacing_units; float jitter_radius; float jitter_along; int max_pts_cap; int prim_id; int symbol_id) { float du = max(0.0, u1 - u0); float interval_units = du / max(1e-8, unit_len); float base_count = interval_units / max(1e-8, spacing_units); int npts = int(ceil(base_count * max(0.0, density_mult))); if (npts <= 0) return 0; vector up = {0,1,0}; int created = 0; for (int i = 0; i < npts; i++) { if (created >= max_pts_cap) break; float t = (npts <= 1) ? 0.5 : (float(i) / float(npts - 1)); float r = rand(set(seedbase, i, 19.123)); float u = lerp(u0, u1, t); u += (r - 0.5) * jitter_along * (spacing_units * unit_len); u = clamp(u, u0, u1); vector P, T, N, B; frame_on_curve(geoh, pr, u, up, P, T, N, B); float ang = rand(set(seedbase, i, 3.7)) * 2.0 * M_PI; float rr = sqrt(rand(set(seedbase, i, 8.1))) * jitter_radius; vector jitter = cos(ang) * N * rr + sin(ang) * B * rr; int pt = addpoint(0, P + jitter); setpointattrib(0, "curveu", pt, u, "set"); setpointattrib(0, "pscale", pt, fit01(rand(set(seedbase, i, 77.7)), 0.6, 1.2), "set"); // super useful for shading / grouping setpointattrib(0, "sourceprim", pt, prim_id, "set"); // which input curve setpointattrib(0, "symbol", pt, symbol_id, "set"); // 0=dot, 1=dash created++; } return created; } function string morse_of(string ch) { string chars[] = { "A","B","C","D","E","F","G","H","I","J", "K","L","M","N","O","P","Q","R","S","T", "U","V","W","X","Y","Z", "0","1","2","3","4","5","6","7","8","9" }; string codes[] = { ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---", "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-", "..-","...-",".--","-..-","-.--","--..", "-----",".----","..---","...--","....-",".....","-....","--...","---..","----." }; string upc = toupper(ch); for (int i = 0; i < len(chars); i++) if (upc == chars[i]) return codes[i]; return ""; } // ---------- Main ---------- msg = toupper(msg); int npr = nprimitives(0); int total_pts = 0; // You can choose: same message for every curve, or offset/seed per curve. for (int pr = 0; pr < npr; pr++) { if (total_pts >= max_pts_total) break; float u = 0.0; // per-primitive seed so each curve has a unique pattern jitter int sseed = seed + pr * 10007; for (int c = 0; c < len(msg); c++) { if (u >= 1.0 || total_pts >= max_pts_total) break; string ch = msg[c]; if (ch == " ") { u = min(1.0, u + gap_word_units * unit_len); continue; } string code = morse_of(ch); if (code == "") { u = min(1.0, u + gap_letter_units * unit_len); continue; } for (int k = 0; k < len(code); k++) { if (u >= 1.0 || total_pts >= max_pts_total) break; string sym = code[k]; float dur = (sym == ".") ? dot_units : dash_units; float den = (sym == ".") ? dot_mult : dash_mult; int sid = (sym == ".") ? 0 : 1; float u1 = min(1.0, u + dur * unit_len); // cap per-interval emission so one curve can't explode points int cap_here = max(1, (max_pts_total - total_pts)); int made = emit_interval(0, pr, u, u1, den, sseed + total_pts * 31, unit_len, spacing_units, jitter_radius, jitter_along, cap_here, pr, sid); total_pts += made; u = u1; if (k < len(code) - 1) u = min(1.0, u + gap_symbol_units * unit_len); } if (c < len(msg) - 1 && msg[c+1] != " ") u = min(1.0, u + gap_letter_units * unit_len); } }
  11. Please help me, how should I approach this geo effect? Let’s take a single line as a base geometry. From this line, generate a new geometry composed entirely of dots. The dot pattern is inspired by fake Morse code: it follows the visual logic of Morse, but only consists of dots with different density. Only dots are used - no dashes. What would normally be a dash is represented as a region of higher dot density (clusters of tightly packed points). Pauses or separations are represented by lower-density or empty gaps - something like that. Any ideas?
  12. Just bought a new windows machine with dual Nvidia graphic cards. Tries rendering Karma GPU for the first time and it keeps crashing my machine. I heard this is a know issue and that there is a setting that can fix it. Any help would be great. Thanks
  13. Earlier
  14. Hi magicians, How can I create something like this? (ref attached). Idea is to be somehow realistic, but also art directable, I'm struggling to have some nice dripping, mostly vertical, falling within a FLIP sim. So far I've played with surface tension, stick colision, viscosity, different emitters, and some custom forces, but still looks pretty messy. Any thoughts? Thanks!
  15. I'm back, After checking the code, here's what I found: - UI_EVENT_REDRAW comes from Houdini's env variables. Its limit needs to be up. - "wmic" bug fixed Concerning aspect ratio: - They are made for horizontal framing, can be customized with dedicated button for vertical. Pixel size are shown for custom ratio to help get exact resolution wanted. Note that I'll add vertical toggle since it seems rather useful. - Added helpcards for buttons that don't seem straightforward. Can you send me your email so I can send you a beta version @Dmitry Futoryan?
  16. Hi @Dmitry Futoryan Thank you for reaching out and for taking the time to explain the issues in detail. Really appreciate it. I’m sorry for the frustration you’ve run into. I wasn’t aware of these specific errors occurring in H21.0.596, I’ll follow up once I’ve identified the cause of the errors and can provide either a fix or clear setup instructions. Thanks again for your patience and for bringing this to my attention. Note that for support, you just have to reply to your Gumroad's receipt email.
  17. I strongly agree, using different render engines in one project is not really recommended.
  18. I think the idea that POP simulations are entirely single-threaded is a bit of an oversimplification. While it’s true that some parts of DOP/POP (frame stepping, dependency-heavy logic) don’t parallelize well, nodes like popadvectbyvolume, where each particle independently samples a volume, are quite amenable to multithreading and are implemented that way internally. Since this setup is using cached volumes, it’s also very likely that what you’re seeing includes: volume file loading decompression (bgeo.sc or VDB) VDB block expansion and conversion into Houdini’s internal structures All of those can be multi-threaded and will show up as parallel CPU activity. The parts where a few threads seem to “go their own way” don’t necessarily look like pure file I/O to me; they could just as well be decompression, memory allocation, or volume data preparation happening alongside the main particle work. To really pin down what’s dominant, I’d recommend checking Houdini’s Performance Monitor rather than relying only on the OS CPU graphs. That should make it clear whether the time is spent in popadvectbyvolume itself or in volume loading / preparation. So in this case, it doesn’t look contradictory to the usual POP behavior — it actually seems like a scenario where core count does help, not just single-core clock speed.
  19. import hou, os hou.node("/obj/top_network").cookOutputWorkItems() os.system("pause") Because TOPs is run on a different process the python script would exit straight away so I had to add a pause at the end of the script.
  20. @Thoi Aloha ! Tjena! Do you have Some illustration on panels??? https://blog.iaac.net/pexel-exploring-parametricism-through-the-lens-of-modularity/
  21. Hi, I’m designing a physical modular column made from flat panels. Each panel needs a simple interlocking edge (tabs/slots or tongue-and-groove), repeated over several stacked segments for 3D printing. Is there a good procedural way in Houdini to: generate the panels add parametric interlocking geometry on the edges control number of segments Should I build one locking unit and copy it to edges, or is there a better workflow for parametric joints? Any tips, nodes, or example HIPs would be very helpful!
  22. This is a particle simulation using popadvectbyvolume (cached volume, no sim). I was lead to believe that particle simulations are single threaded hence the CPU core clock speed matters more than number of cores. this however looks quite multi threaded and the parts where some threads go their own way seem to be file handling I think, or am I reading it wrong?
  23. Solved: one wedge node. wedges count: e.g. 3 2 attributes: min & max each of the attributes gets a value list of 3: min 0.1 - 0.5 - 0.9 max 0.3 - 0.7 - 1.4 right click generate, I get 3 work items, and with overwrite target parapeter on work item selection I can clearly see it's working min 0.1 max 0.3 and so on.
  24. Your best bet is either using Arnold or Redshift if you gonna use both, not Karma. With Arnold and RS you have plugins for both and for the most part you can match basically everything.
  25. Hi everyone, Our team is planning to render elements using both Maya and Houdini. Maya will handle most of the polygon assets and animated props, and Houdini will be responsible for FX elements such as particles, points, and volumes. (I understand that rendering everything in Solaris would be the safest approach, but for pipeline reasons we’re splitting tasks between the two.) On the Houdini side, we’re planning to use Karma, either CPU or XPU, depending on the shot. My question is: which render engine in Maya matches motion blur and holdouts most reliably with Karma? At the moment, the main candidates are Arnold and Redshift. If anyone has recommendations based on real production experience or R&D testing—especially motion blur consistency, and compositing accuracy—I’d really appreciate hearing your insights. Thanks in advance!
  26. I purchased the product and wanted to avoid leaving a bad review, but the HDA is spitting out loads of errors in H21.0.596 and there is no documentation on how to make it work, nor can I find a way to contact the developer. I was hoping that I could have a camera that is 1920x1920 and quickly preview how it would crop to a vertical 9x16 frame as well as a horizontal 16x9 frame, but when using the aspect ratio mode it isn't obvious how to set that up. The buttons also don't have any labels to indicate what their function is and when you hover over them the only text says 0. The console also spits out all these errors when creating or deleting the HDA: Event Queue Full. Events being dropped: UI_EVENT_REDRAW to UI_Window Event Queue dropping 49938 events. Event Queue Full. Events being dropped: UI_EVENT_TIMER to UI_Manager Event Queue dropping 1 events. Event Queue Full. Events being dropped: UI_EVENT_APP_SPECIFIC to OH_UIeventHandler Event Queue dropping 1 events. ✓ Valid — you're good to go. 'wmic' is not recognized as an internal or external command, operable program or batch file. Please let me know where I can go for some user support.
  1. Load more activity
×
×
  • Create New...