Code/HumanoidMocap/Core/Motion/CapturePlacement.cs

Record struct that defines a capture placement for motion capture data. It stores unit scale, a rotation and a position, and provides a factory ForTarget to compute placement from a target up axis and correction settings, plus a Transform method that converts an XForm from capture space into world space.

Native Interop
using System;
using System.Numerics;
using HumanoidMocap.Core.Maths;
using HumanoidMocap.Core.Target;

namespace HumanoidMocap.Core.Motion;
using Vector3 = System.Numerics.Vector3;

/// <summary>The same explicit camera placement for captured hands and authoritative props.</summary>
public readonly record struct CapturePlacement(float Units,Quaternion Rotation,Vector3 Position)
{
    public static CapturePlacement ForTarget(TargetUpAxis axis,TargetCorrectionSettings settings)
    {
        var units=axis==TargetUpAxis.ZUpEngine?39.3700787f:100f;
        var axisRotation=axis==TargetUpAxis.YUpCm?Quaternion.Identity:Quaternion.CreateFromAxisAngle(Vector3.UnitX,MathF.PI/2);
        var camera=Quaternion.CreateFromYawPitchRoll(settings.CaptureCameraYawDegrees*MathF.PI/180,
            settings.CaptureCameraPitchDegrees*MathF.PI/180,0);
        return new(units,Quaternion.Normalize(axisRotation*camera),Vector3.Transform(settings.CaptureCameraPosition*units,axisRotation));
    }
    public XForm Transform(XForm capture)=>new(Vector3.Transform(capture.Pos*Units,Rotation)+Position,
        Quaternion.Normalize(Rotation*capture.Rot));
}