One way is to create a smart bundle and set it's filter string to the subnet name + “/*”
So let's say you want to set the selectable flag recursively on all the OBJ node under /obj/subnet1.
Create a Smart Bundle from the pane.
Double click on it edit it's filter string.
Write: /obj/subnet1/*
On the right pane of the bundle list editor, change the Filter combo box to “Any Object”.
You should now have a smart bundle holding all the object nodes inside the subnet.
Now, click the Select Arrow button on the Bundle list toolbar.
It will toggle the selectable flag on all the bundle nodes.
Another way would be to add a custom menu to the Network Editor RMB menu that does it using python and hom.Node.recursiveGlob(). If it's something you wish to do all the time, it's the direction I would take. It's also a great exercise to learn python and xml menus in Houdini.
Found 104 posts.
Search results Show results as topic list.
Houdini Indie and Apprentice » Switch subnet hierarchy selectable flags
- Guillaume
- 476 posts
- Offline
Houdini Indie and Apprentice » geometry is hidden in viewport until selected
- Guillaume
- 476 posts
- Offline
It could be that you hit the Y key with the mouse in the viewport and saved your Desktop with this setting.
The visibility menu is on the viewport top toolbar. See attached pic.
(and welcome to the vfx mountain!)
The visibility menu is on the viewport top toolbar. See attached pic.
(and welcome to the vfx mountain!)
Technical Discussion » Voice commands to summon nodes.
- Guillaume
- 476 posts
- Offline
Technical Discussion » FBX Export Skin weights, skinning to Maya/MotionBuilder
- Guillaume
- 476 posts
- Offline
Ok, so I had a look at your scene the export doesn't work because some of the bones contributing to boneCapture are detected by the exporter as dummy bones.
Here's something I found in the exporter code.
// A bone is a dummy bone if:
// 1) It is a child of a null node
// 2) It has no children
// 3) It has a look-at node
// 4) Its look-at node is a null node which is a child of its parent null-node.
// 5) Its length is an expression.
The dummy bones are usually coming from an FBX file. If you import an fbx from Maya you'll get a null and a bone per maya joint.
I think what you have to do is make sure you do the houdini capture/deform by using the cregions on the nulls rather than on the dummy bones.
Here's something I found in the exporter code.
// A bone is a dummy bone if:
// 1) It is a child of a null node
// 2) It has no children
// 3) It has a look-at node
// 4) Its look-at node is a null node which is a child of its parent null-node.
// 5) Its length is an expression.
The dummy bones are usually coming from an FBX file. If you import an fbx from Maya you'll get a null and a bone per maya joint.
I think what you have to do is make sure you do the houdini capture/deform by using the cregions on the nulls rather than on the dummy bones.
Houdini Indie and Apprentice » how to disable auto scoping?
- Guillaume
- 476 posts
- Offline
Yes, we have a preference for that at the very bottom of the Animation Preferences dialog.
It's in the section When Nodes are Selected:
It's in the section When Nodes are Selected:
- Scope parameters with AutoScope enabled.
Scope parameters with Animation
Houdini Indie and Apprentice » Blending More Than 4
- Guillaume
- 476 posts
- Offline
It is a limitation of the Blend mode.
The Blend node accepts more inputs because the Sequence and Constraint modes supports any input count.
The Blend node accepts more inputs because the Sequence and Constraint modes supports any input count.
Technical Discussion » Autorig missing controls
- Guillaume
- 476 posts
- Offline
Houdini Lounge » Montreal Houdini User Group
- Guillaume
- 476 posts
- Offline
Houdini Learning Materials » Character setup
- Guillaume
- 476 posts
- Offline
Hi Gerbrand,
Here's a free tutorial, from a rigger from MPC London. It goes through the basics of creating a rig from scratch.
http://blaabjergb.com/houdini-rigging/ [blaabjergb.com]
3dbuzz: http://www.3dbuzz.com/training/topic/houdini [3dbuzz.com]
digital tutors: http://www.digitaltutors.com/software/Houdini-Rigging-tutorials [digitaltutors.com]
cmivfx has 3 or so Animation/Rigging tutorial, but the rigging one is only using the autorig.
Also, feel free to post specific rigging questions on the forum.
We'll answer them, even the Doritos ones.
Do you guys know of some good tutorials for rigging, and character deformation in Houdini?
Here's a free tutorial, from a rigger from MPC London. It goes through the basics of creating a rig from scratch.
http://blaabjergb.com/houdini-rigging/ [blaabjergb.com]
I've done both Digital Tutors tutorials dealing with the auto rigging system, but it is my understanding that the auto rig is slow and should be avoided at all cost.You can also have a look at the Technical Rigging training from 3dbuzz. It shows the rigging techniques rather than the auto-rig.
3dbuzz: http://www.3dbuzz.com/training/topic/houdini [3dbuzz.com]
digital tutors: http://www.digitaltutors.com/software/Houdini-Rigging-tutorials [digitaltutors.com]
cmivfx has 3 or so Animation/Rigging tutorial, but the rigging one is only using the autorig.
Are there plans to release a new auto-rig in Houdini, or are there good 3rd party rigs that work with Houdini??Yes, we are planning on redoing the Auto-Rigs in the near future and also offer more Character based training. In Houdini 15, we added a Simple Female rig and Simple Male rig. The rig is flat and way easier to grasp than the older Simple Toon Rig.
Also, feel free to post specific rigging questions on the forum.
We'll answer them, even the Doritos ones.
SI Users » Custom Popup Menu
- Guillaume
- 476 posts
- Offline
It is certainly possible.
Look at the following thread where a user created a really impressive modeling toolbox.
https://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&t=41478&start=50&postdays=0&postorder=asc&highlight= [sidefx.com]
Houdini ships with PySide built-in, so you can install a global Qt event filter and react to mouse clicks from Python.
https://srinikom.github.io/pyside-docs/PySide/QtCore/QObject.html#PySide.QtCore.PySide.QtCore.QObject.installEventFilter [srinikom.github.io]
You would need to do something like:
class KeyPressEater(QObject):
def eventFilter(self, obj, event):
if event.type() == QEvent.KeyPress:
print “Ate key press”, event.key()
return True
else:
# standard event processing
return QObject.eventFilter(self, obj, event)
keyPressEater = KeyPressEater(self)
hou.ui.mainQtWindow().installEventFilter(keyPressEater)
This code is untested and if it works, it will capture all the keyPress event leaving Houdini in a zombie state. Once you have the filter up and running and can hook any PySide code you want to it.
Look at the following thread where a user created a really impressive modeling toolbox.
https://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&t=41478&start=50&postdays=0&postorder=asc&highlight= [sidefx.com]
Houdini ships with PySide built-in, so you can install a global Qt event filter and react to mouse clicks from Python.
https://srinikom.github.io/pyside-docs/PySide/QtCore/QObject.html#PySide.QtCore.PySide.QtCore.QObject.installEventFilter [srinikom.github.io]
You would need to do something like:
class KeyPressEater(QObject):
def eventFilter(self, obj, event):
if event.type() == QEvent.KeyPress:
print “Ate key press”, event.key()
return True
else:
# standard event processing
return QObject.eventFilter(self, obj, event)
keyPressEater = KeyPressEater(self)
hou.ui.mainQtWindow().installEventFilter(keyPressEater)
This code is untested and if it works, it will capture all the keyPress event leaving Houdini in a zombie state. Once you have the filter up and running and can hook any PySide code you want to it.
Houdini Indie and Apprentice » RMB menu for HDA
- Guillaume
- 476 posts
- Offline
I don't think there a way to register a custom menu from python.
You'll need to install a user OPmenu.xml file and add your new menu in there.
Here's the reference page on menu configuration.
http://www.sidefx.com/docs/houdini15.0/basics/config_menus [sidefx.com]
If you look in OPmenu.xml file from the houdini installation, you'll notice it has a conditional menu entry for Character Tools that show up based on the asset type.
If you want your menu to show only on a specific asset type you'll have to do something similar.
You'll need to install a user OPmenu.xml file and add your new menu in there.
Here's the reference page on menu configuration.
http://www.sidefx.com/docs/houdini15.0/basics/config_menus [sidefx.com]
If you look in OPmenu.xml file from the houdini installation, you'll notice it has a conditional menu entry for Character Tools that show up based on the asset type.
If you want your menu to show only on a specific asset type you'll have to do something similar.
Houdini Indie and Apprentice » houdini Open GL
- Guillaume
- 476 posts
- Offline
GuillaumeOh, I learned I don't need anything custom for the camera projection.
Can you post a scene?
I don't have a Camera Projection otl locally, but I know it's been done before.
There's a mode for camera projection on the UVTexture SOP node.
See the attached scene where I applied a Constant material to a grid and a torus that both have their UVs driven by the camera projection.
Houdini Indie and Apprentice » houdini Open GL
- Guillaume
- 476 posts
- Offline
Can you post a scene?
Are you doing the camera projection using UVs or by using a VOP shader?
I don't have a Camera Projection otl locally, but I know it's been done before.
I also do know that you'll see the result in OpenGL only if you use UVs for the projection.
Are you doing the camera projection using UVs or by using a VOP shader?
I don't have a Camera Projection otl locally, but I know it's been done before.
I also do know that you'll see the result in OpenGL only if you use UVs for the projection.
Houdini Indie and Apprentice » Time ruler question
- Guillaume
- 476 posts
- Offline
One of the ruler is obviously in a bogus state.
I can get it to repro by zooming out far away.
You can get back to a correct state by hitting ‘H’ on the keyboard to home to the scene animation range.
I logged a bug for it: #73605 Zooming out the animation editor corrupts the rulers
I can get it to repro by zooming out far away.
You can get back to a correct state by hitting ‘H’ on the keyboard to home to the scene animation range.
I logged a bug for it: #73605 Zooming out the animation editor corrupts the rulers
Technical Discussion » Parameter Type File(string) seems not to work
- Guillaume
- 476 posts
- Offline
Please tell us how you managed to get it working as you won't be the last one to ask how to read file content in vex.
Technical Discussion » Baking animation to key per frame
- Guillaume
- 476 posts
- Offline
Technical Discussion » Baking animation to key per frame
- Guillaume
- 476 posts
- Offline
Yeah! I'm really happy you were able to use the script.
There's a small bug in the script where it always writes keyframes with a value of 0.0 even for scale.
To check if a parameter has a CHOP override you can use hou.Parm.overrideTrack()
http://www.sidefx.com/docs/houdini15.0/hom/hou/Parm [sidefx.com]
I updated the code below to fix the scaling issue and to only do the work on params that have a CHOP export.
def setChopObjectExportFlag( n, f ):
chops = n.recursiveGlob('*/chopnet1/object1')
for c in chops:
c.setExportFlag( f )
def getObjNodes( n ):
return n.recursiveGlob('*',hou.nodeTypeFilter.Obj )
# Bake Keyframes button callback
# Recursively get all the object nodes
# Delete all the animation, re-enable the CHOP exports and Bake the CHOP to keyframes.
def bake_keyframes( n_path ):
enable_chop_exports(n_path)
print “Bake Keyframes”
n = hou.node(n_path)
objs = getObjNodes(n)
parm_names =
# Enable the export flags
setChopObjectExportFlag( n, True )
# Parms for the keyframesRefit.
refit = False
refit_tol = 0.0
refit_preserve_extremas = False
refit_bezier = True
resample = True
resample_rate = 1.0
resample_tol = 0.0
range = True
range_start = n.parm('bake_rangex').eval()
range_end = n.parm('bake_rangey').eval()
bake_chop = hou.parmBakeChop.KeepExportFlag
k0_start = hou.Keyframe( 0.0, range_start )
k0_end = hou.Keyframe( 0.0, range_end )
k1_start = hou.Keyframe( 1.0, range_start )
k1_end = hou.Keyframe( 1.0, range_end )
for obj in objs:
for parm_name in parm_names:
p = obj.parm( parm_name )
# No track, do nothing
if p.overrideTrack == None:
continue
p.deleteAllKeyframes()
# Add dummy keyframes on start and end.
if p in :
p.setKeyframe(k1_start)
p.setKeyframe(k1_end)
else:
p.setKeyframe(k0_start)
p.setKeyframe(k0_end)
p.keyframesRefit( refit,refit_tol,refit_preserve_extremas,refit_bezier, \
resample,resample_rate,resample_tol, \
range,range_start,range_end, \
bake_chop )
# Disable the export flags
setChopObjectExportFlag( n, False )
# Delete Keyframes button callback
def delete_keyframes( n_path ):
print “Delete Keyframes”
n = hou.node(n_path)
objs = getObjNodes(n)
parm_names =
for obj in objs:
for parm_name in parm_names:
p = obj.parm( parm_name )
p.deleteAllKeyframes()
# Enable Chop Export button callback
def enable_chop_exports( n_path ):
print “Enable CHOP Exports”
n = hou.node(n_path)
setChopObjectExportFlag( n, True )
# Disable Chop Export button callback
def disable_chop_exports( n_path ):
print “Disable CHOP Exports”
n = hou.node(n_path)
setChopObjectExportFlag( n, False )
There's a small bug in the script where it always writes keyframes with a value of 0.0 even for scale.
To check if a parameter has a CHOP override you can use hou.Parm.overrideTrack()
http://www.sidefx.com/docs/houdini15.0/hom/hou/Parm [sidefx.com]
I updated the code below to fix the scaling issue and to only do the work on params that have a CHOP export.
def setChopObjectExportFlag( n, f ):
chops = n.recursiveGlob('*/chopnet1/object1')
for c in chops:
c.setExportFlag( f )
def getObjNodes( n ):
return n.recursiveGlob('*',hou.nodeTypeFilter.Obj )
# Bake Keyframes button callback
# Recursively get all the object nodes
# Delete all the animation, re-enable the CHOP exports and Bake the CHOP to keyframes.
def bake_keyframes( n_path ):
enable_chop_exports(n_path)
print “Bake Keyframes”
n = hou.node(n_path)
objs = getObjNodes(n)
parm_names =
# Enable the export flags
setChopObjectExportFlag( n, True )
# Parms for the keyframesRefit.
refit = False
refit_tol = 0.0
refit_preserve_extremas = False
refit_bezier = True
resample = True
resample_rate = 1.0
resample_tol = 0.0
range = True
range_start = n.parm('bake_rangex').eval()
range_end = n.parm('bake_rangey').eval()
bake_chop = hou.parmBakeChop.KeepExportFlag
k0_start = hou.Keyframe( 0.0, range_start )
k0_end = hou.Keyframe( 0.0, range_end )
k1_start = hou.Keyframe( 1.0, range_start )
k1_end = hou.Keyframe( 1.0, range_end )
for obj in objs:
for parm_name in parm_names:
p = obj.parm( parm_name )
# No track, do nothing
if p.overrideTrack == None:
continue
p.deleteAllKeyframes()
# Add dummy keyframes on start and end.
if p in :
p.setKeyframe(k1_start)
p.setKeyframe(k1_end)
else:
p.setKeyframe(k0_start)
p.setKeyframe(k0_end)
p.keyframesRefit( refit,refit_tol,refit_preserve_extremas,refit_bezier, \
resample,resample_rate,resample_tol, \
range,range_start,range_end, \
bake_chop )
# Disable the export flags
setChopObjectExportFlag( n, False )
# Delete Keyframes button callback
def delete_keyframes( n_path ):
print “Delete Keyframes”
n = hou.node(n_path)
objs = getObjNodes(n)
parm_names =
for obj in objs:
for parm_name in parm_names:
p = obj.parm( parm_name )
p.deleteAllKeyframes()
# Enable Chop Export button callback
def enable_chop_exports( n_path ):
print “Enable CHOP Exports”
n = hou.node(n_path)
setChopObjectExportFlag( n, True )
# Disable Chop Export button callback
def disable_chop_exports( n_path ):
print “Disable CHOP Exports”
n = hou.node(n_path)
setChopObjectExportFlag( n, False )
Technical Discussion » CHOP Keyboard Intercept Mode OS X
- Guillaume
- 476 posts
- Offline
Technical Discussion » Parameter Type File(string) seems not to work
- Guillaume
- 476 posts
- Offline
There doesn't seem to be an easy way to read file content from vex. You'll have to add another string parameter and put a python expression on it. In the expression, evaluate the string path, open and read the file in python with it.
Technical Discussion » Parameter Type File(string) seems not to work
- Guillaume
- 476 posts
- Offline
A “File String” parameter won't return the content of the file when you evaluate it. It will return you the string path to the file.
-
- Quick Links