载入中...
搜索中...
未找到
MotionMatcherSchema.cpp
浏览该文件的文档.
9eve::Result<void> MotionMatcher::setFeatureQuery(const AnimPose& current, const AnimPose& previous,
16 if (!database_->schema_ || !database_->isBaked() || !std::isfinite(dt) || dt <= 0.f || dt > 1.f ||
17 current.getBoneCount() != skeleton_->getBoneCount() || previous.getBoneCount() != skeleton_->getBoneCount() || samples.size() > 256 || curves.size() > 256)
18 return fail("feature query requires a baked variable layout, matching poses and finite dt in (0,1]");
29 if (std::abs(s.seconds-samples[j].seconds) < 1e-6f) return fail("trajectory sample times must be unique");
34 if (c.curve.empty() || c.curve.size() > 4096 || !std::isfinite(c.seconds) || !std::isfinite(c.value))
54 for (const auto& s : samples) if (std::abs(s.seconds-c.sampleTime) < 1e-6f) { sample = &s; break; }
72 if (c.kind == MotionFeatureKind::Position) value = detail::schemaRotate({sample->x,sample->y,sample->z}, character, true);
73 else if (c.kind == MotionFeatureKind::Velocity) value = detail::schemaRotate({sample->vx,sample->vy,sample->vz}, character, true);
81 if (c.kind == MotionFeatureKind::Position) value = detail::schemaDifference(bone, now.world(c.origin), root);
82 else if (c.kind == MotionFeatureKind::Heading) value = detail::schemaHeading(bone, root, c.headingAxis);
85 const auto old = detail::schemaDifference(past.world(c.bone), past.world(c.origin), previousRoot);
92 detail::schemaEncode(std::span(query).subspan(schema.offsets[i]), c, value, schema.layout.normalizationLengthScale);
94 for (float v : query) if (!std::isfinite(v)) return fail("encoded feature query exceeds finite range");
104 if (schemaQuery_.empty()) throw Exception("MotionMatcher: configure a feature query before searching");
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:17
void computeWorld(const AnimSkeleton *skeleton)
Compute world transforms from local pose + skeleton hierarchy. World values readable via getWorld* af...
Definition AnimPose.cpp:203
void normalizeFeature(std::vector< float > &feature) const
Normalize a query with statistics computed by bake().
Definition MotionDatabase.cpp:263
eve::Result< void > setFeatureQuery(const AnimPose ¤t, const AnimPose &previous, float elapsedSeconds, std::span< const MotionFeatureTrajectorySample > samples, std::span< const MotionFeatureCurveSample > curves={})
Atomically copy a query for the database's variable feature layout.
Definition MotionMatcherSchema.cpp:9
std::array< float, 3 > schemaDifference(const TransformTRS &a, const TransformTRS &b, const TransformTRS &root)
Definition MotionSchemaInternal.h:34
std::array< float, 3 > schemaHeading(const TransformTRS &bone, const TransformTRS &root, int axis)
Definition MotionSchemaInternal.h:48
std::array< float, 3 > schemaRotate(const std::array< float, 3 > &p, const TransformTRS &q, bool inverse=false)
Definition MotionSchemaInternal.h:25
void schemaEncode(std::span< float > output, const MotionFeatureChannel &channel, std::array< float, 3 > value, float lengthScale)
Schema encode.
Definition MotionSchemaInternal.h:39
Definition Animation.cpp:58
@ Trajectory
@ InvalidArgument
@ Applied
Copied trajectory sample at an explicit offset from the current frame.
Definition MotionFeatureLayout.h:61
Local TRS used by skeletal animation (quaternion xyzw).
Definition AnimMath.h:9