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
+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]);