Last active
September 10, 2024 08:39
-
-
Save HarukaKajita/0ca4a885e40eb54f133e401c6acb8d9d to your computer and use it in GitHub Desktop.
Houdiniで自分好みの階層的にFBXを書き出す為の行列処理の検証Pythonコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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