three.js - 动画期间身体部位的位置(从 mixamo.com 导入的模型和动画)
问题描述
我正在构建一个简单的 Three.js 游戏,其中游戏角色将踢其他物体。我想在动画期间获取特定身体部位(比如右脚)的位置。
据我了解,这些动画(从https://www.mixamo.com/加载)由关键帧组成;我能够从clip_object.tracks
最后一个 KeyframeTrack 对象(在我的例子中是索引 52;名为mixamorigRightToeBase.quaternion
)是 a QuaternionKeyframeTrack
,它包含两个数组:times
和values
。
该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 应存储在
clip_object.tracks[52].values[m * 4 + 0]
- y 应该存储在
clip_object.tracks[52].values[m * 4 + 1]
- z 应存储在
clip_object.tracks[52].values[m * 4 + 2]
, 和 - w 应该存储在
clip_object.tracks[52].values[m * 4 + 3]
如果以上所有内容都是正确的,我如何从四元数 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);
解决方案
推荐阅读
- php - 在 WordPress 中插入自定义排序帖子代码的位置
- firebase - 当我将默认的 Firebase 托管域替换为新域时,当前的 Firebase 分析数据会发生什么情况?
- vue.js - 如何在 Vue.js 子组件中使用在父组件中延迟加载的第三个组件?
- python - Virtualhost(linux mint)netstat端口与我在win10上看到的不同
- windows - 行尾行为和 Git
- python - 如何将字典中的列表变成字典中的字典?
- spring-integration - 如何使用 IntegrationFlowContext 作为流程配置的一部分?
- bash - Bash:给管道空字符串一个默认值
- python - 如何编写一个返回总位数和单个空格的函数
- pandas - 如何在使用熊猫读取csv文件时根据某些标准在数字前面添加零