Skip to content
Snippets Groups Projects
Commit 3b85f348 authored by Patrick Nossol's avatar Patrick Nossol
Browse files

Changed Save Sequence Rig (not majorly)

fixed offsets, configurable smoothing parameters
parent a0695868
No related branches found
No related tags found
No related merge requests found
No preview for this file type
No preview for this file type
......@@ -338,19 +338,6 @@ void AMCController::PreprocessRecording() {
}
//----pull down hip amount----
float PullDownHip = 0;
{
FVector OffsetPos = AnimSaveState.AnimData[0].SensorData.LowerBody.Pos;
float diff = OffsetPos.Z;
FQuat OffsetRot = AnimSaveState.AnimData[0].SensorData.LowerBody.Rot;
OffsetRot = OffsetRot * FQuat(FVector(0, 0, 1), FMath::DegreesToRadians(180));
AnimSaveState.Pawn->OffsetSensorData(EBodyPart::LowerBody, OffsetPos, OffsetRot);
diff = OffsetPos.Z - diff;
PullDownHip = diff;
}
//----process the anim data----
//---Sensor turned off -> interpolate
......@@ -437,100 +424,8 @@ void AMCController::PreprocessRecording() {
}
//---other processing---
for (int i = 0; i < AnimSaveState.AnimData.Num(); i++) {
FProcessedAnimData& AnimData = AnimSaveState.AnimData[i];
if (AnimData.IsMarker || AnimData.IsEnd) {
continue;
}
//process sensor data
FSensorData& SensorData = AnimData.SensorData;
for (int j = 0; j < EBodyPart::LAST; j++) {
EBodyPart Type = EBodyPart(j);
FSensorDataEntry* Entry = SensorData.GetEntry(Type);
//pull down hip
if (Type == EBodyPart::LowerBody) {
FQuat Swing, Twist;
Entry->Rot.ToSwingTwist(FVector(0, 0, 1), Swing, Twist);
float angle = FMath::RadiansToDegrees(Swing.GetAngle());
if (angle > 180) {
angle -= 360;
}
//Entry.Pos.Z += PullDownHip * FMath::Abs(angle / 180.f);
}
//analyse z pos of feet
if (Type == EBodyPart::LowerLegL) {
int window = 5;
bool isMin = true;
for (int w = 1; w <= window; w++) {
if (i + w < AnimSaveState.AnimData.Num()) {
FVector Pos = AnimSaveState.AnimData[i + w].SensorData.LowerLegL.Pos;
if (Entry->Pos.Z <= Pos.Z) {
isMin = false;
break;
}
}
if (i - w >= 0) {
FVector Pos = AnimSaveState.AnimData[i - w].SensorData.LowerLegL.Pos;
if (Entry->Pos.Z <= Pos.Z) {
isMin = false;
break;
}
}
}
if (isMin) {
AnimSaveState.LowestPoints.Push(Entry->Pos.Z);
}
//offset
FVector OffsetPos = Entry->Pos;
FQuat OffsetRot = Entry->Rot;
AnimSaveState.Pawn->OffsetSensorData(Type, OffsetPos, OffsetRot);
isMin = true;
for (int w = 1; w <= window; w++) {
if (i + w < AnimSaveState.AnimData.Num()) {
FVector Pos = AnimSaveState.AnimData[i + w].SensorData.LowerLegL.Pos;
if (OffsetPos.Z <= Pos.Z) {
isMin = false;
break;
}
}
if (i - w >= 0) {
FVector Pos = AnimSaveState.AnimData[i - w].SensorData.LowerLegL.Pos;
if (OffsetPos.Z <= Pos.Z) {
isMin = false;
break;
}
}
}
if (isMin) {
AnimSaveState.LowestPointsOffset.Push(OffsetPos.Z);
}
}
}
//process finger data
if (bFingerTrackingEnabled) {
}
}
//---Smoothing of legs---
int smoothTimes = 5;
int smoothTimes = LegSmoothTimes;
for (int l = 0; l < smoothTimes; l++) {
TArray<FProcessedAnimData> OldAnimData = AnimSaveState.AnimData;
......@@ -549,7 +444,7 @@ void AMCController::PreprocessRecording() {
FQuat RotRes = OldAnimData[i].SensorData.GetEntry(BodyPart)->Rot;
int RotNum = 1;
int window = 3;
int window = LegSmoothWindow;
int sum = 2 * window + 1;
FVector LastPos = OldAnimData[i].SensorData.GetEntry(BodyPart)->Pos;
......@@ -604,8 +499,6 @@ void AMCController::PreprocessRecording() {
if (GestureHoldExcessTime > 0.f) {
for (int i = 1; i < AnimSaveState.AnimData.Num(); i++) {
FProcessedAnimData& AnimData = AnimSaveState.AnimData[i];
......@@ -704,21 +597,11 @@ void AMCController::PreprocessRecording() {
//debugging things
std::string speed = "";
std::string lp = "";
std::string lpo = "";
for (int i = 0; i < GestureSpeed.Num(); i++) {
speed += "\n" + std::to_string(GestureSpeed[i]);
}
for (int i = 0; i < AnimSaveState.LowestPoints.Num(); i++) {
lp += "\n" + std::to_string(AnimSaveState.LowestPoints[i]);
}
for (int i = 0; i < AnimSaveState.LowestPointsOffset.Num(); i++) {
lpo += "\n" + std::to_string(AnimSaveState.LowestPointsOffset[i]);
}
}
......
......@@ -276,8 +276,12 @@ FRigUnit_AdditionalOffsets_Execute() {
for (const auto& Offset : Offsets) {
FTransform Transform = Hierarchy->GetGlobalTransform(Offset.name);
Transform.SetRotation((Transform.GetRotation().Rotator() + *Offset.rot).Quaternion());
Hierarchy->SetGlobalTransform(Offset.name, Transform);
FQuat NormOffsetRot = (*Offset.rot).Quaternion();
NormOffsetRot.Normalize();
FTransform OffsetTransform(NormOffsetRot, *Offset.pos);
Hierarchy->SetGlobalTransform(Offset.name, OffsetTransform * Transform);
}
}
......
......@@ -28,9 +28,6 @@ USTRUCT()
struct FAnimSaveState {
GENERATED_BODY()
TArray<float> LowestPoints;
TArray<float> LowestPointsOffset;
TArray<FString> StringData;
TArray<FProcessedAnimData> AnimData;
int CurrentEntryIndex;
......@@ -142,6 +139,12 @@ public:
UPROPERTY(EditAnywhere, meta = (DisplayName = "Gesture Hold Scale Excess Time", Category = "MotionCapture"))
float GestureHoldExcessTime = 0.f;
UPROPERTY(EditAnywhere, meta = (DisplayName = "Nr of Leg Smoothing Iterations", Category = "MotionCapture"))
int LegSmoothTimes = 5;
UPROPERTY(EditAnywhere, meta = (DisplayName = "Leg Smoothing Neighbor Window", Category = "MotionCapture"))
int LegSmoothWindow = 3;
UPROPERTY(EditAnywhere, meta = (DisplayName = "Additional Post Processing Offsets", Category = "MotionCapture"))
FAdditionalOffsets AdditionalOffsets;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment