载入中...
搜索中...
未找到
MotionFeatureInternal.h
浏览该文件的文档.
1#pragma once
2
3#include <array>
4#include <span>
6
8inline constexpr int locomotionPoseOffset = 19;
9inline constexpr int locomotionFeatureCount = 30;
10inline constexpr std::array<float, 5> locomotionHorizons{-0.05f, 0.f, 0.35f, 0.7f, 1.f};
11
13inline float featureYaw(const TransformTRS& t) {
15 return std::atan2(2.f * (t.qw * t.qy + t.qx * t.qz), 1.f - 2.f * (t.qx * t.qx + t.qy * t.qy));
16}
17inline std::array<float, 3> featureLocal(float x, float y, float z, float yaw) {
18 const float cs = std::cos(yaw), sn = std::sin(yaw);
19 return {x * cs - z * sn, y, x * sn + z * cs};
20}
21inline std::array<float, 3> featurePosition(const TransformTRS& bone, const TransformTRS& root) {
23 return featureLocal(bone.px - root.px, bone.py - root.py, bone.pz - root.pz, featureYaw(root));
24}
25// Shared by database indexing and live pose-history queries. Each sample removes
26// its own root transform before differencing: capsule travel is not foot swing.
28inline void encodeLocomotionPose(std::span<float> out, const std::array<TransformTRS, 4>& now,
29 const std::array<TransformTRS, 4>& past, float interval) {
30 const auto left = featurePosition(now[1], now[0]), right = featurePosition(now[2], now[0]);
31 for (int axis = 0; axis < 3; ++axis) out[19 + axis] = left[axis] - right[axis];
32 for (int foot = 1; foot <= 2; ++foot) {
33 const auto current = featurePosition(now[foot], now[0]), previous = featurePosition(past[foot], past[0]);
34 for (int axis = 0; axis < 3; ++axis)
35 out[22 + (foot - 1) * 3 + axis] = (current[axis] - previous[axis]) / interval;
36 }
37 // UE's GLTFExporter maps local UE Y to glTF Z. Keep the projected vector's
38 // length (a tilted pelvis must not be renormalized after stripping vertical).
39 const auto& q = now[3];
40 const auto heading = featureLocal(2.f * (q.qx * q.qz + q.qw * q.qy), 0.f, 1.f - 2.f * (q.qx * q.qx + q.qy * q.qy),
42 featureYaw(now[0]));
43 out[28] = heading[0];
44 out[29] = heading[2];
45}
46template <class Sample>
48inline void encodeLocomotionTrajectory(std::span<float> out, const std::array<Sample, 5>& samples, float yaw) {
49 auto position = [&](int sample, int offset) {
50 const auto p = featureLocal(samples[sample].x, samples[sample].y, samples[sample].z, yaw);
51 out[offset] = p[0];
52 out[offset + 1] = p[2];
53 };
54 auto velocity = [&](int sample, int offset) {
55 const auto v = featureLocal(samples[sample].vx, samples[sample].vy, samples[sample].vz, yaw);
56 out[offset] = v[0];
57 out[offset + 1] = v[2];
58 };
59 auto heading = [&](int sample, int offset) {
61 yawToForward(samples[sample].yaw - yaw, out[offset], out[offset + 1]);
62 };
64 velocity(1, 0);
66 position(0, 2);
68 heading(1, 4);
70 position(2, 6);
72 heading(2, 8);
74 position(3, 10);
76 velocity(3, 12);
78 heading(3, 14);
79 auto v = featureLocal(samples[4].vx, samples[4].vy, samples[4].vz, yaw);
80 // Reference bNormalize clamps at 1 cm/s; these assets and queries use metres.
81 const float divisor = std::max(0.01f, std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
82 for (int axis = 0; axis < 3; ++axis) out[16 + axis] = v[axis] / divisor;
83}
85inline float locomotionWeight(int index) {
86 if (index == 2 || index == 3 || (index >= 22 && index < 28)) return 0.3f;
87 if (index >= 16 && index < 19) return 1.5f;
88 if (index >= 28) return 0.1f;
89 return 1.f;
90}
91} // namespace eve::animation::detail
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
int root
Definition AnimSmr.cpp:119
glm::vec4 p[6]
std::array< double, 10 > q
float v
HexVec3 left
HexVec3 right
size_t offset
std::array< float, 3 > position
std::uint32_t bone
graphics::Canvas * previous
float t
double current
V3 heading
Definition TreeMesh.cpp:292
uint32_t index
float vz
float vy
float vx
float locomotionWeight(int index)
Locomotion weight.
constexpr std::array< float, 5 > locomotionHorizons
std::array< float, 3 > featurePosition(const TransformTRS &bone, const TransformTRS &root)
void encodeLocomotionPose(std::span< float > out, const std::array< TransformTRS, 4 > &now, const std::array< TransformTRS, 4 > &past, float interval)
Encode locomotion pose.
float featureYaw(const TransformTRS &t)
Feature yaw.
std::array< float, 3 > featureLocal(float x, float y, float z, float yaw)
void encodeLocomotionTrajectory(std::span< float > out, const std::array< Sample, 5 > &samples, float yaw)
Encode locomotion trajectory.
void yawToForward(float yaw, float &fx, float &fz)
Rotate unit +Z by yaw (radians) around Y — used for planar facing.
Definition AnimMath.h:144
Local TRS used by skeletal animation (quaternion xyzw).
Definition AnimMath.h:9