Skip to content

Commit 062c584

Browse files
committed
Use FOV instead of angle difference check
1 parent 55fb04d commit 062c584

2 files changed

Lines changed: 33 additions & 11 deletions

File tree

PSMSVirtualDeviceManager/Classes/Tools/ClassMathUtils.vb

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,26 +153,36 @@ Public Class ClassMathUtils
153153
End Function
154154

155155
Public Shared Function CalculateAngleDegreesDifference(q1 As Quaternion, q2 As Quaternion) As Single
156-
' Convert both quaternions to unit quaternions
157156
q1 = Quaternion.Normalize(q1)
158157
q2 = Quaternion.Normalize(q2)
159158

160-
' Compute the dot product between the two quaternions
161159
Dim dotProduct = q1.W * q2.W + q1.X * q2.X + q1.Y * q2.Y + q1.Z * q2.Z
162-
163-
' Ensure the dot product is within [-1, 1] to avoid floating point errors
164160
dotProduct = CSng(Math.Min(Math.Max(dotProduct, -1.0), 1.0))
165161

166-
' Calculate the angle in radians (twice the angle because quaternions double-cover the rotation space)
167162
Dim angleRad = 2.0 * Math.Acos(Math.Abs(dotProduct))
168-
169-
' Convert to degrees
170163
Dim angleDeg = angleRad * (180.0 / Math.PI)
171164

172-
' Return the smallest angle (0-180 degrees)
173165
Return CSng(Math.Min(angleDeg, 360.0 - angleDeg))
174166
End Function
175167

168+
Public Shared Function CalculateAngleDegreesDifferenceFov(p1 As Vector3, q1 As Quaternion, p2 As Vector3, q2 As Quaternion) As Single
169+
q1 = Quaternion.Normalize(q1)
170+
q2 = Quaternion.Normalize(q2)
171+
172+
Dim directionToTarget As Vector3 = p2 - p1
173+
If (directionToTarget.Length < Single.Epsilon) Then
174+
Return 0.0F
175+
End If
176+
177+
Dim forward = RotateVector(q1, Vector3.UnitZ)
178+
179+
directionToTarget = Vector3.Normalize(directionToTarget)
180+
181+
Dim angle As Single = CSng(Math.Acos(Vector3.Dot(forward, directionToTarget)) * (180.0F / Math.PI))
182+
183+
Return angle
184+
End Function
185+
176186
Public Shared Function QuaternionFromAngularVelocity(angularVelocity As Vector3, dt As Double) As Quaternion
177187
If angularVelocity.Length() < Single.Epsilon Then
178188
Return Quaternion.Identity

PSMSVirtualDeviceManager/StartPage/TroubleshootIssueTracker/ClassLogManageServiceDevices.vb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,11 @@ Public Class ClassLogManageServiceDevices
911911
Single.Parse(mDeviceConfig.GetValue("pose\orientation", "z", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture),
912912
Single.Parse(mDeviceConfig.GetValue("pose\orientation", "w", "1.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture)
913913
)
914+
Dim mTrackerPosition As New Vector3(
915+
Single.Parse(mDeviceConfig.GetValue("pose\position", "x", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture),
916+
Single.Parse(mDeviceConfig.GetValue("pose\position", "y", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture),
917+
Single.Parse(mDeviceConfig.GetValue("pose\position", "z", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture)
918+
)
914919

915920
For Each mDeviceOther In GetDevices()
916921
If (mDeviceOther.iId < 0) Then
@@ -944,11 +949,18 @@ Public Class ClassLogManageServiceDevices
944949
Single.Parse(mDeviceOtherConfig.GetValue("pose\orientation", "z", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture),
945950
Single.Parse(mDeviceOtherConfig.GetValue("pose\orientation", "w", "1.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture)
946951
)
952+
Dim mOtherTrackerPosition As New Vector3(
953+
Single.Parse(mDeviceOtherConfig.GetValue("pose\position", "x", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture),
954+
Single.Parse(mDeviceOtherConfig.GetValue("pose\position", "y", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture),
955+
Single.Parse(mDeviceOtherConfig.GetValue("pose\position", "z", "0.0"), Globalization.NumberStyles.Float, Globalization.CultureInfo.InvariantCulture)
956+
)
957+
958+
Dim fAngleDiff1 As Single = ClassMathUtils.CalculateAngleDegreesDifferenceFov(mTrackerPosition, mTrackerOrientation, mOtherTrackerPosition, mOtherTrackerOrientation)
959+
Dim fAngleDiff2 As Single = ClassMathUtils.CalculateAngleDegreesDifferenceFov(mOtherTrackerPosition, mOtherTrackerOrientation, mTrackerPosition, mTrackerOrientation)
947960

948-
Dim fAngleDiff As Single = ClassMathUtils.CalculateAngleDegreesDifference(mTrackerOrientation, mOtherTrackerOrientation)
949-
If (fAngleDiff > 180.0F - iAngleLimit) Then
961+
If (Math.Abs(fAngleDiff1) < iAngleLimit AndAlso Math.Abs(fAngleDiff2) < iAngleLimit) Then
950962
Dim mIssue As New STRUC_LOG_ISSUE(mTemplate)
951-
mIssue.sDescription = String.Format(mIssue.sDescription, mDevice.iId, mDeviceOther.iId, CInt(Math.Abs(fAngleDiff - 180.0F)))
963+
mIssue.sDescription = String.Format(mIssue.sDescription, mDevice.iId, mDeviceOther.iId, CInt((Math.Abs(fAngleDiff1) + Math.Abs(fAngleDiff2)) / 2))
952964
mIssues.Add(mIssue)
953965
End If
954966
Next

0 commit comments

Comments
 (0)