载入中...
搜索中...
未找到
MotionDatabaseSchema.cpp
浏览该文件的文档.
21 if (channel.source != MotionFeatureSource::Trajectory || channel.kind != MotionFeatureKind::Velocity ||
40 if (baked_ || layout.sampleRate < 1 || layout.sampleRate > 240 || layout.channels.empty() || layout.channels.size() > 256 ||
41 !std::isfinite(layout.normalizationLengthScale) || layout.normalizationLengthScale <= 0.f || layout.normalizationLengthScale > 1000000.f)
53 if (c.kind == MotionFeatureKind::Curve && (c.source != MotionFeatureSource::Pose || c.axes != 1 ||
58 if (c.kind != MotionFeatureKind::Curve && c.source == MotionFeatureSource::Pose && (c.sampleTime != 0.f || c.bone < 0 || c.origin < 0 ||
70 const int group = c.source == MotionFeatureSource::Pose ? 0 : (c.kind == MotionFeatureKind::Velocity ? 1 : 2);
108eve::Result<int> MotionDatabase::setFeatureNormalizationRanges(std::span<const MotionNormalizationRange> ranges) {
114 return fail("normalization ranges require a configured unbaked variable layout, clips and bounded nonempty input");
154 partial.px = delta.px * fraction; partial.py = delta.py * fraction; partial.pz = delta.pz * fraction;
192void MotionDatabase::extractSchemaFeature(AnimClip* clip, float time, std::vector<float>& out, float& rootX,
198 rootYaw = std::atan2(2.f * (root.qw * root.qy + root.qx * root.qz), 1.f - 2.f * (root.qx * root.qx + root.qy * root.qy));
211 if (c.kind == MotionFeatureKind::Position) value = detail::schemaDifference(sample, root, root);
212 else if (c.kind == MotionFeatureKind::Heading) value = detail::schemaHeading(sample, root, c.headingAxis);
219 if (c.kind == MotionFeatureKind::Position) value = detail::schemaDifference(bone, origin, root);
220 else if (c.kind == MotionFeatureKind::Heading) value = detail::schemaHeading(bone, root, c.headingAxis);
223 const auto past = detail::schemaDifference(sampler.bone(c.bone, time - dt), sampler.bone(c.origin, time - dt), previousRoot);
230 detail::schemaEncode(std::span(out).subspan(schema_->offsets[i]), c, value, schema_->layout.normalizationLengthScale);
255 if (samples.empty()) throw Exception("MotionDatabase: normalization ranges contain no baked samples");
261 for (int axis = 0; axis < count; ++axis) mean[axis] += frame->feature[schema_->offsets[channel] + axis];
267 const double delta = frame->feature[schema_->offsets[channel] + axis] - mean[axis]; square += delta * delta;
273 const bool unit = first.kind == MotionFeatureKind::Heading || first.kind == MotionFeatureKind::Curve || first.normalizeVelocity;
275 const float inverse = static_cast<float>(deviation > (unit ? .1 : .001 * scale) ? 1.0 / deviation : (unit ? 1.0 : 100.0 / scale));
std::map< std::string, std::vector< Key >, std::less<> > channels
Definition AnimCurveLibrary.cpp:19
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
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:145
float wrapTime(float time) const
Wrap or clamp time according to loop flag.
Definition AnimClip.cpp:471
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
Definition AnimSkeleton.h:16
eve::Result< int > setFeatureNormalizationRanges(std::span< const MotionNormalizationRange > ranges)
Atomically select weighted source ranges used to normalize a variable feature layout.
Definition MotionDatabaseSchema.cpp:108
void normalizeFeature(std::vector< float > &feature) const
Normalize a query with statistics computed by bake().
Definition MotionDatabase.cpp:263
bool hasFeatureLayout() const
Whether this database uses an explicitly configured variable layout.
Definition MotionDatabaseSchema.cpp:14
eve::Result< void > setFeatureLayout(const MotionFeatureLayout &layout)
Atomically configure an owning variable feature layout before bake.
Definition MotionDatabaseSchema.cpp:35
eve::Result< void > setFeatureCurves(std::span< const std::byte > bytes, std::span< const std::string > sources)
Atomically copy scalar source curves for the configured layout.
Definition MotionDatabaseSchema.cpp:86
std::array< float, 3 > schemaDifference(const TransformTRS &a, const TransformTRS &b, const TransformTRS &root)
Definition MotionSchemaInternal.h:34
TransformTRS mulTRS(const TransformTRS &parent, const TransformTRS &local)
Mul trs.
Definition AnimTransformInternal.h:8
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
void slerpQuat(float ax, float ay, float az, float aw, float bx, float by, float bz, float bw, float t, float &ox, float &oy, float &oz, float &ow)
Slerp quat.
Definition AnimMath.h:43
@ Continuing
@ Trajectory
@ Exception
@ InvalidArgument
@ Applied
TransformTRS bone(int index, float time) const
Definition MotionDatabaseSchema.cpp:186
const AnimClip & clip
Definition MotionDatabaseSchema.cpp:162
const AnimSkeleton & skeleton
Definition MotionDatabaseSchema.cpp:161
int rootBone
Definition MotionDatabaseSchema.cpp:163
TransformTRS root(float time) const
Definition MotionDatabaseSchema.cpp:169
TransformTRS raw(int bone, float time) const
Definition MotionDatabaseSchema.cpp:164
Owning ordered feature layout; copied atomically by a database.
Definition MotionFeatureLayout.h:46
Local TRS used by skeletal animation (quaternion xyzw).
Definition AnimMath.h:9