2

我正在尝试从搅拌机中导出动画,这是我到目前为止所做的:
--- 这只是为了让您了解我在做什么,我遗漏了很多内容以保持简短。
---如果它太混乱或者如果需要,我可以发布整个源。

# 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)  

据我所知,这一切都很好,问题是这些值是偏移量,代表变化,但我需要的是代表骨骼相对于其父级的位置和旋转值的绝对值。

如何获得相对于其父级的位置和旋转?

4

1 回答 1

2

通道数据应应用于绑定姿势矩阵的顶部。

完整的公式如下:

先生 = 女士 * B0*P0 * B1*P1 ... Bn*Pn

在哪里:

Mr = 骨骼“n”的结果矩阵

Ms = 骨架-> 世界矩阵

Bi = 骨骼“i”的绑定姿势矩阵

Pi = 构成从存储通道构建的实际矩阵(您正在导出)

“n-1”是“n”的父骨骼,“n-2”是“n-1”的父骨骼,...,“0”是“1”的父骨骼

于 2009-11-04T20:37:17.347 回答