mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Use bones for AutoBone error calculation (#1312)
This commit is contained in:
@@ -2,9 +2,9 @@ package dev.slimevr.autobone.errors
|
||||
|
||||
import dev.slimevr.autobone.AutoBoneStep
|
||||
import dev.slimevr.autobone.PoseFrameStep
|
||||
import dev.slimevr.tracking.processor.BoneType
|
||||
import dev.slimevr.tracking.processor.skeleton.HumanSkeleton
|
||||
import dev.slimevr.tracking.trackers.Tracker
|
||||
import dev.slimevr.tracking.trackers.TrackerRole
|
||||
import io.github.axisangles.ktmath.Vector3
|
||||
import kotlin.math.*
|
||||
|
||||
// The offset between the height both feet at one instant and over time
|
||||
@@ -16,32 +16,31 @@ class FootHeightOffsetError : IAutoBoneError {
|
||||
)
|
||||
|
||||
companion object {
|
||||
fun getSlideError(skeleton1: HumanSkeleton, skeleton2: HumanSkeleton): Float {
|
||||
val leftTracker1: Tracker = skeleton1.getComputedTracker(TrackerRole.LEFT_FOOT)
|
||||
val rightTracker1: Tracker = skeleton1.getComputedTracker(TrackerRole.RIGHT_FOOT)
|
||||
val leftTracker2: Tracker = skeleton2.getComputedTracker(TrackerRole.LEFT_FOOT)
|
||||
val rightTracker2: Tracker = skeleton2.getComputedTracker(TrackerRole.RIGHT_FOOT)
|
||||
return getFootHeightError(leftTracker1, rightTracker1, leftTracker2, rightTracker2)
|
||||
}
|
||||
fun getSlideError(skeleton1: HumanSkeleton, skeleton2: HumanSkeleton): Float = getFootHeightError(
|
||||
skeleton1.getBone(BoneType.LEFT_LOWER_LEG).getTailPosition(),
|
||||
skeleton1.getBone(BoneType.RIGHT_LOWER_LEG).getTailPosition(),
|
||||
skeleton2.getBone(BoneType.LEFT_LOWER_LEG).getTailPosition(),
|
||||
skeleton2.getBone(BoneType.RIGHT_LOWER_LEG).getTailPosition(),
|
||||
)
|
||||
|
||||
fun getFootHeightError(
|
||||
leftTracker1: Tracker,
|
||||
rightTracker1: Tracker,
|
||||
leftTracker2: Tracker,
|
||||
rightTracker2: Tracker,
|
||||
leftFoot1: Vector3,
|
||||
rightFoot1: Vector3,
|
||||
leftFoot2: Vector3,
|
||||
rightFoot2: Vector3,
|
||||
): Float {
|
||||
val leftFoot1 = leftTracker1.position.y
|
||||
val rightFoot1 = rightTracker1.position.y
|
||||
val leftFoot2 = leftTracker2.position.y
|
||||
val rightFoot2 = rightTracker2.position.y
|
||||
val lFoot1Y = leftFoot1.y
|
||||
val rFoot1Y = rightFoot1.y
|
||||
val lFoot2Y = leftFoot2.y
|
||||
val rFoot2Y = rightFoot2.y
|
||||
|
||||
// Compute all combinations of heights
|
||||
val dist1 = abs(leftFoot1 - rightFoot1)
|
||||
val dist2 = abs(leftFoot1 - leftFoot2)
|
||||
val dist3 = abs(leftFoot1 - rightFoot2)
|
||||
val dist4 = abs(rightFoot1 - leftFoot2)
|
||||
val dist5 = abs(rightFoot1 - rightFoot2)
|
||||
val dist6 = abs(leftFoot2 - rightFoot2)
|
||||
val dist1 = abs(lFoot1Y - rFoot1Y)
|
||||
val dist2 = abs(lFoot1Y - lFoot2Y)
|
||||
val dist3 = abs(lFoot1Y - rFoot2Y)
|
||||
val dist4 = abs(rFoot1Y - lFoot2Y)
|
||||
val dist5 = abs(rFoot1Y - rFoot2Y)
|
||||
val dist6 = abs(lFoot2Y - rFoot2Y)
|
||||
|
||||
// Divide by 12 (6 values * 2 to halve) to halve and average, it's
|
||||
// halved because you want to approach a midpoint, not the other point
|
||||
|
||||
@@ -2,9 +2,9 @@ package dev.slimevr.autobone.errors
|
||||
|
||||
import dev.slimevr.autobone.AutoBoneStep
|
||||
import dev.slimevr.autobone.PoseFrameStep
|
||||
import dev.slimevr.tracking.processor.BoneType
|
||||
import dev.slimevr.tracking.processor.skeleton.HumanSkeleton
|
||||
import dev.slimevr.tracking.trackers.Tracker
|
||||
import dev.slimevr.tracking.trackers.TrackerRole
|
||||
import io.github.axisangles.ktmath.Vector3
|
||||
import kotlin.math.*
|
||||
|
||||
// The change in distance between both of the ankles over time
|
||||
@@ -16,24 +16,19 @@ class OffsetSlideError : IAutoBoneError {
|
||||
)
|
||||
|
||||
companion object {
|
||||
fun getSlideError(skeleton1: HumanSkeleton, skeleton2: HumanSkeleton): Float {
|
||||
val leftTracker1: Tracker = skeleton1.getComputedTracker(TrackerRole.LEFT_FOOT)
|
||||
val rightTracker1: Tracker = skeleton1.getComputedTracker(TrackerRole.RIGHT_FOOT)
|
||||
val leftTracker2: Tracker = skeleton2.getComputedTracker(TrackerRole.LEFT_FOOT)
|
||||
val rightTracker2: Tracker = skeleton2.getComputedTracker(TrackerRole.RIGHT_FOOT)
|
||||
return getSlideError(leftTracker1, rightTracker1, leftTracker2, rightTracker2)
|
||||
}
|
||||
fun getSlideError(skeleton1: HumanSkeleton, skeleton2: HumanSkeleton): Float = getSlideError(
|
||||
skeleton1.getBone(BoneType.LEFT_LOWER_LEG).getTailPosition(),
|
||||
skeleton1.getBone(BoneType.RIGHT_LOWER_LEG).getTailPosition(),
|
||||
skeleton2.getBone(BoneType.LEFT_LOWER_LEG).getTailPosition(),
|
||||
skeleton2.getBone(BoneType.RIGHT_LOWER_LEG).getTailPosition(),
|
||||
)
|
||||
|
||||
fun getSlideError(
|
||||
leftTracker1: Tracker,
|
||||
rightTracker1: Tracker,
|
||||
leftTracker2: Tracker,
|
||||
rightTracker2: Tracker,
|
||||
leftFoot1: Vector3,
|
||||
rightFoot1: Vector3,
|
||||
leftFoot2: Vector3,
|
||||
rightFoot2: Vector3,
|
||||
): Float {
|
||||
val leftFoot1 = leftTracker1.position
|
||||
val rightFoot1 = rightTracker1.position
|
||||
val leftFoot2 = leftTracker2.position
|
||||
val rightFoot2 = rightTracker2.position
|
||||
val slideDist1 = (rightFoot1 - leftFoot1).len()
|
||||
val slideDist2 = (rightFoot2 - leftFoot2).len()
|
||||
val slideDist3 = (rightFoot2 - leftFoot1).len()
|
||||
|
||||
@@ -2,9 +2,9 @@ package dev.slimevr.autobone.errors
|
||||
|
||||
import dev.slimevr.autobone.AutoBoneStep
|
||||
import dev.slimevr.autobone.PoseFrameStep
|
||||
import dev.slimevr.tracking.processor.Bone
|
||||
import dev.slimevr.tracking.processor.BoneType
|
||||
import dev.slimevr.tracking.processor.skeleton.HumanSkeleton
|
||||
import dev.slimevr.tracking.trackers.Tracker
|
||||
import dev.slimevr.tracking.trackers.TrackerRole
|
||||
|
||||
// The change in position of the ankle over time
|
||||
class SlideError : IAutoBoneError {
|
||||
@@ -18,26 +18,26 @@ class SlideError : IAutoBoneError {
|
||||
fun getSlideError(skeleton1: HumanSkeleton, skeleton2: HumanSkeleton): Float {
|
||||
// Calculate and average between both feet
|
||||
return (
|
||||
getSlideError(skeleton1, skeleton2, TrackerRole.LEFT_FOOT) +
|
||||
getSlideError(skeleton1, skeleton2, TrackerRole.RIGHT_FOOT)
|
||||
getSlideError(skeleton1, skeleton2, BoneType.LEFT_LOWER_LEG) +
|
||||
getSlideError(skeleton1, skeleton2, BoneType.RIGHT_LOWER_LEG)
|
||||
) / 2f
|
||||
}
|
||||
|
||||
fun getSlideError(
|
||||
skeleton1: HumanSkeleton,
|
||||
skeleton2: HumanSkeleton,
|
||||
trackerRole: TrackerRole,
|
||||
bone: BoneType,
|
||||
): Float {
|
||||
// Calculate and average between both feet
|
||||
return getSlideError(
|
||||
skeleton1.getComputedTracker(trackerRole),
|
||||
skeleton2.getComputedTracker(trackerRole),
|
||||
skeleton1.getBone(bone),
|
||||
skeleton2.getBone(bone),
|
||||
)
|
||||
}
|
||||
|
||||
fun getSlideError(tracker1: Tracker, tracker2: Tracker): Float {
|
||||
fun getSlideError(bone1: Bone, bone2: Bone): Float {
|
||||
// Return the midpoint distance
|
||||
return (tracker2.position - tracker1.position).len() / 2f
|
||||
return (bone2.getTailPosition() - bone1.getTailPosition()).len() / 2f
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user