A readonly record struct that encodes camera placement used for captured hands and authoritative props. It stores units scale, a rotation, and a position, provides a factory ForTarget to build placement from target axis and settings, and a Transform method that converts a capture XForm into world XForm using scale, rotation, and offset.
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));
}