<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bridges</id>
	<title>GlossarWiki - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bridges"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Bridges"/>
	<updated>2026-07-17T11:54:20Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=14271</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=14271"/>
		<updated>2010-05-18T07:02:50Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[AS3-Tutorium:Physics:Grundlagen|Grundlagen]] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= [[AS3-Tutorium:Physics:Vertiefung|Vertiefung]] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12864</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12864"/>
		<updated>2009-05-27T21:22:37Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor. Im Detail werden die Vorgehensweisen und Algorithmen erklärt, welche in der lyneth Physics API verwendet werden. Diese Sammlung stellt nur eine begrenzte Zahl der Möglichkeiten dar, welche im Bereich der Physics zum Einsatz kommen. Für den 3D-Raum werden einige Sachverhalte komplizierter, deshalb beschränkt sich die Beschreibung auf den 2D-Raum.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen. Diese werden nicht zwingend für die Realisierung eine Physics-Engine benötigt, sind aber aufgrund der Vereinfachung der Sachverhalte unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten. Die Geometrie wird strikt von der Dynamik getrennt, um beide Bereiche unabhängig voneinander zu halten.&lt;br /&gt;
&lt;br /&gt;
=== Abstrakte Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einen Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder Sammlung von geometrischenen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und Zuständen ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte sind im Normalfall Dynamik-Objekte ohne geometrische Form. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab. Die Hook´sche Feder (siehe letzter Vortrag) kann ebenfalls als Kraft realisiert werden, welche allerdings nur auf zwei Körper wirkt und allein diese beeinflusst.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-2-01-Formen.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-2-02-Kräfte.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-2-03-Kräfte.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-2-04-Kräfte.swf]]&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die beiden gängigsten Verfahren für die Kollisionserkennung und -auflösung erklärt.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
Wie bereits in der Einführung vorgestellt reicht der Satz von Pythagoras und ein simpler Wertevergleich aus um die Kollision zwischen zwei Kreisen zu bestimmen. Für Rechtecke mit Seiten parallel zu den Achsen des Koordinationssystems auf Kollision zu testen reicht ebenfalls ein Wertevergleich aus. Diese Verfahren funktionieren nicht bei Polygonen, jedoch benutzt man sie gerne um erstmalig festzustellen ob Polygone potentiell überhaupt kollidieren können. Dazu wird jedem Polygon ein Bounding Circle (Umkreis) oder eine Bounding Box (umschließendes Rechteck) zugewiesen. Somit muß nicht für jedes Polygonenpaar eine aufwändige Kollisionerkennung durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Das einfachste Verfahren ist die Anwendung des [http://en.wikipedia.org/wiki/Separating_hyperplane_theorem Trennungssatzes] (englisch: Seperating Axis Theorem oder SAT). Dabei wird jede Normale (Vektor senkrecht zur Seite eines Polygons) als Projektionsachse für beide Polygone benutzt. Sobald eine dieser Projektionen zu keiner Überlappung der beiden Intervalle führt, liegt keine Kollision vor. Gibt es allerdings auf jeder Achse eine Überlappung der Intervalle, so liegt eine Kollision vor. Die Kollisionnormale ist der Vektor bei welchen die Überlappung der Projektionsintervalle minimal ist. Der Betrag dieser Überlappung beschreibt die Tiefe der Kollision. Der Teil mit dem größten Aufwand ist die Berechung der Kollisionspunkte. Hierbei muß nach den Fällen Punkt-Flächen- und Flächen-Flächen-Kollisionen unterschieden werden (Punkt-Punkt-Kollision wird ignoriert). &lt;br /&gt;
&lt;br /&gt;
Das SAT-Verfahren arbeitet nach dem Ausschlussprinzip, d.h. es arbeitet sehr schnell wenn wenig Kollisionen vorliegen. Bei vielen Kollisionen arbeitet das Verfahren aber umso langsamer, da es immer alle Normalen aller Polygone testen muß. Abgesehen von der Performance, erzeugt das Verfahren gerine Fehler und funktioniert stabil.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der Kollisionserkennung gibt es verschiedene Algorithmen um die Kollisionen zu lösen. Bei den meisten Systemen und den angeführten Verfahren werden Kollisionen erst erkannt und aufgelöst wenn sie bereits geschehen sind. Deshalb ist es wichtig die miteinander kollidierenden Objekte erst wieder so weit voneinander zu entfernen, bis sie sich nicht mehr überschneiden. Kollisionsauflösungen dieser Art werden als &amp;quot;penalty based&amp;quot; bezeichnet. Wie bereits im vorherigen Vortrag erwähnt, wird dazu die Minimum Translation Distance (MTD) kombiniert mit der Kollisionsnormale benötigt. Die Objekte werden abhängig von ihrer Masse voneinander entfernt.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es zu eigentlichen Reaktion auf die Kollision. Wie bei einer Kollision von Kreisen kann man das Prinzip des zentralen, unelastischen Stoßes implementieren, allerdings wird man bei diesem Verfahren keine Winkelgeschwindigkeiten und entsprechende Rotationsänderung berechnen können. Um dies möglichst einfach berechnen zu können verwendet man den Gesamtimpuls der Kollision am Kollisionspunkt. Dazu werden Linear- und Winkelgeschwindigkeiten an diesem Punkt, die Trägheiten der Körper (massenabhängig), die Reibung und die Elastizität (nicht sichtbar) der Körper berechnet. Die Geschwindigkeiten werden in Normalen- und Tangenanteil aufgeteilt und zusammen mit den neuen Winkelgeschwindigkeiten den Körpern zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Für exakte Beschreibungen gibt es [http://chrishecker.com/Rigid_Body_Dynamics#articles hier] eine Sammlung Dokumenten. Diese wurde auch als Basis für die Implementierung des lyneth Physics API benutzt.&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://www.fisixengine.com/ Fisix Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die Fisix Engine ist eine der älteren Physics-Engines. Anfangs wirkte sie sehr vielsprechend, liegt jedoch inzwischen in Sachen Performance und Möglichkeiten hinter Box2D und Motor. Ein nennenswertes Feature ist Gravitation von Körpern. Das größte Problem ist allerdings, dass die Engine nur frei ist für nichtkommerzielle Zwecke. Alle anderen Engines sind komplett Open-Source.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-04-Kr%C3%A4fte.swf&amp;diff=12863</id>
		<title>Datei:TutoriumPhysics-2-04-Kräfte.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-04-Kr%C3%A4fte.swf&amp;diff=12863"/>
		<updated>2009-05-27T21:21:06Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-03-Kr%C3%A4fte.swf&amp;diff=12862</id>
		<title>Datei:TutoriumPhysics-2-03-Kräfte.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-03-Kr%C3%A4fte.swf&amp;diff=12862"/>
		<updated>2009-05-27T21:20:45Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-02-Kr%C3%A4fte.swf&amp;diff=12861</id>
		<title>Datei:TutoriumPhysics-2-02-Kräfte.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-02-Kr%C3%A4fte.swf&amp;diff=12861"/>
		<updated>2009-05-27T21:20:33Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-01-Formen.swf&amp;diff=12860</id>
		<title>Datei:TutoriumPhysics-2-01-Formen.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-2-01-Formen.swf&amp;diff=12860"/>
		<updated>2009-05-27T21:20:16Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12859</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12859"/>
		<updated>2009-05-27T21:18:12Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor. Im Detail werden die Vorgehensweisen und Algorithmen erklärt, welche in der lyneth Physics API verwendet werden. Diese Sammlung stellt nur eine begrenzte Zahl der Möglichkeiten dar, welche im Bereich der Physics zum Einsatz kommen. Für den 3D-Raum werden einige Sachverhalte komplizierter, deshalb beschränkt sich die Beschreibung auf den 2D-Raum.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen. Diese werden nicht zwingend für die Realisierung eine Physics-Engine benötigt, sind aber aufgrund der Vereinfachung der Sachverhalte unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten. Die Geometrie wird strikt von der Dynamik getrennt, um beide Bereiche unabhängig voneinander zu halten.&lt;br /&gt;
&lt;br /&gt;
=== Abstrakte Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einen Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder Sammlung von geometrischenen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und Zuständen ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte sind im Normalfall Dynamik-Objekte ohne geometrische Form. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab. Die Hook´sche Feder (siehe letzter Vortrag) kann ebenfalls als Kraft realisiert werden, welche allerdings nur auf zwei Körper wirkt und allein diese beeinflusst.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die beiden gängigsten Verfahren für die Kollisionserkennung und -auflösung erklärt.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
Wie bereits in der Einführung vorgestellt reicht der Satz von Pythagoras und ein simpler Wertevergleich aus um die Kollision zwischen zwei Kreisen zu bestimmen. Für Rechtecke mit Seiten parallel zu den Achsen des Koordinationssystems auf Kollision zu testen reicht ebenfalls ein Wertevergleich aus. Diese Verfahren funktionieren nicht bei Polygonen, jedoch benutzt man sie gerne um erstmalig festzustellen ob Polygone potentiell überhaupt kollidieren können. Dazu wird jedem Polygon ein Bounding Circle (Umkreis) oder eine Bounding Box (umschließendes Rechteck) zugewiesen. Somit muß nicht für jedes Polygonenpaar eine aufwändige Kollisionerkennung durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Das einfachste Verfahren ist die Anwendung des [http://en.wikipedia.org/wiki/Separating_hyperplane_theorem Trennungssatzes] (englisch: Seperating Axis Theorem oder SAT). Dabei wird jede Normale (Vektor senkrecht zur Seite eines Polygons) als Projektionsachse für beide Polygone benutzt. Sobald eine dieser Projektionen zu keiner Überlappung der beiden Intervalle führt, liegt keine Kollision vor. Gibt es allerdings auf jeder Achse eine Überlappung der Intervalle, so liegt eine Kollision vor. Die Kollisionnormale ist der Vektor bei welchen die Überlappung der Projektionsintervalle minimal ist. Der Betrag dieser Überlappung beschreibt die Tiefe der Kollision. Der Teil mit dem größten Aufwand ist die Berechung der Kollisionspunkte. Hierbei muß nach den Fällen Punkt-Flächen- und Flächen-Flächen-Kollisionen unterschieden werden (Punkt-Punkt-Kollision wird ignoriert). &lt;br /&gt;
&lt;br /&gt;
Das SAT-Verfahren arbeitet nach dem Ausschlussprinzip, d.h. es arbeitet sehr schnell wenn wenig Kollisionen vorliegen. Bei vielen Kollisionen arbeitet das Verfahren aber umso langsamer, da es immer alle Normalen aller Polygone testen muß. Abgesehen von der Performance, erzeugt das Verfahren gerine Fehler und funktioniert stabil.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der Kollisionserkennung gibt es verschiedene Algorithmen um die Kollisionen zu lösen. Bei den meisten Systemen und den angeführten Verfahren werden Kollisionen erst erkannt und aufgelöst wenn sie bereits geschehen sind. Deshalb ist es wichtig die miteinander kollidierenden Objekte erst wieder so weit voneinander zu entfernen, bis sie sich nicht mehr überschneiden. Kollisionsauflösungen dieser Art werden als &amp;quot;penalty based&amp;quot; bezeichnet. Wie bereits im vorherigen Vortrag erwähnt, wird dazu die Minimum Translation Distance (MTD) kombiniert mit der Kollisionsnormale benötigt. Die Objekte werden abhängig von ihrer Masse voneinander entfernt.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es zu eigentlichen Reaktion auf die Kollision. Wie bei einer Kollision von Kreisen kann man das Prinzip des zentralen, unelastischen Stoßes implementieren, allerdings wird man bei diesem Verfahren keine Winkelgeschwindigkeiten und entsprechende Rotationsänderung berechnen können. Um dies möglichst einfach berechnen zu können verwendet man den Gesamtimpuls der Kollision am Kollisionspunkt. Dazu werden Linear- und Winkelgeschwindigkeiten an diesem Punkt, die Trägheiten der Körper (massenabhängig), die Reibung und die Elastizität (nicht sichtbar) der Körper berechnet. Die Geschwindigkeiten werden in Normalen- und Tangenanteil aufgeteilt und zusammen mit den neuen Winkelgeschwindigkeiten den Körpern zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Für exakte Beschreibungen gibt es [http://chrishecker.com/Rigid_Body_Dynamics#articles hier] eine Sammlung Dokumenten. Diese wurde auch als Basis für die Implementierung des lyneth Physics API benutzt.&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://www.fisixengine.com/ Fisix Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die Fisix Engine ist eine der älteren Physics-Engines. Anfangs wirkte sie sehr vielsprechend, liegt jedoch inzwischen in Sachen Performance und Möglichkeiten hinter Box2D und Motor. Ein nennenswertes Feature ist Gravitation von Körpern. Das größte Problem ist allerdings, dass die Engine nur frei ist für nichtkommerzielle Zwecke. Alle anderen Engines sind komplett Open-Source.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12858</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12858"/>
		<updated>2009-05-27T21:03:49Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor. Im Detail werden die Vorgehensweisen und Algorithmen erklärt, welche in der lyneth Physics API verwendet werden. Diese Sammlung stellt nur eine begrenzte Zahl der Möglichkeiten dar, welche im Bereich der Physics zum Einsatz kommen. Für den 3D-Raum werden einige Sachverhalte komplizierter, deshalb beschränkt sich die Beschreibung auf den 2D-Raum.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen. Diese werden nicht zwingend für die Realisierung eine Physics-Engine benötigt, sind aber aufgrund der Vereinfachung der Sachverhalte unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten. Die Geometrie wird strikt von der Dynamik getrennt, um beide Bereiche unabhängig voneinander zu halten.&lt;br /&gt;
&lt;br /&gt;
=== Abstrakte Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einen Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder Sammlung von geometrischenen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und Zuständen ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte sind im Normalfall Dynamik-Objekte ohne geometrische Form. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab. Die Hook´sche Feder (siehe letzter Vortrag) kann ebenfalls als Kraft realisiert werden, welche allerdings nur auf zwei Körper wirkt und allein diese beeinflusst.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die beiden gängigsten Verfahren für die Kollisionserkennung und -auflösung erklärt.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
Wie bereits in der Einführung vorgestellt reicht der Satz von Pythagoras und ein simpler Wertevergleich aus um die Kollision zwischen zwei Kreisen zu bestimmen. Für Rechtecke mit Seiten parallel zu den Achsen des Koordinationssystems auf Kollision zu testen reicht ebenfalls ein Wertevergleich aus. Diese Verfahren funktionieren nicht bei Polygonen, jedoch benutzt man sie gerne um erstmalig festzustellen ob Polygone potentiell überhaupt kollidieren können. Dazu wird jedem Polygon ein Bounding Circle (Umkreis) oder eine Bounding Box (umschließendes Rechteck) zugewiesen. Somit muß nicht für jedes Polygonenpaar eine aufwändige Kollisionerkennung durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Das einfachste Verfahren ist die Anwendung des [http://en.wikipedia.org/wiki/Separating_hyperplane_theorem Trennungssatzes] (englisch: Seperating Axis Theorem oder SAT). Dabei wird jede Normale (Vektor senkrecht zur Seite eines Polygons) als Projektionsachse für beide Polygone benutzt. Sobald eine dieser Projektionen zu keiner Überlappung der beiden Intervalle führt, liegt keine Kollision vor. Gibt es allerdings auf jeder Achse eine Überlappung der Intervalle, so liegt eine Kollision vor. Die Kollisionnormale ist der Vektor bei welchen die Überlappung der Projektionsintervalle minimal ist. Der Betrag dieser Überlappung beschreibt die Tiefe der Kollision. Der Teil mit dem größten Aufwand ist die Berechung der Kollisionspunkte. Hierbei muß nach den Fällen Punkt-Flächen- und Flächen-Flächen-Kollisionen unterschieden werden (Punkt-Punkt-Kollision wird ignoriert). &lt;br /&gt;
&lt;br /&gt;
Das SAT-Verfahren arbeitet nach dem Ausschlussprinzip, d.h. es arbeitet sehr schnell wenn wenig Kollisionen vorliegen. Bei vielen Kollisionen arbeitet das Verfahren aber umso langsamer, da es immer alle Normalen aller Polygone testen muß. Abgesehen von der Performance, erzeugt das Verfahren gerine Fehler und funktioniert stabil.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der Kollisionserkennung gibt es verschiedene Algorithmen um die Kollisionen zu lösen. Bei den meisten Systemen und den angeführten Verfahren werden Kollisionen erst erkannt und aufgelöst wenn sie bereits geschehen sind. Deshalb ist es wichtig die miteinander kollidierenden Objekte erst wieder so weit voneinander zu entfernen, bis sie sich nicht mehr überschneiden. Kollisionsauflösungen dieser Art werden als &amp;quot;penalty based&amp;quot; bezeichnet. Wie bereits im vorherigen Vortrag erwähnt, wird dazu die Minimum Translation Distance (MTD) kombiniert mit der Kollisionsnormale benötigt. Die Objekte werden abhängig von ihrer Masse voneinander entfernt.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es zu eigentlichen Reaktion auf die Kollision. Wie bei einer Kollision von Kreisen kann man das Prinzip des zentralen, unelastischen Stoßes implementieren, allerdings wird man bei diesem Verfahren keine Winkelgeschwindigkeiten und entsprechende Rotationsänderung berechnen können. Um dies möglichst einfach berechnen zu können verwendet man den Gesamtimpuls der Kollision am Kollisionspunkt. Dazu werden Linear- und Winkelgeschwindigkeiten an diesem Punkt, die Trägheiten der Körper (massenabhängig), die Reibung und die Elastizität (nicht sichtbar) der Körper berechnet. Die Geschwindigkeiten werden in Normalen- und Tangenanteil aufgeteilt und zusammen mit den neuen Winkelgeschwindigkeiten den Körpern zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Für exakte Beschreibungen gibt es [http://chrishecker.com/Rigid_Body_Dynamics#articles hier] eine Sammlung Dokumenten. Diese wurde auch als Basis für die Implementierung des lyneth Physics API benutzt.&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12857</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12857"/>
		<updated>2009-05-27T20:45:59Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die beiden gängigsten Verfahren für die Kollisionserkennung und -auflösung erklärt.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
Wie bereits in der Einführung vorgestellt reicht der Satz von Pythagoras und ein simpler Wertevergleich aus um die Kollision zwischen zwei Kreisen zu bestimmen. Für Rechtecke mit Seiten parallel zu den Achsen des Koordinationssystems auf Kollision zu testen reicht ebenfalls ein Wertevergleich aus. Diese Verfahren funktionieren nicht bei Polygonen, jedoch benutzt man sie gerne um erstmalig festzustellen ob Polygone potentiell überhaupt kollidieren können. Dazu wird jedem Polygon ein Bounding Circle (Umkreis) oder eine Bounding Box (umschließendes Rechteck) zugewiesen. Somit muß nicht für jedes Polygonenpaar eine aufwändige Kollisionerkennung durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Das einfachste Verfahren ist die Anwendung des [http://en.wikipedia.org/wiki/Separating_hyperplane_theorem Trennungssatzes] (englisch: Seperating Axis Theorem oder SAT). Dabei wird jede Normale (Vektor senkrecht zur Seite eines Polygons) als Projektionsachse für beide Polygone benutzt. Sobald eine dieser Projektionen zu keiner Überlappung der beiden Intervalle führt, liegt keine Kollision vor. Gibt es allerdings auf jeder Achse eine Überlappung der Intervalle, so liegt eine Kollision vor. Die Kollisionnormale ist der Vektor bei welchen die Überlappung der Projektionsintervalle minimal ist. Der Betrag dieser Überlappung beschreibt die Tiefe der Kollision. Der Teil mit dem größten Aufwand ist die Berechung der Kollisionspunkte. Hierbei muß nach den Fällen Punkt-Flächen- und Flächen-Flächen-Kollisionen unterschieden werden (Punkt-Punkt-Kollision wird ignoriert). &lt;br /&gt;
&lt;br /&gt;
Das SAT-Verfahren arbeitet nach dem Ausschlussprinzip, d.h. es arbeitet sehr schnell wenn wenig Kollisionen vorliegen. Bei vielen Kollisionen arbeitet das Verfahren aber umso langsamer, da es immer alle Normalen aller Polygone testen muß. Abgesehen von der Performance, erzeugt das Verfahren gerine Fehler und funktioniert stabil.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der Kollisionserkennung gibt es verschiedene Algorithmen um die Kollisionen zu lösen. Bei den meisten Systemen und den angeführten Verfahren werden Kollisionen erst erkannt und aufgelöst wenn sie bereits geschehen sind. Deshalb ist es wichtig die miteinander kollidierenden Objekte erst wieder so weit voneinander zu entfernen, bis sie sich nicht mehr überschneiden. Kollisionsauflösungen dieser Art werden als &amp;quot;penalty based&amp;quot; bezeichnet. Wie bereits im vorherigen Vortrag erwähnt, wird dazu die Minimum Translation Distance (MTD) kombiniert mit der Kollisionsnormale benötigt. Die Objekte werden abhängig von ihrer Masse voneinander entfernt.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es zu eigentlichen Reaktion auf die Kollision. Wie bei einer Kollision von Kreisen kann man das Prinzip des zentralen, unelastischen Stoßes implementieren, allerdings wird man bei diesem Verfahren keine Winkelgeschwindigkeiten und entsprechende Rotationsänderung berechnen können. Um dies möglichst einfach berechnen zu können verwendet man den Gesamtimpuls der Kollision am Kollisionspunkt. Dazu werden Linear- und Winkelgeschwindigkeiten an diesem Punkt, die Trägheiten der Körper (massenabhängig), die Reibung und die Elastizität (nicht sichtbar) der Körper berechnet. Die Geschwindigkeiten werden in Normalen- und Tangenanteil aufgeteilt und zusammen mit den neuen Winkelgeschwindigkeiten den Körpern zugewiesen.&lt;br /&gt;
&lt;br /&gt;
Für exakte Beschreibungen gibt es [http://chrishecker.com/Rigid_Body_Dynamics#articles hier] eine Sammlung Dokumenten. Diese wurde auch als Basis für die Implementierung des lyneth Physics API benutzt.&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12856</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12856"/>
		<updated>2009-05-27T20:24:09Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die beiden gängigsten Verfahren für die Kollisionserkennung und -auflösung erklärt.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
Wie bereits in der Einführung vorgestellt reicht der Satz von Pythagoras und ein simpler Wertevergleich aus um die Kollision zwischen zwei Kreisen zu bestimmen. Für Rechtecke mit Seiten parallel zu den Achsen des Koordinationssystems auf Kollision zu testen reicht ebenfalls ein Wertevergleich aus. Diese Verfahren funktionieren nicht bei Polygonen, jedoch benutzt man sie gerne um erstmalig festzustellen ob Polygone potentiell überhaupt kollidieren können. Dazu wird jedem Polygon ein Bounding Circle (Umkreis) oder eine Bounding Box (umschließendes Rechteck) zugewiesen. Somit muß nicht für jedes Polygonenpaar eine aufwändige Kollisionerkennung durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Das einfachste Verfahren ist die Anwendung des [http://en.wikipedia.org/wiki/Separating_hyperplane_theorem Trennungssatzes] (englisch: Seperating Axis Theorem oder SAT). Dabei wird jede Normale (Vektor senkrecht zur Seite eines Polygons) als Projektionsachse für beide Polygone benutzt. Sobald eine dieser Projektionen zu keiner Überlappung der beiden Intervalle führt, liegt keine Kollision vor. Gibt es allerdings auf jeder Achse eine Überlappung der Intervalle, so liegt eine Kollision vor. Die Kollisionnormale ist der Vektor bei welchen die Überlappung der Projektionsintervalle minimal ist. Der Betrag dieser Überlappung beschreibt die Tiefe der Kollision. Der Teil mit dem größten Aufwand ist die Berechung der Kollisionspunkte. Hierbei muß nach den Fällen Punkt-Flächen- und Flächen-Flächen-Kollisionen unterschieden werden (Punkt-Punkt-Kollision wird ignoriert). &lt;br /&gt;
&lt;br /&gt;
Das SAT-Verfahren arbeitet nach dem Ausschlussprinzip, d.h. es arbeitet sehr schnell wenn wenig Kollisionen vorliegen. Bei vielen Kollisionen arbeitet das Verfahren aber umso langsamer, da es immer alle Normalen aller Polygone testen muß. Abgesehen von der Performance, erzeugt das Verfahren gerine Fehler und funktioniert stabil.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
Ebenso wie bei der Kollisionserkennung gibt es verschiedene Algorithmen um die Kollisionen zu lösen. Bei einer &lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12855</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12855"/>
		<updated>2009-05-27T20:22:47Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[wiki:AS3-Tutorium:Physics:Grundlagen|Grundlagen]] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= [[wiki:AS3-Tutorium:Physics:Vertiefung|Vertiefung]] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12854</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12854"/>
		<updated>2009-05-27T20:22:34Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [wiki:AS3-Tutorium:Physics:Grundlagen|Grundlagen] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= [wiki:AS3-Tutorium:Physics:Vertiefung|Vertiefung] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12853</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12853"/>
		<updated>2009-05-27T17:27:01Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die beiden gängigsten Verfahren für die Kollisionserkennung und -auflösung erklärt.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
Wie bereits in der Einführung vorgestellt reicht der Satz von Pythagoras und ein simpler Wertevergleich aus um die Kollision zwischen zwei Kreisen zu bestimmen. Für Rechtecke mit Seiten parallel zu den Achsen des Koordinationssystems auf Kollision zu testen reicht ebenfalls ein Wertevergleich aus. Diese Verfahren funktionieren nicht bei Polygonen, jedoch benutzt man sie gerne um erstmalig festzustellen ob Polygone potentiell überhaupt kollidieren können. Dazu wird jedem Polygon ein Bounding Circle (Umkreis) oder eine Bounding Box (umschließendes Rechteck) zugewiesen. Somit muß nicht für jedes Polygonenpaar eine aufwändige Kollisionerkennung durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Das einfachste Verfahren ist die Anwendung des [http://en.wikipedia.org/wiki/Separating_hyperplane_theorem Trennungssatzes] (englisch: Seperating Axis Theorem oder SAT). Dabei wird jede Normale (Vektor senkrecht zur Seite eines Polygons) als Projektionsachse für beide Polygone benutzt. Sobald eine dieser Projektionen zu keiner Überlappung der beiden Intervalle führt, liegt keine Kollision vor. Gibt es allerdings auf jeder Achse eine Überlappung der Intervalle, so liegt eine Kollision vor. Die Kollisionnormale ist der Vektor bei welchen die Überlappung der Projektionsintervalle minimal ist. Der Betrag dieser Überlappung beschreibt die Tiefe der Kollision. Der Teil mit dem größten Aufwand ist die Berechung der Kollisionspunkte. Hierbei muß nach den Fällen Punkt-Flächen- und Flächen-Flächen-Kollisionen unterschieden werden (Punkt-Punkt-Kollision wird ignoriert). &lt;br /&gt;
&lt;br /&gt;
Das SAT-Verfahren arbeitet nach dem Ausschlussprinzip, d.h. es arbeitet sehr schnell wenn wenig Kollisionen vorliegen. Bei vielen Kollisionen arbeitet das Verfahren aber umso langsamer, da es immer alle Normalen aller Polygone testen muß. Abgesehen von der Performance, erzeugt das Verfahren gerine Fehler und funktioniert stabil.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12852</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12852"/>
		<updated>2009-05-27T17:09:40Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Die Integration beschreibt numerische Lösungsverfahren für Differentialgleichungen. Die Zustandsänderungen der Dynamik eines Körpers werden mithilfe dieser Algorithmen berechnet (Kräfte, Beschleunigungen, Geschwindigkeiten, Orte). Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta-Verfahren ist dem Taylor-Polynom sehr ähnlich. In Physics wird meistens das Verfahren in der viersten Ordnung verwendet (man spricht daher von RK4). Dieses Verfahren zur Integration ist das mit dem geringsten Fehler aber auch dem höchsten Rechenaufwand. Hierbei wird pro Zeitintervall nicht nur der neue Wert berechnet, sondern auch zwei weitere Zwischenwerte, außerdem wird der alte Wert mit in Betracht gezogen. Diese werden dann gewichtet miteinander verrechnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die dabei bei nichtlinearen Funktionen notwendigerweise auftretenden Fehler (es werden sämtliche höheren Glieder der Taylor-Entwicklung vernachlässigt) können durch geeignete Kombinationen verschiedener Differenzquotienten teilweise kompensiert werden. Das Runge-Kutta-Verfahren ist nun eine solche Kombination, die Diskretisierungsfehler bis zur dritten Ableitung kompensiert.&amp;lt;cite&amp;gt;(Quelle:Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Formel bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte Midpoint-Verfahren wird in den meisten als RK2, also als Runge-Kutta-Verfahren der 2. Ordnung implementiert. Dementsprechend ist der Rechenaufwand etwas höher als bei Euler, das Ergebnis allerdings nicht so genau wie RK4. Der Algorithmus wird nicht häufig in Physics-Engines eingesetzt.&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
Der Verlet-Algorithmus verspricht eine größere Stabilität und einen geringeren Fehler als bei Euler. Dazu wird nicht mit Variablen für Geschwindigkeiten gerechnet, sondern werden diese Werte aus der aktuellen Position und der vorgehenden berechnet. Das Verfahren ist allerdings nicht sehr weit verbreitet, da die Implementierung oftmals Änderungen an der Architektur von Engines voraussetzt.&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12851</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12851"/>
		<updated>2009-05-27T16:46:57Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Um die Zustände der Dynamik nun auf Körper und somit auch geometrische Formen anzuwenden wird eine Integration benutzt. Dieser Vorgang simuliert die Wirkung von Kräften, Beschleunigungen und Geschwindigkeiten innerhalb von festen Zeitintervallen, welche eine Änderung des Ortes/der Position hervorruft. Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden. Wichtige Links zu diesem Thema sind:&lt;br /&gt;
* [http://de.wikipedia.org/w/index.php?title=Datei:RK_Verfahren.png&amp;amp;filetimestamp=20090121000101]&lt;br /&gt;
* [http://gafferongames.com/game-physics/integration-basics/]&lt;br /&gt;
* [http://lab.generalrelativity.org/foam/demos/orbit/]&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Euler%27s_method Euler] ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. Die Beschleunigung setzt sich aus der Summe der wirkenden Kräfte zusammen. In einfachen Fällen wird die Beschleunigung einfach manuell gesetzt.&lt;br /&gt;
&lt;br /&gt;
 a1 = f / m&lt;br /&gt;
 v1 = v0 + a1 * t&lt;br /&gt;
 x1 = x0 + v1 * t&lt;br /&gt;
&lt;br /&gt;
Liegt etwas anderes als eine konstante Geschwindigkeit und keine Beschleunigung vor, so erzeugt dieses Verfahren sehr große Berechnungsfehler. Das Euler-Verfahren kommt jedoch sehr häufig zum Einsatz, vor allem auch in AS3-Physics-Engines, da es einfachste und performanteste Verfahren darstellt. Die Berechnungsfehler sind zu vernachlässigen, da die Ergebnisse meistens trotzdem realistisch wirken.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Klassisches_Runge-Kutta-Verfahren Runge-Kutta] ===&lt;br /&gt;
&lt;br /&gt;
Das Runge-Kutta Verfahren, meistens als RK4 bezeichnet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Midpoint_method Midpoint] ===&lt;br /&gt;
&lt;br /&gt;
=== [http://en.wikipedia.org/wiki/Verlet_integration Verlet] ===&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12850</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12850"/>
		<updated>2009-05-27T08:14:58Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== [http://de.wikipedia.org/wiki/Vektor Vektor] ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engines sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Um die Zustände der Dynamik nun auf Körper und somit auch geometrische Formen anzuwenden wird eine Integration benutzt. Dieser Vorgang simuliert die Wirkung von Kräften, Beschleunigungen und Geschwindigkeiten innerhalb von festen Zeitintervallen, welche eine Änderung des Ortes/der Position hervorruft. Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden.&lt;br /&gt;
&lt;br /&gt;
=== Euler ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. &lt;br /&gt;
&lt;br /&gt;
=== Runge-Kutta ===&lt;br /&gt;
&lt;br /&gt;
=== Weitere ===&lt;br /&gt;
&lt;br /&gt;
* Midway&lt;br /&gt;
* Verlet&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12849</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12849"/>
		<updated>2009-05-26T22:54:45Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== Vektor ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engine sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Geometrische Objekte sind relevant für die Beschreibung der Formen von physikalischen Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
Eine Form besitzt immer eine globale Position und Rotation (unter Umständen auch eine lokale Position und Rotation). &lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
Der Kreis ist die einfachste geometrische Form, er wird durch die Attribute einer Form und einem Radius beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Konvexes) Polygon ===&lt;br /&gt;
&lt;br /&gt;
Ein Polygon erweitert eine abstrakte Form um eine feste Anzahl von Eckpunkten. Für die meisten Algorithmen der Kollisionserkennung werden konvexe Polygone benötigt. Konkave Polygone setzen sich aus der Kombination von mehreren konvexen Polygonen zusammen. Um Berechnungen sparen zu können werden die Normalen der Seiten eines Polygons und die Projektionen entlang der eigenen Normalen zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Dynamik (gr. dynamis Kraft) ist das Teilgebiet der Mechanik, das sich mit der Wirkung von Kräften befasst. [..] Hier wird unter Dynamik die Beschreibung der Bewegung von Körpern unter Einfluss von Kräften verstanden, im allgemeineren Sinn auch das Zeitverhalten eines Systems und die zu seiner Beschreibung verwendeten Bewegungsgleichungen.&amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
Ein Zustand zu einem bestimmten Zeitpunkt t setzt sich zusammen aus Position, Geschwindigkeit und Beschleunigung. Jedes dieser Attribute wird durch einen 2D-Vektor kombiniert mit einem Wert für die Rotation realisiert (für Rotation, Winkelgeschwindigkeit und Winkelbeschleunigung).&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
Jeder geometrischen Form wird ein Zustand zugeordnet. Die Kombination von geometrischen Formen und dem Zustand ergibt einen Körper.&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
Kräfte werden vereinfacht gesagt als Dynamik-Objekte ohne geometrische Form angesehen. Für den Zustand ist in den meisten Fällen allein eine Position ausreichend. Zusätzlich besitzt eine Kraft einen Kraftvektor und einen Wirkungsbereich (oft durch einen Radius realisiert). Wie die Kraft letzendlich auf Körper angewendet wird, hängt von der Art der Kraft ab.&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
Um die Zustände der Dynamik nun auf Körper und somit auch geometrische Formen anzuwenden wird eine Integration benutzt. Dieser Vorgang simuliert die Wirkung von Kräften, Beschleunigungen und Geschwindigkeiten innerhalb von festen Zeitintervallen, welche eine Änderung des Ortes/der Position hervorruft. Es gibt viele verschiedene Algorithmen, welche sich in Effizienz und Exaktheit unterscheiden.&lt;br /&gt;
&lt;br /&gt;
=== Euler ===&lt;br /&gt;
&lt;br /&gt;
Das Verfahren nach Euler ist die einfachste Form der Integration. Hierbei wird abhängig von der vergangenen Zeit (im Normalfall ein festes Zeitintervall) die Beschleunigung auf die Geschwindigkeit und die Geschwindigkeit auf die Position addiert. &lt;br /&gt;
&lt;br /&gt;
=== Runge-Kutta ===&lt;br /&gt;
&lt;br /&gt;
=== Weitere ===&lt;br /&gt;
&lt;br /&gt;
* Midway&lt;br /&gt;
* Verlet&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12848</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12848"/>
		<updated>2009-05-26T22:33:48Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== Vektor ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
Für 2D-Physics-Engine sind lediglich 1D-Projektionen relevant. Hierzu wird ein Projektionsvektor (Vektor mit der Länge 1) und mindestens ein zu projezierender Vektor benötigt. Die Projektion wird berechnet, indem man das Skalarprodukt für alle gewünschten Vektoren mit dem Projektionsvektor berechnet. Es entsteht ein Intervall, welches in Kombination mit dem Projektsvektor die Projektion innerhalb des ursprünglichen Koordinatensystems beschreibt. Projektionen werden benötigt für:&lt;br /&gt;
* Berechnung der Tiefe einer Kollision (Minimum Translation Distance)&lt;br /&gt;
* Berechnung der Normalen- und Tangenanteile von Geschwindigkeiten&lt;br /&gt;
* Bestimmung von Überschneidung von polygonalen Formen&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kinematik (gr.: kinema, Bewegung) ist die Lehre der Bewegung von Punkten und Körpern im Raum, beschrieben durch die Größen Weg s (Änderung der Ortskoordinate), Geschwindigkeit v und Beschleunigung a, ohne die Ursachen einer Bewegung (Kräfte) zu betrachten. Ihr Gegenstück ist die Dynamik, die sich mit der Bewegung von Körpern unter Einwirkung von Kräften beschäftigt. Kinematik und Dynamik sind Teilgebiete der Mechanik. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Masse ===&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
=== Euler ===&lt;br /&gt;
&lt;br /&gt;
=== Runge-Kutta ===&lt;br /&gt;
&lt;br /&gt;
=== Weitere ===&lt;br /&gt;
&lt;br /&gt;
* Midway&lt;br /&gt;
* Verlet&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12847</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12847"/>
		<updated>2009-05-26T22:21:46Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Grundlage für alle physikalischen Simulationen sind mathematische Hilfsklassen.&lt;br /&gt;
&lt;br /&gt;
=== Vektor ===&lt;br /&gt;
&lt;br /&gt;
Ein zweidimensionaler Vektor besteht aus einer x- und einer y-Komponente. Dieser hat immer eine Länge und eine Richtung. Benutzt man einen Vektor für eine Position, so versteht man den Vektor als Abstand und Richtung der Position vom Ursprung aus. &lt;br /&gt;
&lt;br /&gt;
Vektoren werden für folgende Sachverhalte verwendet:&lt;br /&gt;
* Position&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Beschleunigung&lt;br /&gt;
* Kollisionsnormale&lt;br /&gt;
* Kollisionstangente&lt;br /&gt;
* Koordinatensysteme (ein Paar von Vektoren)&lt;br /&gt;
&lt;br /&gt;
Wichtig ist also alle relevanten mathematischen Funktionalitäten für Vektoren zu implementieren. Dazu gehören:&lt;br /&gt;
* Addition, Subtraktion, Multiplikation, Division&lt;br /&gt;
* Längenbestimmung&lt;br /&gt;
* Normierung (den Vektor auf Länge 1 skalierung)&lt;br /&gt;
* Normalenberechnung (einen Vektor berechnen, welcher senkrecht auf dem Ursprungsvektor steht)&lt;br /&gt;
* Skalarprodukt von zwei Vektoren&lt;br /&gt;
* Kreuzprodukt von zwei Vektoren (in 2D-Raum ein Skalar)&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kinematik (gr.: kinema, Bewegung) ist die Lehre der Bewegung von Punkten und Körpern im Raum, beschrieben durch die Größen Weg s (Änderung der Ortskoordinate), Geschwindigkeit v und Beschleunigung a, ohne die Ursachen einer Bewegung (Kräfte) zu betrachten. Ihr Gegenstück ist die Dynamik, die sich mit der Bewegung von Körpern unter Einwirkung von Kräften beschäftigt. Kinematik und Dynamik sind Teilgebiete der Mechanik. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Masse ===&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
=== Euler ===&lt;br /&gt;
&lt;br /&gt;
=== Runge-Kutta ===&lt;br /&gt;
&lt;br /&gt;
=== Weitere ===&lt;br /&gt;
&lt;br /&gt;
* Midway&lt;br /&gt;
* Verlet&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12846</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12846"/>
		<updated>2009-05-26T22:14:08Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Der Inhalt dieses Vortrags orientiert sich an dem Aufbau der lyneth Physics API.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
=== Vektor ===&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
&lt;br /&gt;
== Dynamik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kinematik (gr.: kinema, Bewegung) ist die Lehre der Bewegung von Punkten und Körpern im Raum, beschrieben durch die Größen Weg s (Änderung der Ortskoordinate), Geschwindigkeit v und Beschleunigung a, ohne die Ursachen einer Bewegung (Kräfte) zu betrachten. Ihr Gegenstück ist die Dynamik, die sich mit der Bewegung von Körpern unter Einwirkung von Kräften beschäftigt. Kinematik und Dynamik sind Teilgebiete der Mechanik. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Masse ===&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
=== Kräfte ===&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
=== Euler ===&lt;br /&gt;
&lt;br /&gt;
=== Runge-Kutta ===&lt;br /&gt;
&lt;br /&gt;
=== Weitere ===&lt;br /&gt;
&lt;br /&gt;
* Midway&lt;br /&gt;
* Verlet&lt;br /&gt;
&lt;br /&gt;
== Kollisionen ==&lt;br /&gt;
&lt;br /&gt;
=== Kollisionserkennung ===&lt;br /&gt;
&lt;br /&gt;
=== Kollisionsauflösung ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt dieses Vortrags orientiert sich an dem Aufbau dieser Engine.&lt;br /&gt;
&lt;br /&gt;
== Kommerziell ==&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12845</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12845"/>
		<updated>2009-05-26T22:09:59Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine und stellt außerdem die wichtigsten Physics-Engines vor.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Der Inhalt dieses Vortrags orientiert sich an dem Aufbau der lyneth Physics API.&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Mathematische Objekte ==&lt;br /&gt;
&lt;br /&gt;
=== Vektor ===&lt;br /&gt;
&lt;br /&gt;
=== Projektion ===&lt;br /&gt;
&lt;br /&gt;
== Geometrische Objekte ==&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
&lt;br /&gt;
=== Kreis ===&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
&lt;br /&gt;
== Kinematik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kinematik (gr.: kinema, Bewegung) ist die Lehre der Bewegung von Punkten und Körpern im Raum, beschrieben durch die Größen Weg s (Änderung der Ortskoordinate), Geschwindigkeit v und Beschleunigung a, ohne die Ursachen einer Bewegung (Kräfte) zu betrachten. Ihr Gegenstück ist die Dynamik, die sich mit der Bewegung von Körpern unter Einwirkung von Kräften beschäftigt. Kinematik und Dynamik sind Teilgebiete der Mechanik. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Masse ===&lt;br /&gt;
&lt;br /&gt;
=== Zustand ===&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt dieses Vortrags orientiert sich an dem Aufbau dieser Engine.&lt;br /&gt;
&lt;br /&gt;
== Kommerziell ==&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12844</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12844"/>
		<updated>2009-05-26T22:03:09Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Geometrische Formen ==&lt;br /&gt;
&lt;br /&gt;
== Dynamics ==&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [http://box2dflash.sourceforge.net/ Box2D] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [http://cove.org/ape/ APE - Another Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
Die APE ist eine Weiterentwicklung der AS2-Physics-Engine [http://www.cove.org/flade/ Flade]. Ein zentrales Argument für diese Engine, ist die oft genannte einfache und intuitive Struktur der API, was dadurch begründet sein kann, dass die Engine bereits seit 2005 entwickelt wurde und von Beginn an für Actionscript ausgelegt war. Im Gegensatz zu den oben genannten Engines besitzt sie jedoch einen sehr eingeschränkten Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
== [http://lab.andre-michelle.com/physics-engine aM Physics Engine] ==&lt;br /&gt;
&lt;br /&gt;
André Michelle, bekannter Actionscript-Entwickler und Sprecher auf vielen Flash-Konferenzen, stellt eine einfache Physics-Engine zur Verfügung. Diese ist jedoch nicht für die Produktion von Applikationen sondern für das Ausprobieren von Physics geeignet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://code.google.com/p/foam-as3/ FOAM] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;It is meant as an architectural and mathematical reference for developers interested in physics simulation in the area of game development or otherwise. It trades efficiency for modularity and extensibility.&amp;lt;cite&amp;gt;(Quelle:[http://code.google.com/p/foam-as3/])&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die FOAM-Engine ist ebenfalls nicht für den Produktionsbetrieb geeignet, zeigt jedoch eindrucksvoll und verständlich wie Algorithmen für eine Physics-Engine implementiert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== [http://alex-lawrence.com/work/lyneth/current-status lyneth] ==&lt;br /&gt;
&lt;br /&gt;
lyneth ist eine Physics-Engine von Alexander Lawrence. Der Fokus dieser Engine liegt auf der Verständlichkeit der API und der Anbindung an Flash-Applikationen. Die Performance ist jedoch in keiner Weise vergleichbar mit der von Box2D oder Motor Physics. Die lyneth-Engine ist nicht für den Produktionsbetrieb geeignet und momentan nicht frei verfügbar. Der Kern der Engine wird unter einer Open-Source Lizenz veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt dieses Vortrags orientiert sich an dem Aufbau dieser Engine.&lt;br /&gt;
&lt;br /&gt;
== Kommerziell ==&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12843</id>
		<title>AS3-Tutorium:Physics:Vertiefung</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12843"/>
		<updated>2009-05-26T21:49:01Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Die Seite wurde neu angelegt: {{In Bearbeitung}}  = Überblick =  Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.  = Anmerkungen =  = Komponenten einer P...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
= Komponenten einer Physics-Engine =&lt;br /&gt;
&lt;br /&gt;
== Geometrische Formen ==&lt;br /&gt;
&lt;br /&gt;
== Dynamics ==&lt;br /&gt;
&lt;br /&gt;
= Verfügbare Physics-Engines =&lt;br /&gt;
&lt;br /&gt;
== [[http://box2dflash.sourceforge.net/ Box2D]] ==&lt;br /&gt;
&lt;br /&gt;
Die Box2D-Engine basiert auf der gleichnamigen C++-Engine von Erin Catto. Die Engine ist plattformunabhängig, wurde bereits für den Nintendo DS und das iPhone eingesetzt und wird in vielen aktuellen PC-Spielen verwendet. Box2D ist mit Abstand die performanteste und umfangreichste Physics-Engine für AS3. Die einzige Kritik gilt dem Aufbau der API, diese wird manchmal als unhandlich und/oder unverständlich bezeichnet, hauptsächlich weil die AS3-Version ein direkter Port der C++-Version ist und somit für viele Actionscript-Entwickler nicht intuitiv genug ist.&lt;br /&gt;
&lt;br /&gt;
== [[http://lab.polygonal.de/2007/12/31/motor-physics-released/ Motor Physics]] ==&lt;br /&gt;
&lt;br /&gt;
Motor Physics ist im Inneren Box2D sehr ähnlich, da der Entwickler sich stark an den Algorithmen und Vorgehensweise von Erin Catto orientiert hat. Die Engine soll in gewissen Bereichen eine bessere Performance bieten als Box2D, jedoch gibt es bisher keine direkten Vergleiche oder Benchmarks. Außerdem bietet Motor Physics nicht den vollen Funktionsumfang von Box2D. Der Aufbau der API unterscheidet sich jedoch etwas, da die Engine von Anfang auf AS3 ausgelegt war.&lt;br /&gt;
&lt;br /&gt;
== [[http://cove.org/ape/ APE - Another Physics Engine]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# http://lab.andre-michelle.com/physics-engine&lt;br /&gt;
# http://lab.andre-michelle.com/revive-physics-engine&lt;br /&gt;
# http://code.google.com/p/foam-as3/&lt;br /&gt;
# http://alex-lawrence.com/work/lyneth/current-status &lt;br /&gt;
&lt;br /&gt;
== Kommerziell ==&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12842</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12842"/>
		<updated>2009-05-26T21:08:42Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Der Seiteninhalt wurde durch einen anderen Text ersetzt: &amp;#039;= Grundlagen =

Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physi...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[wiki:AS3-Tutorium:Physics:Grundlagen|Grundlagen]] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= [[wiki:AS3-Tutorium:Physics:Vertiefung|Vertiefung]] =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt den Aufbau und die Funktionsweise einer vollwertigen Physics-Engine.&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Grundlagen&amp;diff=12841</id>
		<title>AS3-Tutorium:Physics:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Grundlagen&amp;diff=12841"/>
		<updated>2009-05-26T21:03:43Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über eine direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (im Falle von Actionscript oder vergleichbaren Sprachen in jedem Frame bzw. bei jeder draw()-Methode).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betrachtet man also den Ort x zu zwei verschiedenen diskreten Zeitpunkten t0 und t1, ergibt sich aus der Differenz der beiden Orte die Geschwindigkeit zum Zeitpunkt t1.&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wenn man also nicht den Ort direkt, sondern die Geschwindigkeit ändert, welche man pro Zeitintervall auf den Ort addiert, erhält man lineare Bewegungen.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von &amp;quot;Rigid Body Physics&amp;quot; (Physik der starren Körper) interessiert die Beschleunigung von Massen, nicht aber die Verformung. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigung ist somit die erste Ableitung der Geschwindigkeit und die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen anstatt nur mit Geschwindigkeit (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Gravitation ziehen sich also zwei Körper immer gegenseitig. Wenn man allerdings Kräfte von sehr großen Körpern simulieren will (wie zum Beispiel die Erdanziehungskraft), so kann man die Kraft vernachlässigen, welche vom kleineren auf den größeren Körper wirkt. Desweiteren können Objekte unter einer bestimmten Größe als massengleich angesehen werden. Solche Kräfte werden in Physics-Simulationen als massenunabhängig betrachtet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus. Die Simulation von Federn ist sehr einfach zu implementieren und wirkt bei ausreichenden kleinen Zeitintervallen sehr realistisch.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf]] (dieses Beispiel implementiert bereits Kollisionserkennung und -lösung)&lt;br /&gt;
&lt;br /&gt;
== Kollsionen mit den Bildschirmgrenzen ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umgedreht werden (v *= -1). Außerdem wird das Objekt wieder so weit zurückgeschoben, sodass es nicht mehr mit den Grenzen kollidiert. Hiermit wird eine einfache Kollsionsabfrage simuliert. &lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf]]&lt;br /&gt;
&lt;br /&gt;
== Kollisionen zwischen kreisförmigen Objekten ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlage hierfür der zentrale, unelastische [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß]. Das Prinzip des zentralen Stoßes dient zur einfachen Kollsionserkennung und -lösung zwischen zwei kreisförmigen Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotationen ist dieses Prinzip nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kollsionserkennung ===&lt;br /&gt;
&lt;br /&gt;
In den meisten Physics-Engines werden Kollision erst erkannt, nachdem sie bereits geschehen sind. Es ist in jedem Fall möglich eine Kollision mithilfe von Projektionen der Körper entlang der Geschwindigkeitenvorherzusagen, der erhöhte Rechenaufwand für dieses Verfahren lohnt sich in den meisten Fällen jedoch nicht, da Effizienz vor Exaktheit geht.&lt;br /&gt;
&lt;br /&gt;
Da ein Kreis vom Mittelpunkt zu einem Punkt auf seiner Oberfläche unabhängig von der Richtung immer denselben Abstand hat, liegt eine Kollision zwischen zwei Kreisen vor, sobald der Abstand der Mittelpunkte kleiner ist als die Summe der Radien der beiden Kreise.&lt;br /&gt;
&lt;br /&gt;
 d12 = |m1 - m2|&lt;br /&gt;
 d12 &amp;lt; r1 + r2&lt;br /&gt;
&lt;br /&gt;
Um eine Kollision korrekt verarbeiten zu können werden folgende Nenngrößen benötigt:&lt;br /&gt;
* Tiefe der Kollision, in Physics-Simulation oft MTD genannt (Minimum Translation Distance) - im Falle von Kreisen die Differenz von Abstand und Summe der Radien&lt;br /&gt;
* Die Kollisionsnormale - im Falle von Kreisen der normierte Vektor von Mittelpunkt m1 nach m2&lt;br /&gt;
* Die Massen der beiden Objekte&lt;br /&gt;
* Die Geschwindigkeiten der beiden Objekte&lt;br /&gt;
&lt;br /&gt;
=== Kollisionslösung ===&lt;br /&gt;
&lt;br /&gt;
Bei einer Kollisionslösung von bereits geschehenen Kollisionen spricht man meistens vom &amp;quot;Collision Resolving&amp;quot;. &lt;br /&gt;
Es werden folgende Schritte durchgeführt:&lt;br /&gt;
* Die Objekte werden entlang der Kollisionsnormale massenabhängig insgesamt um die Tiefe der Kollision auseinandergezogen&lt;br /&gt;
* Die Geschwindigkeiten der Objekte werden in einen Normalen- und einen Tangentenanteil aufgeteilt (die Normale ist hier die Kollisionsnormale)&lt;br /&gt;
* Die Tangentenanteile der Geschwindigkeiten der Objekte werden unverändert übernommen, die Normalenanteile gespiegelt und massenabhängig verrechnet&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-13-Lebenszeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
* [[Medium:TutoriumPhysics-14-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-15-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-16-Physics.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-17-Physics.swf]]&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Grundlagen&amp;diff=12840</id>
		<title>AS3-Tutorium:Physics:Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Grundlagen&amp;diff=12840"/>
		<updated>2009-05-26T21:03:19Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Die Seite wurde neu angelegt: {{In Bearbeitung}}  = Überblick =  Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.  = Anmerkungen =  Um die im ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über eine direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (im Falle von Actionscript oder vergleichbaren Sprachen in jedem Frame bzw. bei jeder draw()-Methode).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betrachtet man also den Ort x zu zwei verschiedenen diskreten Zeitpunkten t0 und t1, ergibt sich aus der Differenz der beiden Orte die Geschwindigkeit zum Zeitpunkt t1.&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wenn man also nicht den Ort direkt, sondern die Geschwindigkeit ändert, welche man pro Zeitintervall auf den Ort addiert, erhält man lineare Bewegungen.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von &amp;quot;Rigid Body Physics&amp;quot; (Physik der starren Körper) interessiert die Beschleunigung von Massen, nicht aber die Verformung. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigung ist somit die erste Ableitung der Geschwindigkeit und die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen anstatt nur mit Geschwindigkeit (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Gravitation ziehen sich also zwei Körper immer gegenseitig. Wenn man allerdings Kräfte von sehr großen Körpern simulieren will (wie zum Beispiel die Erdanziehungskraft), so kann man die Kraft vernachlässigen, welche vom kleineren auf den größeren Körper wirkt. Desweiteren können Objekte unter einer bestimmten Größe als massengleich angesehen werden. Solche Kräfte werden in Physics-Simulationen als massenunabhängig betrachtet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus. Die Simulation von Federn ist sehr einfach zu implementieren und wirkt bei ausreichenden kleinen Zeitintervallen sehr realistisch.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf]] (dieses Beispiel implementiert bereits Kollisionserkennung und -lösung)&lt;br /&gt;
&lt;br /&gt;
== Kollsionen mit den Bildschirmgrenzen ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umgedreht werden (v *= -1). Außerdem wird das Objekt wieder so weit zurückgeschoben, sodass es nicht mehr mit den Grenzen kollidiert. Hiermit wird eine einfache Kollsionsabfrage simuliert. &lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf]]&lt;br /&gt;
&lt;br /&gt;
== Kollisionen zwischen kreisförmigen Objekten ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlage hierfür der zentrale, unelastische [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß]. Das Prinzip des zentralen Stoßes dient zur einfachen Kollsionserkennung und -lösung zwischen zwei kreisförmigen Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotationen ist dieses Prinzip nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kollsionserkennung ===&lt;br /&gt;
&lt;br /&gt;
In den meisten Physics-Engines werden Kollision erst erkannt, nachdem sie bereits geschehen sind. Es ist in jedem Fall möglich eine Kollision mithilfe von Projektionen der Körper entlang der Geschwindigkeitenvorherzusagen, der erhöhte Rechenaufwand für dieses Verfahren lohnt sich in den meisten Fällen jedoch nicht, da Effizienz vor Exaktheit geht.&lt;br /&gt;
&lt;br /&gt;
Da ein Kreis vom Mittelpunkt zu einem Punkt auf seiner Oberfläche unabhängig von der Richtung immer denselben Abstand hat, liegt eine Kollision zwischen zwei Kreisen vor, sobald der Abstand der Mittelpunkte kleiner ist als die Summe der Radien der beiden Kreise.&lt;br /&gt;
&lt;br /&gt;
 d12 = |m1 - m2|&lt;br /&gt;
 d12 &amp;lt; r1 + r2&lt;br /&gt;
&lt;br /&gt;
Um eine Kollision korrekt verarbeiten zu können werden folgende Nenngrößen benötigt:&lt;br /&gt;
* Tiefe der Kollision, in Physics-Simulation oft MTD genannt (Minimum Translation Distance) - im Falle von Kreisen die Differenz von Abstand und Summe der Radien&lt;br /&gt;
* Die Kollisionsnormale - im Falle von Kreisen der normierte Vektor von Mittelpunkt m1 nach m2&lt;br /&gt;
* Die Massen der beiden Objekte&lt;br /&gt;
* Die Geschwindigkeiten der beiden Objekte&lt;br /&gt;
&lt;br /&gt;
=== Kollisionslösung ===&lt;br /&gt;
&lt;br /&gt;
Bei einer Kollisionslösung von bereits geschehenen Kollisionen spricht man meistens vom &amp;quot;Collision Resolving&amp;quot;. &lt;br /&gt;
Es werden folgende Schritte durchgeführt:&lt;br /&gt;
* Die Objekte werden entlang der Kollisionsnormale massenabhängig insgesamt um die Tiefe der Kollision auseinandergezogen&lt;br /&gt;
* Die Geschwindigkeiten der Objekte werden in einen Normalen- und einen Tangentenanteil aufgeteilt (die Normale ist hier die Kollisionsnormale)&lt;br /&gt;
* Die Tangentenanteile der Geschwindigkeiten der Objekte werden unverändert übernommen, die Normalenanteile gespiegelt und massenabhängig verrechnet&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-13-Lebenszeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
* [[Medium:TutoriumPhysics-14-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-15-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-16-Physics.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-17-Physics.swf]]&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12839</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12839"/>
		<updated>2009-05-26T21:01:32Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel erklärt die Grundlagen der rechnergesteuerten Simulation von physikalischen Vorgängen.&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über eine direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (im Falle von Actionscript oder vergleichbaren Sprachen in jedem Frame bzw. bei jeder draw()-Methode).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betrachtet man also den Ort x zu zwei verschiedenen diskreten Zeitpunkten t0 und t1, ergibt sich aus der Differenz der beiden Orte die Geschwindigkeit zum Zeitpunkt t1.&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wenn man also nicht den Ort direkt, sondern die Geschwindigkeit ändert, welche man pro Zeitintervall auf den Ort addiert, erhält man lineare Bewegungen.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von &amp;quot;Rigid Body Physics&amp;quot; (Physik der starren Körper) interessiert die Beschleunigung von Massen, nicht aber die Verformung. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigung ist somit die erste Ableitung der Geschwindigkeit und die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen anstatt nur mit Geschwindigkeit (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Gravitation ziehen sich also zwei Körper immer gegenseitig. Wenn man allerdings Kräfte von sehr großen Körpern simulieren will (wie zum Beispiel die Erdanziehungskraft), so kann man die Kraft vernachlässigen, welche vom kleineren auf den größeren Körper wirkt. Desweiteren können Objekte unter einer bestimmten Größe als massengleich angesehen werden. Solche Kräfte werden in Physics-Simulationen als massenunabhängig betrachtet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus. Die Simulation von Federn ist sehr einfach zu implementieren und wirkt bei ausreichenden kleinen Zeitintervallen sehr realistisch.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf]] (dieses Beispiel implementiert bereits Kollisionserkennung und -lösung)&lt;br /&gt;
&lt;br /&gt;
== Kollsionen mit den Bildschirmgrenzen ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umgedreht werden (v *= -1). Außerdem wird das Objekt wieder so weit zurückgeschoben, sodass es nicht mehr mit den Grenzen kollidiert. Hiermit wird eine einfache Kollsionsabfrage simuliert. &lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf]]&lt;br /&gt;
&lt;br /&gt;
== Kollisionen zwischen kreisförmigen Objekten ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlage hierfür der zentrale, unelastische [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß]. Das Prinzip des zentralen Stoßes dient zur einfachen Kollsionserkennung und -lösung zwischen zwei kreisförmigen Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotationen ist dieses Prinzip nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kollsionserkennung ===&lt;br /&gt;
&lt;br /&gt;
In den meisten Physics-Engines werden Kollision erst erkannt, nachdem sie bereits geschehen sind. Es ist in jedem Fall möglich eine Kollision mithilfe von Projektionen der Körper entlang der Geschwindigkeitenvorherzusagen, der erhöhte Rechenaufwand für dieses Verfahren lohnt sich in den meisten Fällen jedoch nicht, da Effizienz vor Exaktheit geht.&lt;br /&gt;
&lt;br /&gt;
Da ein Kreis vom Mittelpunkt zu einem Punkt auf seiner Oberfläche unabhängig von der Richtung immer denselben Abstand hat, liegt eine Kollision zwischen zwei Kreisen vor, sobald der Abstand der Mittelpunkte kleiner ist als die Summe der Radien der beiden Kreise.&lt;br /&gt;
&lt;br /&gt;
 d12 = |m1 - m2|&lt;br /&gt;
 d12 &amp;lt; r1 + r2&lt;br /&gt;
&lt;br /&gt;
Um eine Kollision korrekt verarbeiten zu können werden folgende Nenngrößen benötigt:&lt;br /&gt;
* Tiefe der Kollision, in Physics-Simulation oft MTD genannt (Minimum Translation Distance) - im Falle von Kreisen die Differenz von Abstand und Summe der Radien&lt;br /&gt;
* Die Kollisionsnormale - im Falle von Kreisen der normierte Vektor von Mittelpunkt m1 nach m2&lt;br /&gt;
* Die Massen der beiden Objekte&lt;br /&gt;
* Die Geschwindigkeiten der beiden Objekte&lt;br /&gt;
&lt;br /&gt;
=== Kollisionslösung ===&lt;br /&gt;
&lt;br /&gt;
Bei einer Kollisionslösung von bereits geschehenen Kollisionen spricht man meistens vom &amp;quot;Collision Resolving&amp;quot;. &lt;br /&gt;
Es werden folgende Schritte durchgeführt:&lt;br /&gt;
* Die Objekte werden entlang der Kollisionsnormale massenabhängig insgesamt um die Tiefe der Kollision auseinandergezogen&lt;br /&gt;
* Die Geschwindigkeiten der Objekte werden in einen Normalen- und einen Tangentenanteil aufgeteilt (die Normale ist hier die Kollisionsnormale)&lt;br /&gt;
* Die Tangentenanteile der Geschwindigkeiten der Objekte werden unverändert übernommen, die Normalenanteile gespiegelt und massenabhängig verrechnet&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-13-Lebenszeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
* [[Medium:TutoriumPhysics-14-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-15-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-16-Physics.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-17-Physics.swf]]&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12838</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12838"/>
		<updated>2009-05-26T20:58:04Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über eine direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (im Falle von Actionscript oder vergleichbaren Sprachen in jedem Frame bzw. bei jeder draw()-Methode).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betrachtet man also den Ort x zu zwei verschiedenen diskreten Zeitpunkten t0 und t1, ergibt sich aus der Differenz der beiden Orte die Geschwindigkeit zum Zeitpunkt t1.&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wenn man also nicht den Ort direkt, sondern die Geschwindigkeit ändert, welche man pro Zeitintervall auf den Ort addiert, erhält man lineare Bewegungen.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von &amp;quot;Rigid Body Physics&amp;quot; (Physik der starren Körper) interessiert die Beschleunigung von Massen, nicht aber die Verformung. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigung ist somit die erste Ableitung der Geschwindigkeit und die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen anstatt nur mit Geschwindigkeit (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Gravitation ziehen sich also zwei Körper immer gegenseitig. Wenn man allerdings Kräfte von sehr großen Körpern simulieren will (wie zum Beispiel die Erdanziehungskraft), so kann man die Kraft vernachlässigen, welche vom kleineren auf den größeren Körper wirkt. Desweiteren können Objekte unter einer bestimmten Größe als massengleich angesehen werden. Solche Kräfte werden in Physics-Simulationen als massenunabhängig betrachtet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus. Die Simulation von Federn ist sehr einfach zu implementieren und wirkt bei ausreichenden kleinen Zeitintervallen sehr realistisch.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf]] (dieses Beispiel implementiert bereits Kollisionserkennung und -lösung)&lt;br /&gt;
&lt;br /&gt;
== Kollsionen mit den Bildschirmgrenzen ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umgedreht werden (v *= -1). Außerdem wird das Objekt wieder so weit zurückgeschoben, sodass es nicht mehr mit den Grenzen kollidiert. Hiermit wird eine einfache Kollsionsabfrage simuliert. &lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf]]&lt;br /&gt;
&lt;br /&gt;
== Kollisionen zwischen kreisförmigen Objekten ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlage hierfür der zentrale, unelastische [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß]. Das Prinzip des zentralen Stoßes dient zur einfachen Kollsionserkennung und -lösung zwischen zwei kreisförmigen Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotationen ist dieses Prinzip nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kollsionserkennung ===&lt;br /&gt;
&lt;br /&gt;
In den meisten Physics-Engines werden Kollision erst erkannt, nachdem sie bereits geschehen sind. Es ist in jedem Fall möglich eine Kollision mithilfe von Projektionen der Körper entlang der Geschwindigkeitenvorherzusagen, der erhöhte Rechenaufwand für dieses Verfahren lohnt sich in den meisten Fällen jedoch nicht, da Effizienz vor Exaktheit geht.&lt;br /&gt;
&lt;br /&gt;
Da ein Kreis vom Mittelpunkt zu einem Punkt auf seiner Oberfläche unabhängig von der Richtung immer denselben Abstand hat, liegt eine Kollision zwischen zwei Kreisen vor, sobald der Abstand der Mittelpunkte kleiner ist als die Summe der Radien der beiden Kreise.&lt;br /&gt;
&lt;br /&gt;
 d12 = |m1 - m2|&lt;br /&gt;
 d12 &amp;lt; r1 + r2&lt;br /&gt;
&lt;br /&gt;
Um eine Kollision korrekt verarbeiten zu können werden folgende Nenngrößen benötigt:&lt;br /&gt;
* Tiefe der Kollision, in Physics-Simulation oft MTD genannt (Minimum Translation Distance) - im Falle von Kreisen die Differenz von Abstand und Summe der Radien&lt;br /&gt;
* Die Kollisionsnormale - im Falle von Kreisen der normierte Vektor von Mittelpunkt m1 nach m2&lt;br /&gt;
* Die Massen der beiden Objekte&lt;br /&gt;
* Die Geschwindigkeiten der beiden Objekte&lt;br /&gt;
&lt;br /&gt;
=== Kollisionslösung ===&lt;br /&gt;
&lt;br /&gt;
Bei einer Kollisionslösung von bereits geschehenen Kollisionen spricht man meistens vom &amp;quot;Collision Resolving&amp;quot;. &lt;br /&gt;
Es werden folgende Schritte durchgeführt:&lt;br /&gt;
* Die Objekte werden entlang der Kollisionsnormale massenabhängig insgesamt um die Tiefe der Kollision auseinandergezogen&lt;br /&gt;
* Die Geschwindigkeiten der Objekte werden in einen Normalen- und einen Tangentenanteil aufgeteilt (die Normale ist hier die Kollisionsnormale)&lt;br /&gt;
* Die Tangentenanteile der Geschwindigkeiten der Objekte werden unverändert übernommen, die Normalenanteile gespiegelt und massenabhängig verrechnet&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-13-Lebenszeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
* [[Medium:TutoriumPhysics-14-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-15-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-16-Physics.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-17-Physics.swf]]&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12837</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12837"/>
		<updated>2009-05-26T20:53:36Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über eine direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (im Falle von Actionscript oder vergleichbaren Sprachen in jedem Frame bzw. bei jeder draw()-Methode).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betrachtet man also den Ort x zu zwei verschiedenen diskreten Zeitpunkten t0 und t1, ergibt sich aus der Differenz der beiden Orte die Geschwindigkeit zum Zeitpunkt t1.&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wenn man also nicht den Ort direkt, sondern die Geschwindigkeit ändert, welche man pro Zeitintervall auf den Ort addiert, erhält man lineare Bewegungen.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von &amp;quot;Rigid Body Physics&amp;quot; (Physik der starren Körper) interessiert die Beschleunigung von Massen, nicht aber die Verformung. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigung ist somit die erste Ableitung der Geschwindigkeit und die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen anstatt nur mit Geschwindigkeit (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Gravitation ziehen sich also zwei Körper immer gegenseitig. Wenn man allerdings Kräfte von sehr großen Körpern simulieren will (wie zum Beispiel die Erdanziehungskraft), so kann man die Kraft vernachlässigen, welche vom kleineren auf den größeren Körper wirkt. Desweiteren können Objekte unter einer bestimmten Größe als massengleich angesehen werden. Solche Kräfte werden in Physics-Simulationen als massenunabhängig betrachtet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus. Die Simulation von Federn ist sehr einfach zu implementieren und wirkt bei ausreichenden kleinen Zeitintervallen sehr realistisch.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf]]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umgedreht werden (v *= -1). So wird eine einfache Kollsionsabfrage simuliert.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf]]&lt;br /&gt;
&lt;br /&gt;
== Kollisionen zwischen kreisförmigen Objekten ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlage hierfür der zentrale, unelastische [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß]. Das Prinzip des zentralen Stoßes dient zur einfachen Kollsionserkennung und -lösung zwischen zwei kreisförmigen Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotationen ist dieses Prinzip nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kollsionserkennung ===&lt;br /&gt;
&lt;br /&gt;
In den meisten Physics-Engines werden Kollision erst erkannt, nachdem sie bereits geschehen sind. Es ist in jedem Fall möglich eine Kollision mithilfe von Projektionen der Körper entlang der Geschwindigkeitenvorherzusagen, der erhöhte Rechenaufwand für dieses Verfahren lohnt sich in den meisten Fällen jedoch nicht, da Effizienz vor Exaktheit geht.&lt;br /&gt;
&lt;br /&gt;
Da ein Kreis vom Mittelpunkt zu einem Punkt auf seiner Oberfläche unabhängig von der Richtung immer denselben Abstand hat, liegt eine Kollision zwischen zwei Kreisen vor, sobald der Abstand der Mittelpunkte kleiner ist als die Summe der Radien der beiden Kreise.&lt;br /&gt;
&lt;br /&gt;
 d12 = |m1 - m2|&lt;br /&gt;
 d12 &amp;lt; r1 + r2&lt;br /&gt;
&lt;br /&gt;
Um eine Kollision korrekt verarbeiten zu können werden folgende Nenngrößen benötigt:&lt;br /&gt;
* Tiefe der Kollision, in Physics-Simulation oft MTD genannt (Minimum Translation Distance) - im Falle von Kreisen die Differenz von Abstand und Summe der Radien&lt;br /&gt;
* Die Kollisionsnormale - im Falle von Kreisen der normierte Vektor von Mittelpunkt m1 nach m2&lt;br /&gt;
* Die Massen der beiden Objekte&lt;br /&gt;
* Die Geschwindigkeiten der beiden Objekte&lt;br /&gt;
&lt;br /&gt;
=== Kollisionslösung ===&lt;br /&gt;
&lt;br /&gt;
Bei einer Kollisionslösung von bereits geschehenen Kollisionen spricht man meistens vom &amp;quot;Collision Resolving&amp;quot;. &lt;br /&gt;
Es werden folgende Schritte durchgeführt:&lt;br /&gt;
* Die Objekte werden entlang der Kollisionsnormale massenabhängig insgesamt um die Tiefe der Kollision auseinandergezogen&lt;br /&gt;
* Die Geschwindigkeiten der Objekte werden in einen Normalen- und einen Tangentenanteil aufgeteilt (die Normale ist hier die Kollisionsnormale)&lt;br /&gt;
* Die Tangentenanteile der Geschwindigkeiten der Objekte werden unverändert übernommen, die Normalenanteile gespiegelt und massenabhängig verrechnet&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics13-Lebenszeit.swf]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&lt;br /&gt;
* [[Medium:TutoriumPhysics14-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics15-Partikel.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics16-Physics.swf]]&lt;br /&gt;
* [[Medium:TutoriumPhysics17-Physics.swf]]&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12836</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12836"/>
		<updated>2009-05-26T20:24:31Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über eine direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (im Falle von Actionscript oder vergleichbaren Sprachen in jedem Frame bzw. bei jeder draw()-Methode).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf|Zufällige Position]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betrachtet man also den Ort x zu zwei verschiedenen diskreten Zeitpunkten t0 und t1, ergibt sich aus der Differenz der beiden Orte die Geschwindigkeit zum Zeitpunkt t1.&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wenn man also nicht den Ort direkt, sondern die Geschwindigkeit ändert, welche man pro Zeitintervall auf den Ort addiert, erhält man lineare Bewegungen.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf 02]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf 02]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie unterschiedlich stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von Rigid Body Physics (Physik der starren Körper) interessiert uns hauptsächlich die Beschleunigung von Massen, nicht aber die Verformung. Es gilt:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, Beschleunigung ist die erste Ableitung der Geschwindigkeit und somit die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf 04]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf 05]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig: Bei Simulation der Erdanziehung als Beschleunigung wird die Kraft als massenunabhängig betrachtet. Warum?&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf 06]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf 07]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf 08]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf 09]]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umdrehen (v *= -1). So wird eine einfache Kollsionsabfrage mit Grenzen simuliert.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf 10]]&lt;br /&gt;
&lt;br /&gt;
== Kollsionserkennung und -lösung - [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß] ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip des zentralen Stoß dient zur einfachen Kollsionserkennung und -lösung zwischen zwei Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotation ist dieses Prinzip allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf 11]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf 12]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/13-Lebenszeit.swf 13]&lt;br /&gt;
&lt;br /&gt;
= Weitere Beispiele =&lt;br /&gt;
&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/14-Partikel.swf 14]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/15-Partikel.swf 15]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/16-Physics.swf 16]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/17-Physics.swf 17]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12835</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12835"/>
		<updated>2009-05-26T19:42:40Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (in unserem Fall einfach jedes Frame).&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf|Zufällige Position]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wir betrachten diesen Zusammenhang von der anderen Seite: Man verändert nicht den Ort direkt, sondern die Geschwindigkeit und addiert die Geschwindigkeit pro Zeitintervall auf den Ort.&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf 02]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf 02]]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie unterschiedlich stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Fall von Rigid Body Physics (Physik der starren Körper) interessiert uns hauptsächlich die Beschleunigung von Massen, nicht aber die Verformung. Es gilt:&lt;br /&gt;
&lt;br /&gt;
 Kraft = Masse * Beschleunigung&lt;br /&gt;
 F = m * a&lt;br /&gt;
 a = F / m&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, Beschleunigung ist die erste Ableitung der Geschwindigkeit und somit die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0, v0 = 1&lt;br /&gt;
 t1: x1 = 1, v1 = 2&lt;br /&gt;
 t3: x2 = 3, v2 = 3&lt;br /&gt;
 t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
 a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         public var ax: Number = 0;&lt;br /&gt;
         public var ay: Number = 0;&lt;br /&gt;
         		&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 50;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             ax = .2;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
         		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx += ax;&lt;br /&gt;
             vy += ay;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-04-Beschleunigung.swf 04]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-05-Beschleunigung.swf 05]]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an). &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig: Bei Simulation der Erdanziehung als Beschleunigung wird die Kraft als massenunabhängig betrachtet. Warum?&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-06-Gravitation.swf 06]]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus.&lt;br /&gt;
&lt;br /&gt;
 (1) F = k * x&lt;br /&gt;
 (2) F = k * ( xn - x0 )&lt;br /&gt;
 (3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
 (4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
 				&lt;br /&gt;
 spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-07-Federn.swf 07]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-08-Federn.swf 08]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-09-Federn.swf 09]]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umdrehen (v *= -1). So wird eine einfache Kollsionsabfrage mit Grenzen simuliert.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
     &amp;amp;&amp;amp; ( object.vx &amp;lt; 0 ) )&lt;br /&gt;
 {&lt;br /&gt;
     object.vx *= -1;&lt;br /&gt;
     object.x = object.radius;&lt;br /&gt;
 }			&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiele: [[Medium:TutoriumPhysics-10-Bounds.swf 10]]&lt;br /&gt;
&lt;br /&gt;
== Kollsionserkennung und -lösung - [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß] ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip des zentralen Stoß dient zur einfachen Kollsionserkennung und -lösung zwischen zwei Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotation ist dieses Prinzip allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie. &amp;lt;cite&amp;gt;Quelle: Wikipedia&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-11-Stoss.swf 11]]&lt;br /&gt;
* [[Medium:TutoriumPhysics-12-Stoss.swf 12]]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
 {&lt;br /&gt;
     object.lifetime--;&lt;br /&gt;
     object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
     if ( object.lifetime == 0 )&lt;br /&gt;
     {&lt;br /&gt;
         dead_objects.push( object );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/13-Lebenszeit.swf 13]&lt;br /&gt;
&lt;br /&gt;
= Weitere Beispiele =&lt;br /&gt;
&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/14-Partikel.swf 14]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/15-Partikel.swf 15]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/16-Physics.swf 16]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/17-Physics.swf 17]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12834</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12834"/>
		<updated>2009-05-26T19:31:54Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (in unserem Fall einfach jedes Frame).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:TutoriumPhysics-01-Ort.swf|Zufällige Position]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wir betrachten diesen Zusammenhang von der anderen Seite: Man verändert nicht den Ort direkt, sondern die Geschwindigkeit und addiert die Geschwindigkeit pro Zeitintervall auf den Ort.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
     &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
         public var vx: Number = 0;&lt;br /&gt;
         public var vy: Number = 0;&lt;br /&gt;
         	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             circle.x = 250;&lt;br /&gt;
             circle.y = 200;&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             vx = 1 - Math.random() * 2;&lt;br /&gt;
             vy = 1 - Math.random() * 2;&lt;br /&gt;
             circle.x += vx;&lt;br /&gt;
             circle.y += vy;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* [[Medium:TutoriumPhysics-02-Geschwindigkeit.swf 02]&lt;br /&gt;
* [[Medium:TutoriumPhysics-03-Geschwindigkeit.swf 02]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“).&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie unterschiedlich stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Fall von Rigid Body Physics (Physik der starren Körper) interessiert uns hauptsächlich die Beschleunigung von Massen, nicht aber die Verformung. Es gilt:&lt;br /&gt;
{{{&lt;br /&gt;
Kraft = Masse * Beschleunigung&lt;br /&gt;
F = m * a&lt;br /&gt;
a = F / m&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, Beschleunigung ist die erste Ableitung der Geschwindigkeit und somit die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
t0: x0 = 0, v0 = 1&lt;br /&gt;
t1: x1 = 1, v1 = 2&lt;br /&gt;
t3: x2 = 3, v2 = 3&lt;br /&gt;
t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		public var ax: Number = 0;&lt;br /&gt;
		public var ay: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 50;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			ax = .2;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx += ax;&lt;br /&gt;
			vy += ay;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/04-Beschleunigung.swf 04]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/05-Beschleunigung.swf 05]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an).&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wichtig: Bei Simulation der Erdanziehung als Beschleunigung wird die Kraft als massenunabhängig betrachtet. Warum?&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/06-Gravitation.swf 06]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
(1) F = k * x&lt;br /&gt;
(2) F = k * ( xn - x0 )&lt;br /&gt;
(3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
(4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
				&lt;br /&gt;
spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/07-Federn.swf 07]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/08-Federn.swf 08]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/09-Federn.swf 09]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umdrehen (v *= -1). So wird eine einfache Kollsionsabfrage mit Grenzen simuliert.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
    &amp;amp;&amp;amp; 	( object.vx &amp;lt; 0 ) )&lt;br /&gt;
{&lt;br /&gt;
    object.vx *= -1;&lt;br /&gt;
    object.x = object.radius;&lt;br /&gt;
}			&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/10-Bounds.swf 10]&lt;br /&gt;
&lt;br /&gt;
== Kollsionserkennung und -lösung - [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß] ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip des zentralen Stoß dient zur einfachen Kollsionserkennung und -lösung zwischen zwei Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotation ist dieses Prinzip allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/11-Stoss.swf 11]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/12-Stoss.swf 12]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
{&lt;br /&gt;
    object.lifetime--;&lt;br /&gt;
    object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
    if ( object.lifetime == 0 )&lt;br /&gt;
    {&lt;br /&gt;
	dead_objects.push( object );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/13-Lebenszeit.swf 13]&lt;br /&gt;
&lt;br /&gt;
= Weitere Beispiele =&lt;br /&gt;
&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/14-Partikel.swf 14]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/15-Partikel.swf 15]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/16-Physics.swf 16]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/17-Physics.swf 17]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12833</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12833"/>
		<updated>2009-05-26T19:28:40Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in [[Flex]] benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [[Wikipedia:Vektoralgebra|Vektoralgebra]], [[Wikipedia:Newtonsche_Mechanik|Newtonsche Mechanik]], [[Wikipedia:Hooksches_Gesetz|Hooksches Gesetz]]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (in unserem Fall einfach jedes Frame).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {&lt;br /&gt;
         public var circle: MovieClip;&lt;br /&gt;
     	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             circle = new MovieClip();&lt;br /&gt;
             circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
             circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
             addChild( circle );&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
             &lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
         {&lt;br /&gt;
             circle.x = Math.random() * 500;&lt;br /&gt;
             circle.y = Math.random() * 400;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Medium:PhysicsTutorium-01-Ort.swf|01]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 t0: x0 = 0&lt;br /&gt;
 t1: x1 = 1&lt;br /&gt;
 &lt;br /&gt;
 v = x1 - x0 = 1&lt;br /&gt;
&lt;br /&gt;
Wir betrachten diesen Zusammenhang von der anderen Seite: Man verändert nicht den Ort direkt, sondern die Geschwindigkeit und addiert die Geschwindigkeit pro Zeitintervall auf den Ort.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 250;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx = 1 - Math.random() * 2;&lt;br /&gt;
			vy = 1 - Math.random() * 2;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/02-Geschwindigkeit.swf 02]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/03-Geschwindigkeit.swf 03]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“).&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie unterschiedlich stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Fall von Rigid Body Physics (Physik der starren Körper) interessiert uns hauptsächlich die Beschleunigung von Massen, nicht aber die Verformung. Es gilt:&lt;br /&gt;
{{{&lt;br /&gt;
Kraft = Masse * Beschleunigung&lt;br /&gt;
F = m * a&lt;br /&gt;
a = F / m&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, Beschleunigung ist die erste Ableitung der Geschwindigkeit und somit die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
t0: x0 = 0, v0 = 1&lt;br /&gt;
t1: x1 = 1, v1 = 2&lt;br /&gt;
t3: x2 = 3, v2 = 3&lt;br /&gt;
t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		public var ax: Number = 0;&lt;br /&gt;
		public var ay: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 50;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			ax = .2;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx += ax;&lt;br /&gt;
			vy += ay;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/04-Beschleunigung.swf 04]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/05-Beschleunigung.swf 05]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an).&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wichtig: Bei Simulation der Erdanziehung als Beschleunigung wird die Kraft als massenunabhängig betrachtet. Warum?&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/06-Gravitation.swf 06]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
(1) F = k * x&lt;br /&gt;
(2) F = k * ( xn - x0 )&lt;br /&gt;
(3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
(4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
				&lt;br /&gt;
spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/07-Federn.swf 07]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/08-Federn.swf 08]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/09-Federn.swf 09]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umdrehen (v *= -1). So wird eine einfache Kollsionsabfrage mit Grenzen simuliert.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
    &amp;amp;&amp;amp; 	( object.vx &amp;lt; 0 ) )&lt;br /&gt;
{&lt;br /&gt;
    object.vx *= -1;&lt;br /&gt;
    object.x = object.radius;&lt;br /&gt;
}			&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/10-Bounds.swf 10]&lt;br /&gt;
&lt;br /&gt;
== Kollsionserkennung und -lösung - [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß] ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip des zentralen Stoß dient zur einfachen Kollsionserkennung und -lösung zwischen zwei Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotation ist dieses Prinzip allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/11-Stoss.swf 11]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/12-Stoss.swf 12]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
{&lt;br /&gt;
    object.lifetime--;&lt;br /&gt;
    object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
    if ( object.lifetime == 0 )&lt;br /&gt;
    {&lt;br /&gt;
	dead_objects.push( object );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/13-Lebenszeit.swf 13]&lt;br /&gt;
&lt;br /&gt;
= Weitere Beispiele =&lt;br /&gt;
&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/14-Partikel.swf 14]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/15-Partikel.swf 15]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/16-Physics.swf 16]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/17-Physics.swf 17]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Spielephysik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12820</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12820"/>
		<updated>2009-05-12T11:08:19Z</updated>

		<summary type="html">&lt;p&gt;Bridges: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in Flex benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [http://de.wikipedia.org/wiki/Vektoralgebra Vektoralgebra], [http://de.wikipedia.org/wiki/Newtonsche_Mechanik Newtonsche Mechanik], [http://de.wikipedia.org/wiki/Hooksches_Gesetz Hooksches Gesetz]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (in unserem Fall einfach jedes Frame).&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			circle.x = Math.random() * 500;&lt;br /&gt;
			circle.y = Math.random() * 400;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/01-Ort.swf 01]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
t0: x0 = 0&lt;br /&gt;
t1: x1 = 1&lt;br /&gt;
&lt;br /&gt;
v = x1 - x0 = 1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Wir betrachten diesen Zusammenhang von der anderen Seite: Man verändert nicht den Ort direkt, sondern die Geschwindigkeit und addiert die Geschwindigkeit pro Zeitintervall auf den Ort.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 250;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx = 1 - Math.random() * 2;&lt;br /&gt;
			vy = 1 - Math.random() * 2;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/02-Geschwindigkeit.swf 02]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/03-Geschwindigkeit.swf 03]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“).&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie unterschiedlich stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Fall von Rigid Body Physics (Physik der starren Körper) interessiert uns hauptsächlich die Beschleunigung von Massen, nicht aber die Verformung. Es gilt:&lt;br /&gt;
{{{&lt;br /&gt;
Kraft = Masse * Beschleunigung&lt;br /&gt;
F = m * a&lt;br /&gt;
a = F / m&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, Beschleunigung ist die erste Ableitung der Geschwindigkeit und somit die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
t0: x0 = 0, v0 = 1&lt;br /&gt;
t1: x1 = 1, v1 = 2&lt;br /&gt;
t3: x2 = 3, v2 = 3&lt;br /&gt;
t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		public var ax: Number = 0;&lt;br /&gt;
		public var ay: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 50;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			ax = .2;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx += ax;&lt;br /&gt;
			vy += ay;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/04-Beschleunigung.swf 04]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/05-Beschleunigung.swf 05]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an).&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wichtig: Bei Simulation der Erdanziehung als Beschleunigung wird die Kraft als massenunabhängig betrachtet. Warum?&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/06-Gravitation.swf 06]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
(1) F = k * x&lt;br /&gt;
(2) F = k * ( xn - x0 )&lt;br /&gt;
(3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
(4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
				&lt;br /&gt;
spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/07-Federn.swf 07]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/08-Federn.swf 08]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/09-Federn.swf 09]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umdrehen (v *= -1). So wird eine einfache Kollsionsabfrage mit Grenzen simuliert.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
    &amp;amp;&amp;amp; 	( object.vx &amp;lt; 0 ) )&lt;br /&gt;
{&lt;br /&gt;
    object.vx *= -1;&lt;br /&gt;
    object.x = object.radius;&lt;br /&gt;
}			&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/10-Bounds.swf 10]&lt;br /&gt;
&lt;br /&gt;
== Kollsionserkennung und -lösung - [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß] ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip des zentralen Stoß dient zur einfachen Kollsionserkennung und -lösung zwischen zwei Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotation ist dieses Prinzip allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/11-Stoss.swf 11]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/12-Stoss.swf 12]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
{&lt;br /&gt;
    object.lifetime--;&lt;br /&gt;
    object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
    if ( object.lifetime == 0 )&lt;br /&gt;
    {&lt;br /&gt;
	dead_objects.push( object );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/13-Lebenszeit.swf 13]&lt;br /&gt;
&lt;br /&gt;
= Weitere Beispiele =&lt;br /&gt;
&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/14-Partikel.swf 14]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/15-Partikel.swf 15]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/16-Physics.swf 16]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/17-Physics.swf 17]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Physik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12819</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12819"/>
		<updated>2009-05-12T11:07:19Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Tutorium für Physics in AS3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Anmerkungen =&lt;br /&gt;
&lt;br /&gt;
Um die im Artikel enthaltenen Beispiel auszuführen werden Grundkenntnisse in Flex benötigt. Eine einfache Einführung bietet dieses [http://www.webmasterpro.de/coding/news/2008/04/04/flex-builder-kostenlos-fuer-studenten.html Tutorial]. Die Theorie des Artikels ist jedoch in jeder Programmiersprache realisierbar. &lt;br /&gt;
&lt;br /&gt;
Basis aller Code-Beispiele ist folgende Klasse:&lt;br /&gt;
&lt;br /&gt;
 package &lt;br /&gt;
 {	&lt;br /&gt;
     import flash.display.MovieClip;&lt;br /&gt;
     import flash.display.Sprite;&lt;br /&gt;
     import flash.events.Event;&lt;br /&gt;
 &lt;br /&gt;
     [ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
     public class Lecture extends Sprite&lt;br /&gt;
     {	&lt;br /&gt;
         public function Lecture()&lt;br /&gt;
         {&lt;br /&gt;
             addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
         }&lt;br /&gt;
 		&lt;br /&gt;
         public function on_enter_frame( event: Event ): void&lt;br /&gt;
 	 {&lt;br /&gt;
             trace( &amp;quot;enter frame&amp;quot; );&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Definition =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Eine Physik-Engine ist ein meist separater Teil eines Computerprogramms, welcher zur Simulation physikalischer Prozesse dient. Ziele sind eine Vereinfachung der Programmierung und die Vermittlung von realistischer Umgebung. Hauptanwendungsgebiete sind moderne Computerspiele und Simulationssoftware.&lt;br /&gt;
Anders als es die Bezeichnung vermuten lässt, muss dabei nicht zwangsläufig ein physikalisches Konzept zu Grunde liegen. Dies liegt oft an der immensen Komplexität der auf physikalischen Prozessen basierenden Berechnungen. Da in solchen Fällen meist ein Anspruch auf Echtzeitfähigkeit besteht, geht Effizienz vor Exaktheit. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Einsatzgebiete =&lt;br /&gt;
&lt;br /&gt;
Physics-Engines werden in der Regel in der Spielebrance häufig eingesetzt. Für Simulationen eignen sich diese nur bedingt, da sie oft keinen Fokus auf Exaktheit legen. Es folgen einige Beispiele für mögliche Anwendungsfälle:&lt;br /&gt;
&lt;br /&gt;
* Spiele&lt;br /&gt;
** [http://www.sideroller.com/ Sideroller]&lt;br /&gt;
** [http://magic.pen.fizzlebot.com/magic-pen.swf Magic Pen]&lt;br /&gt;
** [http://www.flashphysicsgames.com/do-not-hotlink/ragdollcannon15.swf Ragdoll Cannon]&lt;br /&gt;
* Simulationen&lt;br /&gt;
** [http://cove.org/ape/demo2.htm APE Demo]&lt;br /&gt;
** [http://lab.polygonal.de/files/AS3/verletblob.swf Verlet Blob]&lt;br /&gt;
** [http://www.nulldesign.de/exp/f9_particle2.swf Fireflies]&lt;br /&gt;
&lt;br /&gt;
= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt die mathematischen und physikalischen Grundlagen für eine einfache Physics-Simulation. Ein grundsätzliches Verständnis folgender Gebiete wird vorausgesetzt:  [http://de.wikipedia.org/wiki/Vektoralgebra Vektoralgebra], [http://de.wikipedia.org/wiki/Newtonsche_Mechanik Newtonsche Mechanik], [http://de.wikipedia.org/wiki/Hooksches_Gesetz Hooksches Gesetz]&lt;br /&gt;
&lt;br /&gt;
== Ort ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Typischerweise spricht man in der Mechanik von Massenpunkten. Jeder Massenpunkt besitzt eine endliche, von null verschiedene Masse m. Jedem Massenpunkt ist zu jeder Zeit t ein eindeutiger Ort q = q(t)  zugeordnet. &amp;lt;cite&amp;gt;(Quelle: Wikipedia)&amp;lt;/cite&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im einem zweidimensionalen Raum wird ein Ort durch einen Vektor v(x,y) beschrieben. Bei Bildschirmkoordinaten ist wichtig zu beachten, dass der Ursprung links oben liegt und nach rechts unten ins Positive verläuft.&lt;br /&gt;
&lt;br /&gt;
Die einfachste Form von Bewegung erfolgt über direkte Positionsänderung zu jedem beliebigen Zeitpunkt t (in unserem Fall einfach jedes Frame).&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			circle.x = Math.random() * 500;&lt;br /&gt;
			circle.y = Math.random() * 400;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/01-Ort.swf 01]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Unter der Geschwindigkeit eines Objekts versteht man die von ihm zurückgelegte Wegstrecke s pro Zeit t. Mathematisch entspricht die Geschwindigkeit der Ableitung des Ortes nach der Zeit.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
t0: x0 = 0&lt;br /&gt;
t1: x1 = 1&lt;br /&gt;
&lt;br /&gt;
v = x1 - x0 = 1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Wir betrachten diesen Zusammenhang von der anderen Seite: Man verändert nicht den Ort direkt, sondern die Geschwindigkeit und addiert die Geschwindigkeit pro Zeitintervall auf den Ort.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 250;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx = 1 - Math.random() * 2;&lt;br /&gt;
			vy = 1 - Math.random() * 2;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/02-Geschwindigkeit.swf 02]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/03-Geschwindigkeit.swf 03]&lt;br /&gt;
&lt;br /&gt;
== Masse ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Masse ist eine Ursache von Gravitation („schwere Masse“) und ein Maß für die Trägheit eines Körpers, das heißt seinen Widerstand gegenüber Änderungen seines Bewegungszustands („träge Masse“).&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das heißt, die Masse bestimmt wie unterschiedlich stark Körper unterschiedlicher Masse von Kräften beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
== Kräfte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Kraft ist eine physikalische Größe und ein grundlegender Begriff insbesondere der Mechanik, die die Beschleunigung von Massen oder die Verformung von Körpern verursacht.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Fall von Rigid Body Physics (Physik der starren Körper) interessiert uns hauptsächlich die Beschleunigung von Massen, nicht aber die Verformung. Es gilt:&lt;br /&gt;
{{{&lt;br /&gt;
Kraft = Masse * Beschleunigung&lt;br /&gt;
F = m * a&lt;br /&gt;
a = F / m&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
== Beschleunigung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Beschleunigung ist die Änderung der Geschwindigkeit eines Körpers.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, Beschleunigung ist die erste Ableitung der Geschwindigkeit und somit die zweite Ableitung des Ortes. Um natürlich wirkende Bewegungen zu erzielen, arbeitet man mit Beschleunigungen (Vergleich: Ease-In/Ease-Out in Flash oder After Effects). &lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
t0: x0 = 0, v0 = 1&lt;br /&gt;
t1: x1 = 1, v1 = 2&lt;br /&gt;
t3: x2 = 3, v2 = 3&lt;br /&gt;
t4: x3 = 6, v3 = 4&lt;br /&gt;
&lt;br /&gt;
a = v3 - v2 = v2 - v1 = v1 - v0 = 1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
package &lt;br /&gt;
{	&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
&lt;br /&gt;
	[ SWF( backgroundColor = &#039;0xFFFFFF&#039;, width = &#039;500&#039;, height = &#039;400&#039; ) ]&lt;br /&gt;
	public class Lecture extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		public var circle: MovieClip;&lt;br /&gt;
		public var vx: Number = 0;&lt;br /&gt;
		public var vy: Number = 0;&lt;br /&gt;
		public var ax: Number = 0;&lt;br /&gt;
		public var ay: Number = 0;&lt;br /&gt;
		&lt;br /&gt;
		public function Lecture()&lt;br /&gt;
		{&lt;br /&gt;
			circle = new MovieClip();&lt;br /&gt;
			circle.graphics.lineStyle( 1, 0 );&lt;br /&gt;
			circle.graphics.drawCircle( 0, 0, 20 );&lt;br /&gt;
			circle.x = 50;&lt;br /&gt;
			circle.y = 200;&lt;br /&gt;
			ax = .2;&lt;br /&gt;
			addChild( circle );&lt;br /&gt;
			addEventListener( Event.ENTER_FRAME, on_enter_frame );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function on_enter_frame( event: Event ): void&lt;br /&gt;
		{&lt;br /&gt;
			vx += ax;&lt;br /&gt;
			vy += ay;&lt;br /&gt;
			circle.x += vx;&lt;br /&gt;
			circle.y += vy;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/04-Beschleunigung.swf 04]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/05-Beschleunigung.swf 05]&lt;br /&gt;
&lt;br /&gt;
== Gravitation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Die Gravitation (v. lat. gravitas „Schwere“) ist eine der vier Grundkräfte der Physik. Sie bezeichnet die gegenseitige Anziehung von Massen. Sie bewirkt damit beispielsweise, dass Gegenstände zu Boden fallen (sie werden von beispielsweise der Erde angezogen und ziehen diese im Gegenzug an).&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wichtig: Bei Simulation der Erdanziehung als Beschleunigung wird die Kraft als massenunabhängig betrachtet. Warum?&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/06-Gravitation.swf 06]&lt;br /&gt;
&lt;br /&gt;
== Federn (Hooksches Gesetz) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Das Hooke&#039;sche Gesetz (nach Sir Robert Hooke) beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung annähernd proportional zur einwirkenden Belastung ist, durch einen streng linearen Zusammenhang (linear-elastisches Verhalten). [..] Das Hookesche Gesetz kann also dort zur Anwendung kommen, wo die wirkende Kraft nahezu linear von der Auslenkung oder Ausdehnung abhängt. Das kann für sehr kleine Δl der Fall sein oder beispielsweise auch für einen großen Dehnungsbereich bei Zug- und Druckfedern.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Bereich der Physics werden Federn oft benutzt um aus einer Menge von verbundenen Massepunkten einen Körper zu simulieren. Der große Vorteil hierbei ist, dass die Rotation komplexer Körper nicht berechnet werden muß. Für exakte und komplexere Simulationen reicht ein Netzt von Massepunkten allerdings nicht aus.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
(1) F = k * x&lt;br /&gt;
(2) F = k * ( xn - x0 )&lt;br /&gt;
(3) F1 = k * ( xn - x0 ) * m2 / ( m1 + m2 )&lt;br /&gt;
(4) F2 = k * ( xn - x0 ) * m1 / ( m1 + m2 ) * -1&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
spring.object_a.vx += ( f * dx * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
spring.object_a.vy += ( f * dy * ( spring.object_b.mass / m12 ) );&lt;br /&gt;
				&lt;br /&gt;
spring.object_b.vx -= ( f * dx * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
spring.object_b.vy -= ( f * dy * ( spring.object_a.mass / m12 ) );&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/07-Federn.swf 07]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/08-Federn.swf 08]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/09-Federn.swf 09]&lt;br /&gt;
&lt;br /&gt;
== Einschub: Einfache Negation von Geschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Bei Grenzen im 2D-Raum, welche parallel zur X- oder Y-Achse verlaufen, kann der entsprechende Geschwindigkeitsanteil eines Objekts einfach umdrehen (v *= -1). So wird eine einfache Kollsionsabfrage mit Grenzen simuliert.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( 	( object.x - object.radius &amp;lt; 0 )&lt;br /&gt;
    &amp;amp;&amp;amp; 	( object.vx &amp;lt; 0 ) )&lt;br /&gt;
{&lt;br /&gt;
    object.vx *= -1;&lt;br /&gt;
    object.x = object.radius;&lt;br /&gt;
}			&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/10-Bounds.swf 10]&lt;br /&gt;
&lt;br /&gt;
== Kollsionserkennung und -lösung - [http://de.wikipedia.org/wiki/Sto%C3%9F_(Physik) Stoß] ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip des zentralen Stoß dient zur einfachen Kollsionserkennung und -lösung zwischen zwei Objekten, deren Massenschwerpunkte im Zentrum liegen. Für komplexere Objekte und Berechnungen von Rotation ist dieses Prinzip allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;[..] Im folgenden wird nur der Fall des zentralen Stoßes betrachtet. Wird hierbei freie Beweglichkeit der Stoßpartner vorausgesetzt, so bleiben die Geschwindigkeitskomponenten beider Stoßpartner normal zur Stoßlinie unverändert: vn = vn, da die Stoßkräfte nur entlang der Stoßlinie wirken können. Da die Schwerpunkte auf der Stoßlinie liegen, erfahren die Körper nach dem Stoß keine Rotationsbewegung. Im folgenden bezeichnen darum v1 und v2 die (skalaren) Geschwindigkeitskomponenten parallel zur Stoßlinie.&amp;quot;&#039;&#039; &#039;&#039;&#039;[Quelle: Wikipedia]&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/11-Stoss.swf 11]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/12-Stoss.swf 12]&lt;br /&gt;
&lt;br /&gt;
== Lebenszeit ==&lt;br /&gt;
&lt;br /&gt;
In Partikelsystemen (vereinfachte Physik-Simulation ohne Kollisionen, werden benutzt um z.B. Rauch, Feuer, Flüssigkeit zu simulieren) werden allen Objekten Lebenszeiten zugeordnet. Dieser werden über die Zeit verringert und führen dazu, dass das Objekt &amp;quot;stirbt&amp;quot;, wenn die Lebenszeit abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
{{{&lt;br /&gt;
...&lt;br /&gt;
if ( object.lifetime &amp;gt; 0 )&lt;br /&gt;
{&lt;br /&gt;
    object.lifetime--;&lt;br /&gt;
    object.alpha = ( object.lifetime / lifetime_maximum );&lt;br /&gt;
    if ( object.lifetime == 0 )&lt;br /&gt;
    {&lt;br /&gt;
	dead_objects.push( object );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}}}&lt;br /&gt;
&lt;br /&gt;
Beispiel: [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/13-Lebenszeit.swf 13]&lt;br /&gt;
&lt;br /&gt;
= Weitere Beispiele =&lt;br /&gt;
&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/14-Partikel.swf 14]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/15-Partikel.swf 15]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/16-Physics.swf 16]&lt;br /&gt;
 * [http://aa001.no-ip.org:8000/mm_informatik/attachment/wiki/mm8/tutorium/as3physics/17-Physics.swf 17]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
[[Kategorie:Physik]]&lt;br /&gt;
[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12818</id>
		<title>AS3-Tutorium:Physics</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics&amp;diff=12818"/>
		<updated>2009-05-12T07:27:09Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Die Seite wurde neu angelegt: Kategorie:Flex Kategorie:Flash Kategorie:Flash-HowTo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Flex]]&lt;br /&gt;
[[Kategorie:Flash]]&lt;br /&gt;
[[Kategorie:Flash-HowTo]]&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-17-Physics.swf&amp;diff=12817</id>
		<title>Datei:TutoriumPhysics-17-Physics.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-17-Physics.swf&amp;diff=12817"/>
		<updated>2009-05-12T07:21:44Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-16-Physics.swf&amp;diff=12816</id>
		<title>Datei:TutoriumPhysics-16-Physics.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-16-Physics.swf&amp;diff=12816"/>
		<updated>2009-05-12T07:21:32Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-15-Partikel.swf&amp;diff=12815</id>
		<title>Datei:TutoriumPhysics-15-Partikel.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-15-Partikel.swf&amp;diff=12815"/>
		<updated>2009-05-12T07:21:19Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-14-Partikel.swf&amp;diff=12814</id>
		<title>Datei:TutoriumPhysics-14-Partikel.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-14-Partikel.swf&amp;diff=12814"/>
		<updated>2009-05-12T07:21:01Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-13-Lebenszeit.swf&amp;diff=12813</id>
		<title>Datei:TutoriumPhysics-13-Lebenszeit.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-13-Lebenszeit.swf&amp;diff=12813"/>
		<updated>2009-05-12T07:20:44Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-12-Stoss.swf&amp;diff=12812</id>
		<title>Datei:TutoriumPhysics-12-Stoss.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-12-Stoss.swf&amp;diff=12812"/>
		<updated>2009-05-12T07:20:30Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-11-Stoss.swf&amp;diff=12811</id>
		<title>Datei:TutoriumPhysics-11-Stoss.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-11-Stoss.swf&amp;diff=12811"/>
		<updated>2009-05-12T07:20:15Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-10-Bounds.swf&amp;diff=12810</id>
		<title>Datei:TutoriumPhysics-10-Bounds.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-10-Bounds.swf&amp;diff=12810"/>
		<updated>2009-05-12T07:19:58Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-09-Federn.swf&amp;diff=12809</id>
		<title>Datei:TutoriumPhysics-09-Federn.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-09-Federn.swf&amp;diff=12809"/>
		<updated>2009-05-12T07:19:45Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-08-Federn.swf&amp;diff=12808</id>
		<title>Datei:TutoriumPhysics-08-Federn.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-08-Federn.swf&amp;diff=12808"/>
		<updated>2009-05-12T07:19:25Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-07-Federn.swf&amp;diff=12807</id>
		<title>Datei:TutoriumPhysics-07-Federn.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-07-Federn.swf&amp;diff=12807"/>
		<updated>2009-05-12T07:19:05Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-06-Gravitation.swf&amp;diff=12806</id>
		<title>Datei:TutoriumPhysics-06-Gravitation.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-06-Gravitation.swf&amp;diff=12806"/>
		<updated>2009-05-12T07:17:59Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-05-Beschleunigung.swf&amp;diff=12805</id>
		<title>Datei:TutoriumPhysics-05-Beschleunigung.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-05-Beschleunigung.swf&amp;diff=12805"/>
		<updated>2009-05-12T07:17:41Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-04-Beschleunigung.swf&amp;diff=12804</id>
		<title>Datei:TutoriumPhysics-04-Beschleunigung.swf</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Datei:TutoriumPhysics-04-Beschleunigung.swf&amp;diff=12804"/>
		<updated>2009-05-12T07:17:26Z</updated>

		<summary type="html">&lt;p&gt;Bridges: Autor: Alexander Lawrence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Alexander Lawrence&lt;/div&gt;</summary>
		<author><name>Bridges</name></author>
	</entry>
</feed>