Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reinstantiate QuaternionMovingAverage on reset #1283

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class QuaternionMovingAverage(
private var rotBuffer: CircularArrayList<Quaternion>? = null
private var latestQuaternion = IDENTITY
private var smoothingQuaternion = IDENTITY
private var temporalQuaternion = IDENTITY
private val fpsTimer = if (VRServer.instanceInitialized) VRServer.instance.fpsTimer else NanoTimer()
private var frameCounter = 0
private var lastAmt = 0f
Expand All @@ -50,7 +51,11 @@ class QuaternionMovingAverage(
predictFactor = PREDICT_MULTIPLIER * amount + PREDICT_MIN
rotBuffer = CircularArrayList(PREDICT_BUFFER)
}
resetQuats(initialRotation)

filteredQuaternion = initialRotation
latestQuaternion = initialRotation
smoothingQuaternion = initialRotation
temporalQuaternion = initialRotation
}

// Runs at up to 1000hz. We use a timer to make it framerate-independent
Expand Down Expand Up @@ -92,7 +97,7 @@ class QuaternionMovingAverage(
filteredQuaternion = smoothingQuaternion.interpR(latestQuaternion, amt)
} else {
// No filtering; just keep track of rotations (for going over 180 degrees)
filteredQuaternion = latestQuaternion.twinNearest(smoothingQuaternion)
filteredQuaternion = latestQuaternion.twinNearest(temporalQuaternion)
}

filteringImpact = latestQuaternion.angleToR(filteredQuaternion)
Expand All @@ -112,18 +117,9 @@ class QuaternionMovingAverage(
lastAmt = 0f
smoothingQuaternion = filteredQuaternion
} else {
smoothingQuaternion = filteredQuaternion
temporalQuaternion = filteredQuaternion
}

latestQuaternion = q
}

fun resetQuats(q: Quaternion) {
if (type == TrackerFilters.PREDICTION) {
rotBuffer?.clear()
latestQuaternion = q
}
filteredQuaternion = q
addQuaternion(q)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import io.github.axisangles.ktmath.Quaternion
class TrackerFilteringHandler {
// Instantiated by default in case config doesn't get read (if tracker doesn't support filtering)
private var movingAverage = QuaternionMovingAverage(TrackerFilters.NONE)
var filteringEnabled = false
private var filteringEnabled = false

/**
* Reads/loads filtering settings from given config
Expand All @@ -28,7 +28,7 @@ class TrackerFilteringHandler {
)
filteringEnabled = true
} else {
movingAverage = QuaternionMovingAverage(TrackerFilters.NONE)
movingAverage = QuaternionMovingAverage(TrackerFilters.NONE, initialRotation = currentRawRotation)
filteringEnabled = false
}
}
Expand All @@ -51,7 +51,7 @@ class TrackerFilteringHandler {
* Call when doing a full reset to reset the tracking of rotations >180 degrees
*/
fun resetMovingAverage(currentRawRotation: Quaternion) {
movingAverage.resetQuats(currentRawRotation)
movingAverage = QuaternionMovingAverage(movingAverage.type, movingAverage.amount, currentRawRotation)
}

/**
Expand Down