Thursday 27 October 2022

accessing COP outputs in textures

use this expression to get to COP stuff - 


 op:/obj/cop2net1/out


the "op:/" is key!

"shrinkwrap" push faces from one object towards another

More Julian scripting
Use case - an object lying on the floor is not quite touching the surface - so lets pull points of the floor toward the surface. The floor object would go into the first input and the object to "wrap" to goes into the 2nd input. Put this code into a point wrangle -

 i@prim;

v@uvw;

@dist = xyzdist(1, @P, @prim, @uvw);

@bias = fit(@dist, 0, .01, .79, 0);

@P = lerp(@P, primuv(1, "P", @prim, @uvw), @bias);


It might be necessary to play with the "fit" values & ensure the objects are kinda close to each other to begin with! This is good for bodge fixing stuff!


Wednesday 26 October 2022

using a transform that relies on $CEX $CEY $CEZ with a differently shaped/sized object

Use the julian matrix - (point wrangle)

matrix M=detail(1,"xform");

@P=@P*M;

plug the transform you want to "copy" into input 2 ("1") and the object you want to transform with said transform into input 1 ("0"). 

MAKE SURE the transform node has the xform ticked at the bottom, so the wrangle can actually access the "xform"

This is especially relevant for when you overuse $CEX etc bounding box for pivots & you suddenly change the geo size. Eg you rotate your thing into place, and do so using the centre of a short object, but suddenly you need to substitute it with a much taller thing.

Wednesday 12 October 2022

exporting alembics or fbx from houdini with transforms

 Didn't realise this...and wasted about half an hour figuring it out..
If you, for example, are using a FETCH node or a rivet and need to export an object with the transforms you can a) use the bake animation ROP (must be used in ROP context!) b) click File>export as FBX or Alembic.

For the latter to work, you must place your stuff into a SUBNETWORK, or it will not export correctly. VERY ANNOYING. It's a bit like putting things into a group before exporting an alembic in Maya, just much less obvious.

Monday 26 September 2022

@scale

 I can't believe I've never used @scale....

@pscale is useful for uniformly scaling the instance/copied object onto a point. But what if you need to adjust the scale on a per-axis basis?

@scale=set(1,2,3);

this will scale the object by 2 in the Y, and 3 in the Z

woop woop

Thursday 22 September 2022

camera projection uv, texture reference object a la Maya

A simple thing..

In Maya, you can project UVs from a camera. To prevent textures from swimming if you do animate the object, you must create a Texture Reference Object. Here's how you do it in Houdini.

The gist is - 

  • use the UVTEXTURE node to project your uv's. Set the texture type to Perspective from Camera and specify the projection camera in the appropriate box.
  • freeze the object on the frame you want the projection to occur at, using a TIMESHIFT.
  • copy the uv attribute back onto the moving object, using the ATTRIBUTE COPY node.

Wednesday 14 September 2022

filename using digits of the node

 use case - you have many texture nodes, eg. Texture1, Texture2,Texture3.....

You want to automate the filename being loaded & use the number contained within the node name.

To do this we can use a combo of expressions -

//server/jobs/build/ion/textures/flooring/tile_`padzero(2,opdigits("$OS"))`.jpg

where the texture node is Texture5 becomes

//server/jobs/build/ion/textures/flooring/tile_05.jpg

So if we copy and paste this many times, it will update to tile_06, tile_99 etc...


padzero(2, SOMETHING) - pads the value SOMETHING with up to TWO zeroes. 5 becomes 05, 99 stays as 99.

opdigits("whatever") - returns the numbers of "whatever". In the example above, I use the $OS expression to get the name of the node itself-  ie; Texture5, so we get back 5. The padzero makes it 05.

these bits are enclosed with backticks  ` `, to execute the expressions.