UltraTex Rotate Rig (second pass)
How you get texture onto the four sides the first pass never saw
- prep
- prep
- normal_views
Texturing a whole object with six cameras leaves gaps. A front view, two sides, a back, a top and a bottom cover the object reasonably well, but each one only sees its own half head-on, and where the view angle gets steep - round the shoulder, down the side of a boot - the bake is stretching whatever picture it has.
UltraTex can only generate in its own six-view layout. It has no "12 views" mode and no way to be told about a seventh camera. So this node cheats in the legitimate way: it rotates the object, and lets the model keep its beloved canonical cameras.
What it does
It takes the prep from UltraTex Prep and returns a new prep for the same mesh, with the same UVs, seen through a rig turned by azimuth degrees. azimuth = 45 - the default - puts the four side cameras at 45°, 135°, 225° and 315°, i.e. exactly between the first pass's front/left/back/right.
Nothing is re-unwrapped or re-normalised; the geometry, the UV layout and the vertex order are identical to the prep you handed it. That's not an implementation detail, it's the contract: UltraTex Bake Texture checks that the two preps share vertices and UVs before baking views from both, and refuses if they don't. Which means you must always derive the rotated rig from the prep that generated your first-pass views - not from a fresh UltraTex Prep node, even with identical settings.
The two things you set
azimuth gets you the in-between angles. 45 is the sensible default; 90 effectively gives you the other four cardinal directions, which is only worth doing if your first pass is bad on a specific side.
elevation is the more interesting knob, and elevation_mode decides what it means.
per view(default): each of the four side cameras is raised byelevationdegrees, upright, no roll. Cameras at 45/135/225/315 all looking slightly down at the object. That's a non-canonical camera arrangement, and normally that would be a problem - but the second pass doesn't start from noise, it starts from the first pass re-projected onto the rotated rig, so consistency is preserved by the init. The pack's author tested +20° and reports all four side views clean.rigid: the whole six-camera rig tilts as one. Only the front camera rises; the back camera ends up looking from below, and the left/right views are rolled sideways. The node logs a warning about this, and the recommended fix in the README is blunt - models render rolled side views poorly.
So: use per view if you want elevation, and treat rigid as the specialised option (it's mostly interesting when you want the swept top/bottom views a tilted rig gives you). The Bake node's views_2_use exists to let you drop the views this mode ruins.
Outputs
prep goes two places: UltraTex Render Views (as its prep, with your first prep as source_prep) and UltraTex Bake Texture (as prep_2, paired with the second pass's albedo_views_2). normal_views is the same diagnostic you get from Prep - six normal maps of the rotated object. Check it: if the rotated normals look wrong, everything downstream is going to be wrong in a way the sampler can't tell you about.
The payoff, measured on the author's test meshes: surface seen head-on (view angle under 45°) goes from 44% to 58% on a dwarf and 60% to 75% on an anime-girl asset. That's the difference between "soft and smeared along the sides" and "actually textured."
Install
Manager → ComfyUI-UltraTex, or:
cd ComfyUI/custom_nodes
git clone https://github.com/visualbruno/ComfyUI-UltraTex
Pack requirements: trimesh, moderngl, xatlas, scipy. This node is pure geometry math on an existing prep, so it costs nothing and adding it doesn't add a dependency.
Gotchas
- You cannot skip Render Views. The rotated prep produces different normal maps, so the second sampler needs starting images that match the rotated geometry - that's a different node's whole job. Feeding pass one's
viewsinto pass two directly trips the alignment check, which measures what fraction of the init content falls outside the new rig's silhouettes and errors out above 5%. - A rotated prep is not interchangeable with the original. Same mesh, same UVs, different cameras. Bake accepts both together deliberately; the sampler does not.
elevationwithrigidis a trap with a warning attached. Read the log line rather than assuming the render is fine.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| prep | ULTRATEX_PREP | — | |
| azimuth | FLOAT | 45-180–180 | Rig rotation around the vertical axis. 45 puts the side views at 45/135/225/315 degrees. |
| elevation | FLOAT | 0-60–60 | Camera height above (> 0) or below (< 0) the object for the side views. See elevation_mode. |
| elevation_mode | COMBO | per view | per view: each of the 4 side cameras is raised by `elevation` (all side views seen from above/below; non-canonical layout, kept consistent by the second pass's init views). rigid: the whole 6-camera rig is tilted - only the front camera rises, the back one drops and the left/right views are rolled sideways. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| prep | ULTRATEX_PREP | — |
| normal_views | IMAGE | — |