Dies ist eine alte Version des Dokuments!
Da in der Source-Engine eine Physik-Engine integriert ist, gibt es die Möglichkeit physikalische Simulationen innerhalb von Source darzustellen. Dies ist mithilfe der phys_* Entitys möglich. Mit ihnen kann man Bewegungen von Objekten einschränken oder erweitern oder Objekte mit anderen Objekten verknüpfen. Im Laufe dieses Artikels werden die für die Physik nötigen Entities erklärt.
Wie im reellen Leben werden Objekte mit anderen Objekte mit Hilfe von verschiedensten Gelenken und anderen Arten von Beschränkungen verknüpft. Türen zum Beispiel werden über Schaniergelenke im Türrahmen gehalten und ermöglichen nur die Drehung um eine Achse. Unser Arm ist mithilfe eines Kugelgelenks mit der Schulter verbunden, was eine Drehbewegung auf allen 3 Achsen ermöglich. Das Funktionsprinzip innerhalb der Source-Engine ist ähnlich, nur das diese Beschränkungen und Gelenke mithilfe von bestimmten Entities realisiert werden.
Das einfachste Entity, um andere Objekte zu beschränken. Dieses Enity verbindet ein Entity mit einem anderen, als wären sie mit Nägeln oder Schrauben verbunden. In den Einstellungen des phys_constraint gibt es zwei Angaben für die Entities, die verbunden werden sollen. Ist eines der Entities frei, wird das angegebene Entity mit dem origin des phys_constraint verbunden. Diese Möglichkeit wird am häufigsten benutzt, um Objekte mit der Welt zu verknüpfen. Wie bei allen Constraints kann man hier ein bestimmtes Limit angeben, bevor die Verbindung reisst. Bei genug aufgebrachtem Schaden deaktiviert sich das Entity und feuert ggf. ein Output, mit dem man weitere Sachen triggern kann.
Beispielmap: sdk_phys_constraint.vmf
===== phys_ballsocket =====
Das phys_ballsocket ist ein Kugellager, das genauso wie die Verbindung zwischen Arm und Schulter funktioniert. Dieses Constraint ist an einem anderen fixiert und rotiert kugelförmig um diesen Punkt. Zum Beispiel kann dieses Entity für die Verknüpfung eines Seils und ein Objekt aus der Welt verwendet werden.
Beispielmap: sdk_phys_ballsocket.vmf
===== phys_hinge =====
Das phys_hinge funktioniert wie das Schanier einer Tür. Dieses Objekt schränkt ein anderes ein, sich nur in eine Richtung bewegen zu können. Diese Richtung ist mithilfe des Helper Tool im Hammer abrufbar.
Beispielmap: sdk_phys_hinge.vmf
===== phys_lengthconstraint =====
Das phys_lengthconstraint erhält die Entfernung zwischen zwei Entities aufrecht. Wenn die Flag Keep Rigid aktiv ist, kann man das Ergebnis mit der Funktionsweise einer Stange vergleichen. Wenn diese Flag nicht aktiv ist, ist das System ein wenig beweglicher.
Beispielmap: sdk_phys_lengthconstraint.vmf
===== phys_pulleyconstraint =====
Das phys_pulleyconstraint arbeitet wie zwei lengtconstraint zusammen. Um das zu verdeutlichen: Bewegt man das erste Objekt, bewegt sicht das 2. mit um die Länge aufrecht zu erhalten.
Beispielmap: sdk_phys_pulleyconstraint.vmf
===== phys_convert =====
Manchmal ist es notwendig ein Objekt komplett statisch zu belassen bis ein bestimmtes Ereignis auftritt. Zum Beispiel soll eine Steinschicht auf den Spieler einstürzen, nachdem ein gewisses Ereignis abgelaufen ist. Man könnte dafür ein phys_constraint verwenden, aber mithilfe des phys_convert ist das ganze fehlerfreier. Das phys_convert verändert statische Entities in physische. Ein prop_static wird dadurch zu einem prop_physics, und ein func_brush wird zu einem func_physbox. Weil diese Objekte bis zu der Veränderung statische Objekte sind, verbrauche sie in der Engine auch viel weniger ressourcen als wenn sie mithilfe eines anderen Constraint-Entities verbunden wären.
Beispielmap: sdk_phys_convert.vmf
===== phys_ragdollconstraint =====
Funktioniert wie ein normales phys_constraint aber für Ragdolls.
Beispielmap: sdk_phys_ragdollconstraint.vmf
===== phys_slideconstraint =====
Dieses Constraint erlaubt die Bewegung auf einer Achse. Wie die kleinen Ringe eines Duschvorhangs, die sich auf der Stange hin- und herbewegen.
Ähnlich des phys_hinge wird die Richtung mithilfe von Helpern angegeben
Beispielmap: sdk_phys_slideconstraint.vmf
===== phys_keepupright =====
Dieses Constraint lässt jedes Objekt nur in eine Richtung bewegen. Je größer der Wert Angular Limit ist, umso stärker behält das Objekt seine Position.
Beispielmap: sdk_phys_keepupright.vmf
===== phys_spring =====
Das phys_spring arbeitet wie eine Feder. Die Einstellung Length gibt an, wie lang die Feder ist, wenn nichts an ihr befestigt ist. Wenn etwas an die Feder gehängt wird, wird sie länger. Die Stärke wird durch den Wert Sprint Constant festgelegt..
Beispielmap: sdk_phys_sprint.vmf
===== phys_magnet =====
Das phys_magnet funktioniert wie ein Magnet, das metallische Objekte anzieht wenn sie in die Nähe kommen.
Beispielmap: sdk_phys_magnet.vmf
===== phys_motor =====
Das phys_motor Entity versucht ein Objekt in einer gewissen Geschwindigkeit zu bewegen. Die Geschwindigkeit bleibt gleich, es sei denn das zu bewegende Objekt gibt Widerstand (durch eine Kollision o.ä). Dann wird die Geschwindigkeit erhöht, um das Objekt weiterhin bewegen zu können.
Beispielmap: sdk_phys_motor.vmf
===== phys_ragdollmagnet =====
Ein Magnet für Ragdolls. Mithilfe dieses Entity können dramatischere Szenen mit Leichen erstellt werden.
Beispielmap: sdk_phys_ragdollmagnet.vmf
===== phys_thruster =====
Das phys_thruster übt eine Kraft in eine bestimmte Richtung aus. Vergleichbar mit dem Antrieb einer Rakte, welches den Sprengkopf in eine Richtung bewegt. Mithilfe der Einstellungen kann eine bestimmte Dauer angegeben werden, bevor der Schub wieder aufhört
Beispielmap: sdk_phys_thruster.vmf
===== phys_torque =====
Ähnlich wie das phys_motor entity, übt das phys_torque eine Rotationsbeschleunigung auf ein Objekt aus. Allerdings kann hierbei das Gewicht des angehängten Objekts ignoriert werden.
Beispielmap: sdk_phys_torque.vmf **