Cleaned up and commented version.

This commit is contained in:
Thorbjoern
2025-10-02 00:07:11 +02:00
parent 2b86d9f0a2
commit 4c613c3436
66 changed files with 260 additions and 1020 deletions
@@ -3,6 +3,8 @@ using GhostSystem;
using NUnit.Framework;
using UnityEngine;
// Dieses Script übernimmt die eigentliche Auswertung des Eyetrackings per Raycast.
public class EyeTrackingCollisionPoints : MonoBehaviour
{
[SerializeField]
@@ -25,13 +27,14 @@ public class EyeTrackingCollisionPoints : MonoBehaviour
Vector3 rayCastDirection = transform.TransformDirection(Vector3.forward) * rayDistance;
if ( hitPoint != null && Physics.Raycast(transform.position, rayCastDirection, out hit, rayDistance, gazableLayers))
if ( hitPoint != null && Physics.Raycast(transform.position, rayCastDirection, out hit, rayDistance, gazableLayers)) // Sendet einen Raycast in Blickrichtung aus.
{
hitPoint.transform.position = new Vector3(hit.point.x, hit.point.y, hit.point.z);
if (heatIsActive)
hitPoint.transform.position = new Vector3(hit.point.x, hit.point.y, hit.point.z); // Wenn ein Objekt mit der passenden Layer Mask getroffen wurde, wird der Gazepoint
// in der Visualisierung auf die entsprechende Kollisionsposition gesetzt.
if (heatIsActive) // Ist die Heat-Visualisierung (rote Färbung der Target-Objekte) aktiviert,
{
FindVisibleTargets(hitPoint.transform.position);
}
FindVisibleTargets(hitPoint.transform.position); // wird noch einmal mit einem Radius von 20 cm im Umfeld des Hitpoints nach
} // Objekten gesucht, die gefärbt werden können.
}
}
@@ -50,7 +53,7 @@ public class EyeTrackingCollisionPoints : MonoBehaviour
GameObject hitObject = col.gameObject;
if (hitObject.GetComponent<RecieveHeat>() != null)
{
hitObject.GetComponent<RecieveHeat>().AddHeat(0.02f);
hitObject.GetComponent<RecieveHeat>().AddHeat(0.02f); // Jedes Mal, wenn ein passendes Objekt getroffen wird, wird desen Heat-Wert um 0,02 erhöht.
}
else
{
+14 -12
View File
@@ -1,6 +1,8 @@
using System.Collections.Generic;
using UnityEngine;
// Dieses Script ist für die Darstellung des fovealen und peripheren Sichtfelds im Replay zuständig.
public class FieldOfView : MonoBehaviour
{
public float viewRadius;
@@ -27,7 +29,7 @@ public class FieldOfView : MonoBehaviour
private Mesh periMesh;
private Mesh foveaMesh;
private void Start()
private void Start() // zum Start werden zwei neune Meshes generiert, um die Sichtfelder darstellen zu können.
{
periMesh = new Mesh();
periMesh.name = "View Mesh";
@@ -40,11 +42,11 @@ public class FieldOfView : MonoBehaviour
private void LateUpdate()
{
Vector3 gazeDirection = ((eyeLeft.forward + eyeRight.forward) * 0.5f).normalized;
Vector3 gazeDirection = ((eyeLeft.forward + eyeRight.forward) * 0.5f).normalized; // In jedem Frame wird zuerst die gemeinsame Blickrichtung der beiden Augen ermittelt.
eyeCenter.rotation = Quaternion.LookRotation(gazeDirection);
float gazeAngle = AngleFromDir(gazeDirection, true);
DrawFOV(transform.eulerAngles.y, periMesh, periAngle);
DrawFOV(gazeAngle, foveaMesh, foveaAngle);
DrawFOV(transform.eulerAngles.y, periMesh, periAngle); // Das Mesh für das periphere Sichtfeld wird im angegebenen Winkel um die Vorwärts-Achse generiert.
DrawFOV(gazeAngle, foveaMesh, foveaAngle); // Das Mesh für das foveale Sichtfeld wird im angegebenen Winkel um die Sichtlinie herum generiert.
}
public Vector3 DirFromAngle(float angleDeg, bool angleIsGlobal)
@@ -76,9 +78,9 @@ public class FieldOfView : MonoBehaviour
return (angleDeg + 360f) % 360f;
}
void DrawFOV(float startAngle, Mesh viewMesh, float viewAngle)
void DrawFOV(float startAngle, Mesh viewMesh, float viewAngle) // Die Funktion, die das eigentliche 3D-Objekt/Mesh generiert.
{
int stepCount = Mathf.RoundToInt(viewAngle * meshResolution);
int stepCount = Mathf.RoundToInt(viewAngle * meshResolution); // Es werden mit der angegebenen Auflösung Winkel für die Unterteilungen des Sichtfelds bestimmt.
float stepAngleSize = viewAngle / stepCount;
List<Vector3> viewPoints = new List<Vector3>();
ViewCastInfo oldViewCast = new ViewCastInfo();
@@ -87,12 +89,12 @@ public class FieldOfView : MonoBehaviour
{
float angle = startAngle - viewAngle / 2 + stepAngleSize * i;
Debug.DrawLine(transform.position, transform.position + DirFromAngle(angle, true) * viewRadius, Color.red);
Debug.DrawLine(transform.position, transform.position + DirFromAngle(angle, true) * viewRadius, Color.red); // diese werden zu Debug-Zwecken im Viewport visualisiert.
ViewCastInfo newViewCast = ViewCast(angle);
ViewCastInfo newViewCast = ViewCast(angle); // Nun werden auf diesen Positionen Raycasts ausgesand und geguckt, ob diese ein Hindernis treffen.
if (i > 0)
{
if (i > 0) // Trifft ein Strahl ein Objekt und der nächste nicht, wird der Abstand zum nächsten Strakhl so lange halbiert, bis beide das Objekt treffen.
{ // So kann das Mesh des Sichtfelds so gebaut werden, dass die durch hindernisse nicht sichtbaren Bereiche genau ausgeschnitten werden.
bool edgeDistThresholdExeeded = Mathf.Abs(oldViewCast.distance - newViewCast.distance) > edgeDistanceThreshold;
if (oldViewCast.didHit != newViewCast.didHit || (oldViewCast.didHit && newViewCast.didHit && edgeDistThresholdExeeded))
{
@@ -113,11 +115,11 @@ public class FieldOfView : MonoBehaviour
int vertexcount = viewPoints.Count + 1;
Vector3[] vertices = new Vector3[vertexcount];
int[] triangles = new int[(vertexcount-2) * 3];
int[] triangles = new int[(vertexcount-2) * 3];
vertices[0] = Vector3.zero;
for (int i = 0; i < vertexcount-1; i++)
for (int i = 0; i < vertexcount-1; i++) // Schließlich werden zwischen allen Punkten Dreiecke aufgespannt, sodass ein Mesh/3D-Objekt entsteht.
{
vertices[i+1] = transform.InverseTransformPoint(viewPoints[i]);
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 65730a9e8bad9b840bc940e9491e98b4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: