Aslak Kjølås-Sæverud

AslakKS

About Me

3D Generalist
EXPERTISE
Generalist

Connect

LOCATION
Bergen, Norway
WEBSITE

Houdini Skills

ADVANCED
Procedural Modeling  | Lighting  | Fluids  | PDG  | VEX
INTERMEDIATE
Environments  | Digital Assets  | Motion Editing  | Animation  | Hair & Fur  | Cloth  | Solaris  | Mantra  | Karma  | Pyro FX  | Destruction FX  | Realtime FX  | Python
BEGINNER
Crowds  | Muscles

Availability

I am currently employed at Devant

Recent Forum Posts

Promote specyfic channel to animation. Aug. 29, 2026, 6:28 a.m.

Sorry, I completely jumped over the part where you mentioned the animation editor.
This does sound like a very good RFE to send to support, I would also love to see this easily done without having to dive deep into apex.

I did manage to create a monkey patch that does this with shelf tool that you click when an apex animate state is active.
Slop code, but I tested that it works 🫣
import stateutils; import types

viewer = stateutils.findSceneViewer()
if viewer is None:
  hou.ui.displayMessage("No scene viewer found")
else:
  args = {}
  viewer.runStateCommand("getState", args)
  state = args.get("state")
  if state is None or not hasattr(state, "getScopedChannels"):
    viewer.setPromptMessage("Not in APEX Animate state")
  elif hasattr(state, "_apex_non_locked_scoped_original"):
    state.getScopedChannels = state._apex_non_locked_scoped_original
    del state._apex_non_locked_scoped_original
    viewer.setPromptMessage("Scope non-locked channels: disabled")
  else:
    original_scoped_channels = state.getScopedChannels

    def locked_axes(control_path, transform):
      try:
        control = state.control_manager.controls[control_path]
        minimum = (
          getattr(control, f"{transform}_min_lock")
          if getattr(control, f"{transform}_use_min_lock")
          else getattr(control, f"{transform}_min")
          if getattr(control, f"{transform}_use_min") else None
        )
        maximum = (
          getattr(control, f"{transform}_max_lock")
          if getattr(control, f"{transform}_use_max_lock")
          else getattr(control, f"{transform}_max")
          if getattr(control, f"{transform}_use_max") else None
        )
        if minimum is None or maximum is None:
          return set()
        return {
          axis for axis in "xyz"
          if abs(getattr(minimum, axis)() - getattr(maximum, axis)()) < 1e-6
        }
      except (AttributeError, KeyError, TypeError):
        return set()

    def filter_channels(scoped_channels):
      return {
        rig_path: [
          channel for channel in channels
          if not (
            (control_name := channel.rpartition("_")[0])
            and len(component := channel.rpartition("_")[2]) == 2
            and component[0] in "rts"
            and component[1] in locked_axes(f"{rig_path}/{control_name}", component[0])
          )
        ]
        for rig_path, channels in scoped_channels.items()
      }

    def get_scoped_channels(_state):
      return filter_channels(original_scoped_channels())

    state._apex_non_locked_scoped_original = original_scoped_channels
    state.getScopedChannels = types.MethodType(get_scoped_channels, state)
    viewer.setPromptMessage("Scope non-locked channels: enabled")
edit: made the code more precise by filtering the scoped channels

Promote specyfic channel to animation. Aug. 28, 2026, 12:48 p.m.

This can be controlled by modifying channel limits with Configure APEX Controls.
Here is a screenshot where I limit the rotation to only revolve around RY and translation on TX.

Is there a way to disable text anti-aliasing in Houdini 22? July 22, 2026, 4:23 a.m.

This just looks like a bug, you should report it.
https://www.sidefx.com/forum/topic/15603/ [www.sidefx.com]