首页 > 解决方案 > 动画期间身体部位的位置(从 mixamo.com 导入的模型和动画)

问题描述

我正在构建一个简单的 Three.js 游戏,其中游戏角色将踢其他物体。我想在动画期间获取特定身体部位(比如右脚)的位置。

据我了解,这些动画(从https://www.mixamo.com/加载)由关键帧组成;我能够从clip_object.tracks

最后一个 KeyframeTrack 对象(在我的例子中是索引 52;名为mixamorigRightToeBase.quaternion)是 a QuaternionKeyframeTrack,它包含两个数组:timesvalues

times数组由 76 个时间戳组成,从 0 到 2.5(动画持续时间为 2.5 秒)

values数组由 304 (76 * 4) 个不同的值组成。

我的理解是,在第一个时间戳(即clip_object.tracks[52].times[0]),“mixamorigRightToeBase”的x、y、z和w应该分别存储在clip_object.tracks[52].values[0]、、、和clip_object.tracks[52].values[1]中。clip_object.tracks[52].values[2]clip_object.tracks[52].values[3]

换句话说,对于clip_object.tracks[52].times[m]

如果以上所有内容都是正确的,我如何从四元数 x、y、z 和 w 中获得欧拉 x、y、z 坐标?

我尝试使用setFromQuaternion将四元数转换为欧拉坐标,但它并没有真正起作用,所以我想也许我的理解(上面概述)可能并不完全正确。

这是我在animate()函数中的代码:

// I added 'animation_by_name' dictionary to my character to access animations easily
//
const animation_action_object = this.mixer.animation_by_name['Roundhouse Right Kick']
const animation_duration = animation_action_object._clip.duration
const num_of_frames = animation_action_object._clip.tracks[0].times.length
const curr_time = animation_action_object.time
const curr_frame = Math.round(curr_time / animation_duration * num_of_frames)

const x = animation_action_object._clip.tracks[52].values[curr_frame * 4 + 0]
const y = animation_action_object._clip.tracks[52].values[curr_frame * 4 + 1]
const z = animation_action_object._clip.tracks[52].values[curr_frame * 4 + 2]
const w = animation_action_object._clip.tracks[52].values[curr_frame * 4 + 3]

const quaternion = new THREE.Quaternion(x, y, z, w)
let euler = new THREE.Euler()
euler.setFromQuaternion(quaternion)
console.log(euler);

标签: three.js

解决方案


推荐阅读