Hello,
I am attempting to export my character as an fbx to be used in UE4. My character has a rig with Kinematics and controllers on him. When I export it makes all of my controls into joints/bones in UE4 and similarly when I import it into Houdini. Is it only possible to export animations on bones only and not be able to use controls to animate?
Exporting Character Rig To Unreal 4.8 as FBX
8413 16 5- Justin Bloomer
- Member
- 13 posts
- Joined: 11月 2014
- Offline
- Enivob
- Member
- 2572 posts
- Joined: 6月 2008
- Offline
I think that is the nature of the FBX file format. No FK is allowed. I think the original goal was to simply provide a transport for baked rig animation. Preserving the RIG setup is not what FBX does.
Edited by - 2015年10月26日 21:58:54
Using Houdini Indie 20.0
Windows 11 64GB Ryzen 16 core.
nVidia 3050RTX 8BG RAM.
Windows 11 64GB Ryzen 16 core.
nVidia 3050RTX 8BG RAM.
- Justin Bloomer
- Member
- 13 posts
- Joined: 11月 2014
- Offline
- Enivob
- Member
- 2572 posts
- Joined: 6月 2008
- Offline
There is some information here on baking the animation.
http://forums.odforce.net/topic/20483-baking-expressions-to-keys-for-export/?hl=%2Bbake+%2Banimation [forums.odforce.net]
http://forums.odforce.net/topic/20483-baking-expressions-to-keys-for-export/?hl=%2Bbake+%2Banimation [forums.odforce.net]
Using Houdini Indie 20.0
Windows 11 64GB Ryzen 16 core.
nVidia 3050RTX 8BG RAM.
Windows 11 64GB Ryzen 16 core.
nVidia 3050RTX 8BG RAM.
- digitallysane
- Member
- 1192 posts
- Joined: 7月 2005
- Offline
Justin BloomerIt does export bound skin, but you do need to bake the rotation into individual bones to have the animation as well.
Okay, then is there some where that shows how to bake the animation of a character in Houdini. Cause that is the end goal, I want to import the mesh and have animations applied to it in UE4. The problem is that it only captures the controls animation and not its influence on the bound skin.
You can do that by setting the export flag on the InverseKin CHOP, then using the new bake channels/CHOPs functionality in the H15 Animation Editor.
There is a RFE (ID=70986) for the FBX exporter to do this automatically.
The major showstopper for the Houdini->UE4 via FBX pipeline is the fact that Houdini doesn't support at all the export of blendshapes in the FBX, so if you have anything using that (facial animation for example), there is no way to bring it into UE4 from Houdini.
- Justin Bloomer
- Member
- 13 posts
- Joined: 11月 2014
- Offline
- digitallysane
- Member
- 1192 posts
- Joined: 7月 2005
- Offline
Justin BloomerEach bone should have the rotations baked.
Hello digitallysane,
Would I have to bake all the channels for each InverseKin?
But normally the bones themselves read their rotations from the InverseKin (see the Kinematic Solver parameter on each bone) on each frame.
So on the InverseKin CHOP, un-check “Single Frame” on Channel tab and then set the Export flag on the node (all this makes sense if your kinematic chain is animated).
Back to your bones, you'll see that they now have Rotations exported from CHOPs.
In the Animation Editor, make sure that View>Draw CHOP Exports is checked.
Select all segments in the Channel Editor then Edit>Bake Keyframes…
Check everything and at the bottom choose Bake, Disable… or whatever is useful for you.
- Justin Bloomer
- Member
- 13 posts
- Joined: 11月 2014
- Offline
Okay so I have been testing just exporting a bone rig with animations on the bones. The fbx works when I test in Maya, it shows the bones animating and the mesh deforms correctly, but when I bring it into UE4 only the joints are animating and the mesh is not deforming. Any ideas as to why this would happen?
- chrism
- スタッフ
- 2498 posts
- Joined: 9月 2007
- Offline
- pelos
- Member
- 618 posts
- Joined: 8月 2008
- Offline
- Justin Bloomer
- Member
- 13 posts
- Joined: 11月 2014
- Offline
- Justin Bloomer
- Member
- 13 posts
- Joined: 11月 2014
- Offline
digitallysaneJustin Bloomer
So on the InverseKin CHOP, un-check “Single Frame” on Channel tab and then set the Export flag on the node (all this makes sense if your kinematic chain is animated).
Back to your bones, you'll see that they now have Rotations exported from CHOPs.
In the Animation Editor, make sure that View>Draw CHOP Exports is checked.
Select all segments in the Channel Editor then Edit>Bake Keyframes…
Check everything and at the bottom choose Bake, Disable… or whatever is useful for you.
Alright so I did this, but on my bones they do not show the rotations exported from the CHOP network. Do I need to assign it to the bone's rotation somehow?
- digitallysane
- Member
- 1192 posts
- Joined: 7月 2005
- Offline
- varomix
- Member
- 460 posts
- Joined: 7月 2005
- Offline
digitallysaneJustin BloomerEach bone should have the rotations baked.
Hello digitallysane,
Would I have to bake all the channels for each InverseKin?
But normally the bones themselves read their rotations from the InverseKin (see the Kinematic Solver parameter on each bone) on each frame.
So on the InverseKin CHOP, un-check “Single Frame” on Channel tab and then set the Export flag on the node (all this makes sense if your kinematic chain is animated).
Back to your bones, you'll see that they now have Rotations exported from CHOPs.
In the Animation Editor, make sure that View>Draw CHOP Exports is checked.
Select all segments in the Channel Editor then Edit>Bake Keyframes…
Check everything and at the bottom choose Bake, Disable… or whatever is useful for you.
Thanks Dragos
I was just doing this and that helped
now I need to automate this maybe write a script to do it
Have you done anything like that ?
thanks again
varomix - Founder | Educator @ Mix Training
Technical Artist @ Meta Reality Labs
Technical Artist @ Meta Reality Labs
- digitallysane
- Member
- 1192 posts
- Joined: 7月 2005
- Offline
I do have a WIP script, which can be improved upon. I'm not a Python guy by any means.
This should go in the script tab of a new shelf tool.
def dsgBakeBones():
geometry = dsgRootUserInput()
range = hou.playbar.playbackRange()
rangeStart = range
rangeEnd = range
if geometry == (None):
return
dsgBakeRoot(geometry,rangeStart,rangeEnd)
dsgBakeBoneRot(geometry,rangeStart,rangeEnd)
def dsgRootUserInput():
import toolutils
# Get the active sceneViewer
sViewer = toolutils.sceneViewer()
# Ask user to select geometry
geometry = sViewer.selectObjects('Select root null. press enter to confirm', allow_multisel=False, allowed_types'null',), allow_drag=False)
# Check that the selection wasn't empty
return geometry
def dsgBakeBoneRot(geometry,rangeStart,rangeEnd):
for child in geometry.outputs():
for rot in child.parmTuple('r'):
rot.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
child.parm('length').keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
dsgBakeBoneRot(child,rangeStart,rangeEnd)
def dsgBakeRoot(geometry,rangeStart,rangeEnd):
for trans in geometry.parmTuple('t'):
trans.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
for rt in geometry.parmTuple('r'):
rt.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
for sc in geometry.parmTuple('s'):
sc.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
dsgBakeBones()
This should go in the script tab of a new shelf tool.
def dsgBakeBones():
geometry = dsgRootUserInput()
range = hou.playbar.playbackRange()
rangeStart = range
rangeEnd = range
if geometry == (None):
return
dsgBakeRoot(geometry,rangeStart,rangeEnd)
dsgBakeBoneRot(geometry,rangeStart,rangeEnd)
def dsgRootUserInput():
import toolutils
# Get the active sceneViewer
sViewer = toolutils.sceneViewer()
# Ask user to select geometry
geometry = sViewer.selectObjects('Select root null. press enter to confirm', allow_multisel=False, allowed_types'null',), allow_drag=False)
# Check that the selection wasn't empty
return geometry
def dsgBakeBoneRot(geometry,rangeStart,rangeEnd):
for child in geometry.outputs():
for rot in child.parmTuple('r'):
rot.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
child.parm('length').keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
dsgBakeBoneRot(child,rangeStart,rangeEnd)
def dsgBakeRoot(geometry,rangeStart,rangeEnd):
for trans in geometry.parmTuple('t'):
trans.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
for rt in geometry.parmTuple('r'):
rt.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
for sc in geometry.parmTuple('s'):
sc.keyframesRefit(1,0.1,1,1,1,1,0.1,1,rangeStart,rangeEnd,hou.parmBakeChop.KeepExportFlag)
dsgBakeBones()
- ajz3d
- Member
- 479 posts
- Joined: 8月 2014
- Offline
Hey guys.
I know this is an old thread, but I've done some experiments that involved exporting FBX files without and with baked keys from InverseKIN CHOP. The file size remains the same and I haven't noticed any differences after importing both FBX files into Unity.
Does Houdini bake exported CHOPs data into keyframes now, when it exports the scene into a Filmbox file (15.5)?
I had animation problems when I referenced the channels with “chop” expression. But with exported data it seems to be fine.
I know this is an old thread, but I've done some experiments that involved exporting FBX files without and with baked keys from InverseKIN CHOP. The file size remains the same and I haven't noticed any differences after importing both FBX files into Unity.
Does Houdini bake exported CHOPs data into keyframes now, when it exports the scene into a Filmbox file (15.5)?
I had animation problems when I referenced the channels with “chop” expression. But with exported data it seems to be fine.
Edited by ajz3d - 2016年10月22日 20:09:22
-
- Quick Links