PHILIP BALLINGER

  • born '79 in graz austria. completed formal 12 years of education
  • dual citizenship US/EU, bilingual - german / english

1995-2000 - moved to graz, austria

jobs
generalist, architecture, advertising, 3d web content
software
3d studio 4, 3ds max, Maya 1.0, shake, nuke

2001-2019 - moved to vienna, austria

jobs
advertising and series as a generalist. mostly modelling, and texturing. some character animations, here and there some FX jobs
software
    maya, modo, mari, 3d painter, nuke, mudbox
  • houdini for asset management and rendering
  • switched to linux early 2000

2019-2024 - moved to berlin, germany

jobs
feature film / FX artist
software
houdini replaced most apps. 3dcoat and blender for sculpting at the moment
    dops, pop, pyro, vellum, rbd, grain, crowds
  • procedural modelling, few lines of vex here and there

random sculptings

favela city generator notes


Scatter building points

  • init attributes: N, up, scale, floor count
  • point distribution
    • scatter node: relax itterations
    • point relax node: relaxing per pscale and conforming the points to geo in the 2nd input
    • measure: removing points per slope angle
    • vex/vop: nearpoint, pcopen

template box copying / shaping

  • name template box. floor, ceiling, north, south, etc.
  • copy template box to floor level
  • rbd intersect / detangle hda
  • stack boxes based on floor level
    • feedback loop, isolate ceiling, make centroid
    • set initial attributes, orient, floor level, size of next box
    • copy new floor box
  • shaping
    • taper based on floor levels
    • isolate % of corners -> scatter box -> bool subtract
    • twist, bend floor levels
    • conform / fit building angle to each other and ground
  • insets, cutting out portions for more interesting shapes
    • postifx your template box naming scheme, east_inset, west_inset
    • bool subtract the shapesand the new walls will inherit the new name

naming convention

  • s@type -> building number, build1, build2, etc
  • s@type_prop -> door, lamps, ceiling, wall, etc
  • i@type_id, i@type_itt
  • s@type_mat -> obsolete with usd
  • i@level, i@level_max -> floor level
  • i@lod -> level of detail
  • i@cluster -> wedging number

rotation around an axis

  • what i did at the time is below, what i would do now is a attrib randomize node set to direction, orient along up axis and setting the cone angle
  •                 // point wrangle
                    v@up = @N;
                    matrix3 m = maketransform(v@dir, v@N);
    
                    vector axis = v@up;
                    @angle = radians(fit01(rand(@build_id),ch('min'),ch('max')));
                    rotate(m, @angle, axis);
    
                    p@orient = quaternion(m);
                  

    template box labels

    • template box
    • facet -> unique points , post-compute normals
                    // prim wrangle
                    int pts[] = primpoints(0, @primnum);
                    vector normal = point(0, "N", pts[0]);
    
                    if (normal.y > 0)s@type = "roof";
                    else if (normal.y < 0)s@type='floor';
    
                    if(normal.y==0)s@type='wall';
                    if(@type=='wall' && normal.x==1 || normal.x==-1)@type='wall_x';
                    if(@type=='wall' && normal.z==1 || normal.z==-1)@type='wall_z';
                  
    • fuse points, set rest position, normals
    • copy to src points

    init

    favella

    transformer hda

    electrical box hda

    • min, max parms on all attribs, seed slider creates new variantes
    • input for external cables feeding into the box
    transformer
    window hda

    window hda

    create a couple of window variants for your "copy to points" node

    • output: packed geo (window, pane, sub), lod toggle
    bricker
    door hda

    door hda

    which will be the first and last door i will ever model

    • same logic as the window hda
    door
    detangle hda

    detangle hda

    • bullet solver deintersect hda
    • used it quite allot so i packaged it up, but basically its just setting found_overlap on your packed geometry
    detangle
    bricker hda

    bricker hda

    cutter tool that aligns itself to the longest edge of a poly. useful for brick walls, rooftops, upres messy topology etc.

    • cut rows and or columns, group every second row
    bricker
    waypoint rop

    waypoint hda

    i can't be bothered at every step to think about where stuff should be saved - which was the initial reason to have a rop with a pre defined path structure. the waypoint name and hda were initially from qlib but grew over the years into its own thing. so i re built it from scratch - removed most of the python code, cleaned it up to be more specific, rather than something that does it all. volume compression, attribute cleanup etc...

    • the wedging is done in tops - the subnet is inside the hda with a pre defined top node structure.
    • the path is built in a detail wrangle, so it should be pretty straight forward to change it for your needs.
    • help card inlcuded

    waypoint rop

    cable scatter

    cable management

    was in need of cable bundles that i could lay out on a rather complicated shape. barebone side i wanted to place them in specific areas. so this tool workes from a modellers perspective where you lay them out one by one opposed to "fill this area with cables". at the time i just wanted static cables that i could place efficiently - turns out that i animated this thing, so this tool got a bit more complex.

    • cable scatter: makes a cable bundle from a single curve. mark binder as "pin to animation" or "pin to cable"
    • cable material: prepare for simulation, set basic material properties like stiffness and pin weights
    • cable drape, solve and capture
    cable sim

    procedural texture masking in houdini


    was planning on transfering some texture painting techniques to houdini for a while now which i never did because i like the realtime feedback that you get from 3d painting applications.

    but it also takes some time to get to the point where you can start painting. cleaning geometry for export, generating utility maps, exporting the end result can take some time. which is fine for hero objects, not so great for entire cities or complex mechanical objects. on top of that i rarely need a brush for the base setup, if its a hero object i might touch it up in the end.

    the speed increase from mantra to karma is pretty nice. slowly packaging up small hda's. i am still shifting stuff around, besides... not all stock nodes work yet with karma, displacements are also still an issue.

    basic workflow

    diffuse

  • base diffuse layers: metal, wood, fabric etc
  • secondary diffuse layer: paint, text, aging, rust, grunge
  • masks define specific features: leaks, mold, grunge, paint chipping
  • mix between base and secondary colors using the masks
  • apply wear and tear grunge patterns ontop
  • mask out parts that reveil the base material (scratches, chipping, etc)

  • roughness and metallic channels

  • mix relevant layers using blending modes and / or masks
  • so the masks do not use any uv's. they are based on normals, world position, occlusion, curvature and thickness. this lets you construct general purpose shaders on light testing geometry - like a shaderball - and apply the material to a different asset.

    works nicely with similar looking objects - coming from a shaderball and applying it to a house might be a bit extrem tough... the favela houses are not subdivided, the curvature harsh and mostly flat... your results may vary.
    the main pitfalls are the texture map scaling settings - if you are using uv based texture maps - and parameters like curvature threshold, occlusion distance and the sorts might need adjustments.

    playing around with lops and karma... more favela pics in the main section

    matball hda

    shaderball hda

    2 model variations. use the path attribute for importing into lops

    matball hda

    lop example scene

    2 sample materials included

    window hda

    utility hda's

    seed slider randomizes parameters between a user defined range. using this for the favela buildings - isolate walls that need a window, scatter points onto the measured poly, divide the area size by the window count, copy stamp the hda onto the points, source points control seed, max width and height parms.

    • warp: domain distortion - for braking up patterns
    • remap: grade node similar nuke's logic
    • color: constant with metal presets, colorize the input, randomize hsv
    • solo: bypass the network to isolate nodes
    • pbr validate: visualize the limits of your pbr range
    • layer blend: mix, multiply, screen, divide, add, minus, difference, lighten, darken, overlay, hard / soft / vivid / pin light, linear burn, color dodge, color burn
    bricker hda

    masking hda's

    cutter tool that aligns itself to the longest edge of a poly. useful for brick walls, rooftops, upres messy topology etc. i have seen more stable nodes, but it was good enough to bricker an entire city... roughly 400 buildings.

    • wear: occlusion based dirtmap
    • iso: mask by normals, thickness and curvature
    • pat: scratches, dot splatter, voronoi noise, lines
    texture map hda
    • texture file node that picks random files out of a sequence.
    • randomizes the position, rotation and scale between min and max values

    2024BALLINGER