Skip to content

Instantly share code, notes, and snippets.

@HarukaKajita
Last active September 10, 2024 08:39
Show Gist options
  • Save HarukaKajita/0ca4a885e40eb54f133e401c6acb8d9d to your computer and use it in GitHub Desktop.
Save HarukaKajita/0ca4a885e40eb54f133e401c6acb8d9d to your computer and use it in GitHub Desktop.
Houdiniで自分好みの階層的にFBXを書き出す為の行列処理の検証Pythonコード
import hou
def matrixTest():
parent_node = hou.node('/obj/grid')
parent_name = parent_node.name()
print(parent_name)
print(parent_name + " local transform")
local_transform = parent_node.localTransform()
print(local_transform)
print("\n")
print(parent_name + " worldtransform")
parent_world_transform = parent_node.worldTransform()
print(parent_world_transform)
print("\n")
print(parent_name + " inverted local transform")
parent_invert_local_transform = local_transform.inverted()
print(parent_invert_local_transform)
print("\n")
print("")
child_node = parent_node.outputs()[0]
child_name = child_node.name()
print(child_name)
print(child_name + " origin" + str(child_node.origin()))
print(child_name + " parm transform")
child_param_transform = child_node.parmTransform()
print(child_param_transform)
print("\n")
print(child_name + " local transform")
child_local_transform = child_node.localTransform()
print(child_local_transform)
print("\n")
print(child_name + " world transform")
child_world_transform = child_node.worldTransform()
print(child_world_transform)
print("\n")
print(child_name + " inverted local transform")
child_invert_local_transform = child_local_transform.inverted()
print(child_invert_local_transform )
print("\n")
print(child_name + " inverted world transform")
child_invert_world_transform = child_world_transform.inverted()
print(str(child_invert_world_transform))
print("\n")
#ここからが検証の重要な部分
#この行列がLocalTransform適用前の行列になる
#検証用でこれがrootなので更に上の親のトランスフォームに影響を受けるとこはない
parent_local_invert_mul_world = parent_invert_local_transform#* grandparent_world_transform
#親までのトランスフォームを相殺し、任意のローカルトランスフォームをする
#親のスケールに合わせてTranslateを拡縮
translate_scaling = parent_local_invert_mul_world.extractScales("srt")
t = [0,1,0]
r = [0,0,45]
s = [2,2,2]
t[0] /= translate_scaling[0]
t[1] /= translate_scaling[1]
t[2] /= translate_scaling[2]
local_trans = hou.hmath.buildRotate(r[0],r[1],r[2], "xyz")
local_trans *= hou.hmath.buildScale(s[0],s[1],s[2])
local_trans *= hou.hmath.buildTranslate(t[0],t[1],t[2])
parent_node.setWorldTransform(local_trans * parent_local_invert_mul_world)
#この行列がLocalTransform適用前の行列になる
print(child_name + " inv_local * worl")
child_invert_local_transform = child_node.localTransform().inverted()
child_world_transform = child_node.worldTransform()
child_local_invert_mul_world = child_invert_local_transform * child_world_transform
print(child_local_invert_mul_world)
print("This is equal parent's world transform")
print("\n")
#親までのトランスフォームを相殺し、任意のローカルトランスフォームをする
#親のスケールに合わせてTranslateを拡縮
translate_scaling = child_local_invert_mul_world.extractScales("srt")
t = [0,1,0]
r = [0,0,0]
s = [1,1,1]
t[0] /= translate_scaling[0]
t[1] /= translate_scaling[1]
t[2] /= translate_scaling[2]
local_trans = hou.hmath.buildRotate(r[0],r[1],r[2], "xyz")
local_trans *= hou.hmath.buildScale(s[0],s[1],s[2])
local_trans *= hou.hmath.buildTranslate(t[0],t[1],t[2])
child_node.setWorldTransform(local_trans * child_local_invert_mul_world)
#メッシュの位置を戻すTransform SOPを追加してもとの形状に戻し整合性を保つ
render_node = parent_node.renderNode()
trans_node = parent_node.createNode('xform')
trans_node.setInput(0, render_node)
trans_node.moveToGoodPosition()
trans_node.setDisplayFlag(True)
trans_node.setRenderFlag(True)
#trans_node.setSelected(True, clear_all_selected=True)
invert_trans = parent_node.worldTransform().inverted()
s = invert_trans.extractScales("srt")
r = invert_trans.extractRotates("srt", "xyz")
t = invert_trans.extractTranslates("srt")
trans_dic = {"tx":t[0], "ty":t[1], "tz":t[2], "rx":r[0], "ry":r[1], "rz":r[2], "sx":s[0], "sy":s[1], "sz":s[2]}
trans_node.setParms(trans_dic)
#メッシュの位置を戻すTransform SOPを追加してもとの形状に戻し整合性を保つ
render_node = child_node.renderNode()
trans_node = child_node.createNode('xform')
trans_node.setInput(0, render_node)
trans_node.moveToGoodPosition()
trans_node.setDisplayFlag(True)
trans_node.setRenderFlag(True)
#trans_node.setSelected(True, clear_all_selected=True)
invert_trans = child_node.worldTransform().inverted()
s = invert_trans.extractScales("srt")
r = invert_trans.extractRotates("srt", "xyz")
t = invert_trans.extractTranslates("srt")
trans_dic = {"tx":t[0], "ty":t[1], "tz":t[2], "rx":r[0], "ry":r[1], "rz":r[2], "sx":s[0], "sy":s[1], "sz":s[2]}
trans_node.setParms(trans_dic)
print("fin.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment