Cleaned up and commented version.
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
Reference in New Issue
Block a user