我正在尝试从搅拌机中导出动画,这是我到目前为止所做的事情:
---这只是为了让你知道我在做什么,而且我已经遗漏了很多东西以保持简短
---如果它太混乱或者需要它我可以发布整个来源。
# Get the armature
arm = ob.getData()
# Start at the root bone
for bone in bones:
if not bone.parent:
traceBone(bone)
def traceBone(bone):
# Get the channel for this bone
channel=action.getChannelIpo(bone.name);
# Get the loc x, y, z channels
c_locx=channel[Ipo.OB_LOCX].bezierPoints
frameCount=len(c_locx)
# Write each location frame
for frameIndex in range(frameCount):
frame_x=c_locx[frameIndex].pt
frameTime=int(frame_x[0]-1)
# Write the time of the frame
writeInt(frameTime)
# Write the x, y and z coordinates
writeFloats(frame_x[1], frame_z[1], frame_y[1])
# Iv'e done the same for rotation
c_quatx=channel[Ipo.PO_QUATX].bezierPoints
# Write the quaternion w, x, y and z values
writeFloats(frame_w[1], frame_x[1], frame_z[1], frame_y[1])
# Go through the children
for child in bone.children:
traceBone(child)
据我所知,一切正常,问题是这些值是抵消的, 代表变化,但我需要的是绝对值,表示骨骼相对于它的父亲的位置和旋转值。
如何获得相对于父母的位置和轮换?
答案 0 :(得分:2)
应将通道数据应用于绑定姿势矩阵之上。
完整的公式如下:
Mr = Ms * B0 * P0 * B1 * P1 ... Bn * Pn
其中:
先生 =骨骼'n'的结果矩阵
Ms = skeleton-> world matrix
Bi =骨骼'i'的绑定姿势矩阵
Pi =构建从存储的通道构建的实际矩阵(您正在导出)
'n-1'是'n'的父骨骼,'n-2'是'n-1'的父亲,...,'0'是'1'的父亲