Jump to content

konstantin magnus

  • Posts

  • Joined

  • Last visited

  • Days Won


konstantin magnus last won the day on May 2

konstantin magnus had the most liked content!

Contact Methods

  • Website URL

Personal Information

  • Name
    Konstantin Magnus
  • Location

Recent Profile Visitors

19,461 profile views

konstantin magnus's Achievements


Contributor (5/14)

  • Well Followed Rare
  • Conversation Starter Rare
  • First Post Rare
  • Collaborator Rare
  • Posting Machine Rare

Recent Badges



  1. Reversed surface normals go inwards to measure the inside occlusion of the mesh. Complementing the outside/ambient exposure (1.0 - exposure) would just remap the values.
  2. Hi karen, Store the nearest mesh point for each scatter point. Promote nearest point numbers to an array under detail. Group the mesh points that can be found inside the array. group_closest.hipnc
  3. Hi Antoine, there's a Convex decomposition-node that can do similar things. Otherwise you could create clusters based on reversed ambient occlusion. mesh_segmentation.hip
  4. Hi Antoine, you may want to look into this: https://procegen.konstantinmagnus.de/drawing-a-silhouette-around-a-mesh
  5. The resample node has a distance attribute to set the height of the tubes. The input tube has been shifted sideways by its radius. copy_tubes.hip
  6. Glad you like it. I'd recommend rendering only the particles instead of VDBs. It's a lot faster and can get way more detailed.
  7. To animate the spider web threads, you would pin the end points and set vellum to the constraint type 'string'. For membranes to 'cloth'. spiderweb.hipnc
  8. For static models I mostly just fake gravity based on curve lengths or surface distances: https://procegen.konstantinmagnus.de/spider-web https://procegen.konstantinmagnus.de/minimal-surface-membrane Eg. for resampled curve segments on a spider web, a is the user defined hanging amount, u the relative and r the absolute length. u * (1.0 - u) is a function to make the curves hang in their center. float a = chf('amount'); float u = vertexcurveparam(0, i@vtxnum); float r = primintrinsic(0, 'measuredperimeter', i@primnum); v@P.y -= u * (1.0 - u) * a * r; spiderweb.hipnc
  9. Cool, I've just replaced the iterative approach by a tracer that does practically the same thing. int steps = chi('steps'); float w = chf('width'); float dist = 0.0; if(f@mask < 0.5){ vector pos = v@P; for(int i = 0; i < steps; i++){ vector grad = volumegradient(0, 'height', pos); pos -= normalize(grad) * w; float mask = volumesample(0, 'mask', pos); if(mask > 0.5){ dist = 1.0 - i / (steps - 1.0); break; } } } f@mask = max(f@mask, dist); snow_accum.hipnc
  10. Hi Isaac, in this case couldn't you work with one ray, eg. using the ray SOP with inverted normals? thickness.hipnc
  11. Hi Ploy, you could streak the object mask on towards the gradient. heightfield_snow.hipnc
  12. I think you would still need to correct the point numbers to really make all the tiles match, but yeah, I'm glad it's useful.
  13. Copy the height fields to the points of an octahedron to shape a cube, apply noise there and assign them to a cross. Alternatively try sampling the world position noise from a cube mesh right away: int index[] = array(0,2,1,3,5,4); vector bb = relbbox(0, v@P); vector uvw = set(bb.x, bb.z, 0.0); vector pos = primuv(1, 'P', index[i@primnum], uvw); float height = noise(pos * 50.0) * 200.0; f@density = height; heightfield_cube.hipnc
  14. Hi Natiq, maybe there is a node for this, but you could overlap both height fields and sample them into a new one: float band = chf('band'); float h_0 = volumesample(1, 'height', v@P); float h_1 = volumesample(2, 'height', v@P); float mask = smooth(-band, band, v@P.x); f@height = lerp(h_0, h_1, mask); hf_blend.hip
  • Create New...