Kapitel 6.4: Kamerasystem
Einführung
DayZ verwendet ein mehrschichtiges Kamerasystem. Die Spielerkamera wird von der Engine über DayZPlayerCamera-Unterklassen verwaltet. Zum Modding und Debuggen ermöglicht die FreeDebugCamera freien Flug. Die Engine stellt außerdem globale Zugriffsmethoden für den aktuellen Kamerazustand bereit. Dieses Kapitel behandelt Kameratypen, den Zugriff auf Kameradaten und die Verwendung der geskripteten Kamerawerkzeuge.
Aktueller Kamerazustand (Globale Zugriffsmethoden)
Diese Methoden sind überall verfügbar und geben den Zustand der aktiven Kamera zurück, unabhängig vom Kameratyp:
// Aktuelle Kamera-Weltposition
proto native vector GetGame().GetCurrentCameraPosition();
// Aktuelle Kamera-Blickrichtung (Einheitsvektor)
proto native vector GetGame().GetCurrentCameraDirection();
// Weltposition in Bildschirmkoordinaten umrechnen
proto native vector GetGame().GetScreenPos(vector world_pos);
// Rückgabe: x = Bildschirm X (Pixel), y = Bildschirm Y (Pixel), z = Tiefe (Entfernung zur Kamera)Beispiel --- prüfen ob eine Position auf dem Bildschirm ist:
bool IsPositionOnScreen(vector worldPos)
{
vector screenPos = GetGame().GetScreenPos(worldPos);
// z < 0 bedeutet hinter der Kamera
if (screenPos[2] < 0)
return false;
int screenW, screenH;
GetScreenSize(screenW, screenH);
return (screenPos[0] >= 0 && screenPos[0] <= screenW &&
screenPos[1] >= 0 && screenPos[1] <= screenH);
}Beispiel --- Entfernung von der Kamera zu einem Punkt ermitteln:
float DistanceFromCamera(vector worldPos)
{
return vector.Distance(GetGame().GetCurrentCameraPosition(), worldPos);
}DayZPlayerCamera-System
DayZ-Spielerkameras sind native Klassen, die vom Player-Controller der Engine verwaltet werden. Sie werden nicht direkt aus dem Script instanziiert --- stattdessen wählt die Engine die passende Kamera basierend auf dem Spielerzustand aus (stehend, liegend, schwimmend, Fahrzeug, bewusstlos usw.).
Kameratypen (DayZPlayerCameras-Konstanten)
Die Kameratyp-IDs sind als Konstanten definiert:
| Konstante | Beschreibung |
|---|---|
DayZPlayerCameras.DAYZCAMERA_1ST | Erste-Person-Kamera |
DayZPlayerCameras.DAYZCAMERA_3RD_ERC | Dritte-Person aufrecht (stehend) |
DayZPlayerCameras.DAYZCAMERA_3RD_CRO | Dritte-Person geduckt |
DayZPlayerCameras.DAYZCAMERA_3RD_PRO | Dritte-Person liegend |
DayZPlayerCameras.DAYZCAMERA_3RD_ERC_SPR | Dritte-Person Sprint |
DayZPlayerCameras.DAYZCAMERA_3RD_ERC_RAISED | Dritte-Person Waffe erhoben |
DayZPlayerCameras.DAYZCAMERA_3RD_CRO_RAISED | Dritte-Person geduckt Waffe erhoben |
DayZPlayerCameras.DAYZCAMERA_IRONSIGHTS | Kimme-und-Korn-Zielen |
DayZPlayerCameras.DAYZCAMERA_OPTICS | Optik-/Zielfernrohr-Zielen |
DayZPlayerCameras.DAYZCAMERA_3RD_VEHICLE | Dritte-Person Fahrzeug |
DayZPlayerCameras.DAYZCAMERA_1ST_VEHICLE | Erste-Person Fahrzeug |
DayZPlayerCameras.DAYZCAMERA_1ST_UNCONSCIOUS | Erste-Person Bewusstlos |
DayZPlayerCameras.DAYZCAMERA_3RD_CLIMB | Dritte-Person Klettern |
DayZPlayerCameras.DAYZCAMERA_3RD_JUMP | Dritte-Person Springen |
Aktuellen Kameratyp abfragen
DayZPlayer player = GetGame().GetPlayer();
if (player)
{
DayZPlayerCamera cam = player.GetCurrentCamera();
if (cam && cam.GetCameraName() == "DayZPlayerCamera1stPerson")
{
Print("Spieler ist in der Ersten Person");
}
}FreeDebugCamera
Datei: 3_Game/entities/camera.c
Die Freiflugkamera wird für Debugging und Filmaufnahmen verwendet. Verfügbar in Diagnose-Builds oder wenn sie durch Mods aktiviert wird.
Zugriff auf die Instanz
static proto native FreeDebugCamera GetInstance();Diese statische Methode gibt die Singleton-Freikamera-Instanz zurück (oder null, wenn sie nicht existiert). Rufen Sie sie als FreeDebugCamera.GetInstance() auf.
Wichtige Methoden
// Freikamera aktivieren/deaktivieren (von Camera geerbt)
proto native void SetActive(bool active);
proto native bool IsActive();
// Position und Ausrichtung
vector GetPosition();
void SetPosition(vector pos);
vector GetOrientation();
void SetOrientation(vector ori); // Gier, Neigung, Rolle
// Kamerarichtung
vector GetDirection();Beispiel --- Freikamera aktivieren und teleportieren:
void ActivateDebugCamera(vector pos)
{
FreeDebugCamera cam = FreeDebugCamera.GetInstance();
if (cam)
{
cam.SetActive(true);
cam.SetPosition(pos);
cam.SetOrientation(Vector(0, -30, 0)); // Leicht nach unten schauen
}
}Sichtfeld (FOV)
Die Engine steuert das FOV nativ. Sie können es über das Spielerkamerasystem lesen und ändern:
FOV auslesen
// Aktuelles Kamera-FOV abfragen (im Bogenmaß)
float fov = Camera.GetCurrentFOV();DayZPlayerCamera FOV-Überschreibung
In benutzerdefinierten Kameraklassen, die DayZPlayerCamera erweitern, können Sie das FOV überschreiben:
class MyCustomCamera extends DayZPlayerCamera1stPerson
{
override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
{
super.OnUpdate(pDt, pOutResult);
pOutResult.m_fFovAbsolute = 0.7854; // ~45 Grad (Bogenmaß)
}
}Tiefenschärfe (DOF)
Die Tiefenschärfe wird über das Nachbearbeitungseffekte-System gesteuert (siehe Kapitel 6.5). Das Kamerasystem arbeitet jedoch über diese Mechanismen mit DOF zusammen:
DOF über CGame setzen
// OverrideDOF(enable, focusDistance, focusLength, focusLengthNear, blur, focusDepthOffset)
GetGame().OverrideDOF(true, 5.0, 100.0, 0.5, 0.3, 0.0);DOF deaktivieren
GetGame().OverrideDOF(false, 0, 0, 0, 0, 1); // Erstes Argument false deaktiviert DOFScriptCamera (GameLib)
Datei: 2_GameLib/entities/scriptcamera.c
Eine niedrigere Ebene der geskripteten Kamera-Entity aus der GameLib-Schicht. Dies ist die Basis für benutzerdefinierte Kamera-Implementierungen.
Eine Kamera erstellen
ScriptCamera camera = ScriptCamera.Cast(
GetGame().CreateObject("ScriptCamera", pos, true) // nur lokal
);Wichtige Methoden
Hinweis:
ScriptCamerawird nur unter#ifdef GAME_TEMPLATEkompiliert und ist im DayZ-Spiel-Build nicht vorhanden. Sie konfiguriert sich selbst über dieGenericEntity-Kameramethoden (SetCameraVerticalFOV,SetCameraNearPlane,SetCameraFarPlane,SetCameraType). Die folgenden Methoden gehören zur Engine-KlasseCamera(3_Game/entities/camera.c), dieFreeDebugCameraerweitert:
proto native void SetFOV(float fov); // FOV in Bogenmaß
proto native void SetNearPlane(float nearPlane); // intern auf 0.01m begrenzt
proto native float GetNearPlane();
proto native void SetFocus(float distance, float blur); // TiefenschärfeEine Kamera aktivieren
// Diese Kamera zur aktiven Rendering-Kamera machen
GetGame().SelectPlayer(null, null); // Vom Spieler lösen
GetGame().ObjectRelease(camera); // An die Engine freigebenHinweis: Das Umschalten von der Spielerkamera erfordert sorgfältige Handhabung von Eingabe und HUD. Die meisten Mods verwenden die Freiflug-Debug-Kamera oder PPE-Overlay-Effekte anstatt benutzerdefinierte Kameras zu erstellen.
Raycasting von der Kamera
Ein häufiges Muster ist es, von der Kameraposition in Kamerarichtung einen Raycast durchzuführen, um zu ermitteln, worauf der Spieler schaut:
Object GetObjectInCrosshair(float maxDistance)
{
vector from = GetGame().GetCurrentCameraPosition();
vector to = from + (GetGame().GetCurrentCameraDirection() * maxDistance);
vector contactPos;
vector contactDir;
int contactComponent;
set<Object> hitObjects = new set<Object>;
if (DayZPhysics.RaycastRV(from, to, contactPos, contactDir,
contactComponent, hitObjects, null, null,
false, false, ObjIntersectView, 0.0))
{
if (hitObjects.Count() > 0)
return hitObjects[0];
}
return null;
}Zusammenfassung
| Konzept | Kernpunkt |
|---|---|
| Globale Zugriffsmethoden | GetCurrentCameraPosition(), GetCurrentCameraDirection(), GetScreenPos() |
| Kameratypen | DayZPlayerCameras-Konstanten (1ST, 3RD_ERC, IRONSIGHTS, OPTICS, VEHICLE, usw.) |
| Aktueller Typ | player.GetCurrentCamera().GetCameraName() |
| Freie Kamera | FreeDebugCamera.GetInstance(), dann cam.SetActive(true) |
| FOV | Camera.GetCurrentFOV() zum Lesen, pOutResult.m_fFovAbsolute in OnUpdate setzen |
| DOF | GetGame().OverrideDOF(enable, focusDist, focusLen, focusLenNear, blur, offset) |
| Bildschirmumrechnung | GetScreenPos(worldPos) gibt Pixel-XY + Tiefe Z zurück |
Bewährte Praktiken
- Kameraposition zwischenspeichern, wenn sie mehrmals pro Frame abgefragt wird.
GetGame().GetCurrentCameraPosition()undGetCurrentCameraDirection()sind Engine-Aufrufe -- speichern Sie das Ergebnis in einer lokalen Variablen, wenn Sie es für mehrere Berechnungen im selben Frame benötigen. GetScreenPos()-Tiefenprüfung vor UI-Platzierung verwenden. Überprüfen Sie immerscreenPos[2] > 0(vor der Kamera), bevor Sie HUD-Markierungen an Weltpositionen zeichnen, sonst erscheinen Markierungen gespiegelt hinter dem Spieler.- Vermeiden Sie die Erstellung benutzerdefinierter ScriptCamera-Instanzen für einfache Effekte. Die FreeDebugCamera und das PPE-System decken die meisten filmischen und visuellen Anforderungen ab. Benutzerdefinierte Kameras erfordern sorgfältige Eingabe-/HUD-Verwaltung, die leicht zu Fehlern führt.
- Respektieren Sie die Kameratyp-Übergänge der Engine. Erzwingen Sie keine Kameratypwechsel aus dem Script, es sei denn, Sie verwalten den Player-Controller-Zustand vollständig. Unerwartete Kamerawechsel können die Bewegung des Spielers blockieren oder Desync verursachen.
- Freikamera-Nutzung hinter Admin-/Debug-Prüfungen absichern. Die FreeDebugCamera bietet gottähnliche Weltinspektion. Aktivieren Sie sie nur für authentifizierte Admins oder Diagnose-Builds, um Missbrauch zu verhindern.
Kompatibilität und Auswirkungen
- Multi-Mod: Kamera-Zugriffsmethoden sind schreibgeschützte Globals, sodass mehrere Mods sicher gleichzeitig den Kamerazustand lesen können. Konflikte entstehen nur, wenn zwei Mods beide versuchen, FreeDebugCamera oder benutzerdefinierte ScriptCamera-Instanzen zu aktivieren.
- Leistung:
GetScreenPos()undGetCurrentCameraPosition()sind leichtgewichtige Engine-Aufrufe. Raycasting von der Kamera (DayZPhysics.RaycastRV) ist teurer -- begrenzen Sie es auf einmal pro Frame, nicht pro Entity. - Server/Client: Der Kamerazustand existiert nur auf dem Client. Alle Kameramethoden geben auf einem dedizierten Server bedeutungslose Daten zurück. Verwenden Sie niemals Kameraabfragen in serverseitiger Logik.
<< Zurück: Wetter | Kameras | Weiter: Nachbearbeitungseffekte >>
