mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Add magnetic field vector (#1416)
This commit is contained in:
@@ -28,12 +28,20 @@ export function TrackerModel({ model }: { model: string }) {
|
||||
function SceneRenderer({
|
||||
quat,
|
||||
vec,
|
||||
mag,
|
||||
model,
|
||||
}: {
|
||||
quat: QuatObject;
|
||||
vec: Vector3Object;
|
||||
mag: Vector3Object;
|
||||
model: string;
|
||||
}) {
|
||||
const magDir = new Vector3(mag.x, mag.y, mag.z);
|
||||
const magLen = magDir.length();
|
||||
const magMag = Math.sqrt(magLen / 100); // normalize magnituge
|
||||
if (magLen > 0)
|
||||
magDir.multiplyScalar(1/ magLen);
|
||||
|
||||
return (
|
||||
<Canvas
|
||||
className="container"
|
||||
@@ -61,6 +69,14 @@ function SceneRenderer({
|
||||
Math.sqrt(Vector3FromVec3fT(vec).length()) * 2,
|
||||
]}
|
||||
/>
|
||||
<arrowHelper
|
||||
args={[
|
||||
magDir,
|
||||
magDir.clone().multiplyScalar(-magMag),
|
||||
2 * magMag,
|
||||
THREE.Color.NAMES.aqua,
|
||||
]}
|
||||
/>
|
||||
|
||||
<mesh position={[0, -3, 0]} rotation={[-Math.PI / 2, 0, 0]}>
|
||||
<planeGeometry args={[50, 50, 10, 10]} />
|
||||
@@ -102,6 +118,9 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
|
||||
tracker?.linearAcceleration ||
|
||||
tracker?.rawAcceleration ||
|
||||
new THREE.Vector3();
|
||||
const mag =
|
||||
tracker?.rawMagneticVector ||
|
||||
new THREE.Vector3();
|
||||
|
||||
return (
|
||||
<div className="bg-background-70 flex flex-col p-3 rounded-lg gap-2">
|
||||
@@ -143,6 +162,17 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{tracker.rawMagneticVector && (
|
||||
<div className="flex justify-between">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString('tracker-infos-magnetometer')}
|
||||
</Typography>
|
||||
<Typography>
|
||||
{formatVector3(tracker.rawMagneticVector, 1)}
|
||||
</Typography>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!enabled && (
|
||||
<Button
|
||||
variant="secondary"
|
||||
@@ -175,6 +205,7 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
|
||||
<SceneRenderer
|
||||
quat={{ ...quat }}
|
||||
vec={{ ...vec }}
|
||||
mag={{ ...mag }}
|
||||
model={
|
||||
isExtension ? '/models/extension.gltf' : '/models/tracker.gltf'
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ export function useDataFeedConfig() {
|
||||
trackerData.rotationReferenceAdjusted = true;
|
||||
trackerData.rotationIdentityAdjusted = true;
|
||||
trackerData.tps = true;
|
||||
trackerData.rawMagneticVector = true;
|
||||
|
||||
const dataMask = new DeviceDataMaskT();
|
||||
dataMask.deviceData = true;
|
||||
|
||||
@@ -3,6 +3,7 @@ package dev.slimevr.protocol.datafeed;
|
||||
import com.google.flatbuffers.FlatBufferBuilder;
|
||||
import dev.slimevr.tracking.trackers.Device;
|
||||
import dev.slimevr.tracking.trackers.Tracker;
|
||||
import dev.slimevr.tracking.trackers.udp.MagnetometerStatus;
|
||||
import dev.slimevr.tracking.trackers.udp.UDPDevice;
|
||||
import io.github.axisangles.ktmath.Quaternion;
|
||||
import io.github.axisangles.ktmath.Vector3;
|
||||
@@ -80,6 +81,16 @@ public class DataFeedBuilder {
|
||||
return TrackerId.endTrackerId(fbb);
|
||||
}
|
||||
|
||||
public static int createVec3(FlatBufferBuilder fbb, Vector3 vec) {
|
||||
return Vec3f
|
||||
.createVec3f(
|
||||
fbb,
|
||||
vec.getX(),
|
||||
vec.getY(),
|
||||
vec.getZ()
|
||||
);
|
||||
}
|
||||
|
||||
public static int createQuat(FlatBufferBuilder fbb, Quaternion quaternion) {
|
||||
return Quat
|
||||
.createQuat(
|
||||
@@ -146,14 +157,7 @@ public class DataFeedBuilder {
|
||||
}
|
||||
|
||||
public static int createTrackerPosition(FlatBufferBuilder fbb, Tracker tracker) {
|
||||
Vector3 pos = tracker.getPosition();
|
||||
return Vec3f
|
||||
.createVec3f(
|
||||
fbb,
|
||||
pos.getX(),
|
||||
pos.getY(),
|
||||
pos.getZ()
|
||||
);
|
||||
return createVec3(fbb, tracker.getPosition());
|
||||
}
|
||||
|
||||
public static int createTrackerRotation(FlatBufferBuilder fbb, Tracker tracker) {
|
||||
@@ -161,14 +165,11 @@ public class DataFeedBuilder {
|
||||
}
|
||||
|
||||
public static int createTrackerAcceleration(FlatBufferBuilder fbb, Tracker tracker) {
|
||||
Vector3 accel = tracker.getAcceleration();
|
||||
return Vec3f
|
||||
.createVec3f(
|
||||
fbb,
|
||||
accel.getX(),
|
||||
accel.getY(),
|
||||
accel.getZ()
|
||||
);
|
||||
return createVec3(fbb, tracker.getAcceleration());
|
||||
}
|
||||
|
||||
public static int createTrackerMagneticVector(FlatBufferBuilder fbb, Tracker tracker) {
|
||||
return createVec3(fbb, tracker.getMagVector());
|
||||
}
|
||||
|
||||
public static int createTrackerTemperature(FlatBufferBuilder fbb, Tracker tracker) {
|
||||
@@ -233,6 +234,9 @@ public class DataFeedBuilder {
|
||||
if (mask.getTps()) {
|
||||
TrackerData.addTps(fbb, (int) tracker.getTps());
|
||||
}
|
||||
if (mask.getRawMagneticVector() && tracker.getMagStatus() == MagnetometerStatus.ENABLED) {
|
||||
TrackerData.addRawMagneticVector(fbb, createTrackerMagneticVector(fbb, tracker));
|
||||
}
|
||||
|
||||
return TrackerData.endTrackerData(fbb);
|
||||
}
|
||||
|
||||
@@ -92,6 +92,7 @@ class Tracker @JvmOverloads constructor(
|
||||
private var timeAtLastUpdate: Long = System.currentTimeMillis()
|
||||
private var _rotation = Quaternion.IDENTITY
|
||||
private var _acceleration = Vector3.NULL
|
||||
private var _magVector = Vector3.NULL
|
||||
var position = Vector3.NULL
|
||||
val resetsHandler: TrackerResetsHandler = TrackerResetsHandler(this)
|
||||
val filteringHandler: TrackerFilteringHandler = TrackerFilteringHandler()
|
||||
@@ -424,6 +425,22 @@ class Tracker @JvmOverloads constructor(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the magnetic field vector, in mGauss.
|
||||
*/
|
||||
fun getMagVector() = if (needsReset) {
|
||||
resetsHandler.getReferenceAdjustedAccel(_rotation, _magVector)
|
||||
} else {
|
||||
_magVector
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the magnetic field vector.
|
||||
*/
|
||||
fun setMagVector(vec: Vector3) {
|
||||
this._magVector = vec
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current TPS of the tracker
|
||||
*/
|
||||
|
||||
Submodule solarxr-protocol updated: 3e87ab0a33...7aa68a1b42
Reference in New Issue
Block a user