<?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=Jakobw</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=Jakobw"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Jakobw"/>
	<updated>2026-07-17T15:37:23Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=CRUD&amp;diff=13165</id>
		<title>CRUD</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=CRUD&amp;diff=13165"/>
		<updated>2009-07-17T08:42:04Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* CRUD-Frameworks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
&#039;&#039;&#039;CRUD&#039;&#039;&#039; ist ein Akronym für die grundlegenden Datenbankoperationen &lt;br /&gt;
*&#039;&#039;&#039;C&#039;&#039;&#039;reate(Datensatz anlegen), &lt;br /&gt;
*&#039;&#039;&#039;I&#039;&#039;&#039;nsert(Datensatz lesen), &lt;br /&gt;
*&#039;&#039;&#039;U&#039;&#039;&#039;pdate(Datensatz aktualisieren) und &lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;elete(Datensatz löschen).&lt;br /&gt;
&lt;br /&gt;
=Alternative Definitionen=&lt;br /&gt;
&lt;br /&gt;
Alternative Ausführungen des Akronyms &#039;&#039;&#039;CRUD&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;R&#039;&#039;&#039;etrieve an Stelle von &#039;&#039;&#039;R&#039;&#039;&#039;ead &lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;estroy an Stelle von &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
Alternative Akronyme sind &lt;br /&gt;
*&#039;&#039;&#039;RUDI&#039;&#039;&#039; (Insert an Stelle von Create) &lt;br /&gt;
*&#039;&#039;&#039;CDUR&#039;&#039;&#039; (in Anlehnung an die Tonart)&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
*&#039;&#039;&#039;C&#039;&#039;&#039;reate: INSERT INTO haendler (name) VALUES (&#039;lisa&#039;)&lt;br /&gt;
*&#039;&#039;&#039;R&#039;&#039;&#039;ead: SELECT * FROM haendler WHERE name=&#039;lisa&#039;&lt;br /&gt;
*&#039;&#039;&#039;U&#039;&#039;&#039;pdate: UPDATE haendler SET name=‘lina&#039; WHERE name=&#039;lisa&#039;&lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;elete: DELETE FROM haendler WHERE name=&#039;lina&#039;&lt;br /&gt;
&lt;br /&gt;
=CRUD-Frameworks=&lt;br /&gt;
&lt;br /&gt;
Man spricht von einem CRUD-Framework, wenn man mithilfe einer grafischen Oberfläche die in der Persistenzschicht gespeicherten Datensätze mithilfe von CRUD-Operationen bearbeiten kann. Weiterhin gibt es eine Entsprechung von relationalen Datensätzen auf Persistenzebene zu Objekten in der Anwendungsschicht, man arbeitet also stetig objektorientiert. CRUD-Frameworks unterstützen Transaktionen, eine CRUD-Operation ist ein atomarer Vorgang.&lt;br /&gt;
&lt;br /&gt;
Bekannte CRUD-Frameworks sind z.B. Ruby on Rails oder Django.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[[Wikipedia:CRUD ]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Vererbung_in_Datenbanken&amp;diff=13124</id>
		<title>Vererbung in Datenbanken</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Vererbung_in_Datenbanken&amp;diff=13124"/>
		<updated>2009-07-17T07:06:01Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Möglichkeiten wie man Vererbungen, sogenannte IS-A-Beziehungen, in Datenbanken realisieren kann. Die unterschiedlichen Implementierungsmöglichkeiten bringen jeweils Vor- und Nachteile, insbesondere beim Zugriff auf die jeweiligen Tabellen, mit sich.&lt;br /&gt;
&lt;br /&gt;
=Manuelle Definition=&lt;br /&gt;
==Implementierungsvarianten Relationenschema==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
 e: id, e1, e2&lt;br /&gt;
 f: id, e1, e2, f1, f2 (id -&amp;gt; E: id)&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
 e: id, e1, e2&lt;br /&gt;
 f: id, f1, f2 (id -&amp;gt; E: id)&lt;br /&gt;
&lt;br /&gt;
Hierbei ist die Auflistung aller Objekte der Tabelle e einfacher, für alle Objekte und f und deren zugehörigen von e geerbten Attribute ist ein einfacher Join möglich. Die zweite Variante ist die sauberste aller Implementierungsmöglichkeiten und wird empfohlen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Möglichkeit(nicht empfohlen)&lt;br /&gt;
 e: id, e1, e2, f1*, f2*&lt;br /&gt;
&lt;br /&gt;
Es ist theoretisch möglich für die gesamte Vererbungs-Hierachie nur eine einzige Tabelle zu definieren. Diese enthält dann alle Attribute der Basisklasse sowie aller Subklassen. Die Attribute der Subklassen dürfen NULL werden. &lt;br /&gt;
&lt;br /&gt;
Der große Nachteil dieser Variante: Es können Inkonsistenzen auftreten. Attribute wie f1 und f2, welche bei einem Objekt der Klasse f nicht undefiniert sein dürften; können nun den WERT NULL annehmen. Denkbar wäre z.B. dass f1 mit einem richtigen Wert initialisiert wird, während f2 leer bleibt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Objekte der Art e:&lt;br /&gt;
 SELECT id, e1, e2 FROM e&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT id, e1, e2 FROM F&lt;br /&gt;
&lt;br /&gt;
Alle Informationen über f-Objekte:&lt;br /&gt;
 SELECT id, e1, e2, f1, f2 FROM f&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Objekte der Art e:&lt;br /&gt;
 SELECT id, e1, e2 FROM e&lt;br /&gt;
&lt;br /&gt;
Alle Informationen über f-Objekte:&lt;br /&gt;
 SELECT id, e1, e2, f1, f2 FROM e, f&lt;br /&gt;
 WHERE e.id = f.id&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Direkte Vererbung in SQL=&lt;br /&gt;
&lt;br /&gt;
Seit SQL:1999 wird einfache Attributvererbung auch direkt unterstützt. Man muss sich nicht mehr darum kümmern welche Attribute in welche Tabelle gehören. Auch ist der Zugriff ohne zusätzliche JOIN- oder UNION-Operationen möglich.&lt;br /&gt;
&lt;br /&gt;
Jedoch unterstützen einige Datenbank-Management-Systeme Vererbung gar nicht oder nicht standard-konform. Im Folgenden wird deshalb der SQL-Standard sowie PostgreSQL behandelt.&lt;br /&gt;
&lt;br /&gt;
==Erstellung==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SQL-Standard:&#039;&#039;&#039;&lt;br /&gt;
 CREATE TABLE e(...);&lt;br /&gt;
 CREATE TABLE f UNDER e(...);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PostgreSQL:&#039;&#039;&#039;&lt;br /&gt;
 CREATE TABLE e(...);&lt;br /&gt;
 CREATE TABLE f(...) inherits (e)&lt;br /&gt;
&lt;br /&gt;
Hierbei erbt f alle Attribute und Integritätsbedingungen von e, auch den Primärschlüssel. &lt;br /&gt;
f kann,  abgesehen vom Primärschlüssel, weitere Attribute und Integritätsbedingungen definieren.&lt;br /&gt;
&lt;br /&gt;
==Zugriff==&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM e&lt;br /&gt;
&lt;br /&gt;
Auf diese Art und Weise werden alle Tupel von e einschließlich der Tupel von f(reduziert auf die geerbten Attribute von e) selektiert.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM ONLY(e)&lt;br /&gt;
&lt;br /&gt;
Hierbei erhält man ausschließlich die Tupel von e, nicht aber Tupel von Subklassen wie f.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
*Kowarschick, &amp;quot;Multimedia-Datenbanksysteme&amp;quot;, Sommersemester 2009, Hochschule Augsburg&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HowTo]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:SQL]]&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Vererbung_in_Datenbanken&amp;diff=13123</id>
		<title>Vererbung in Datenbanken</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Vererbung_in_Datenbanken&amp;diff=13123"/>
		<updated>2009-07-17T06:56:49Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: Die Seite wurde neu angelegt: {{In Bearbeitung}}  Es gibt verschiedene Möglichkeiten wie man Vererbungen, sogenannte IS-A-Beziehungen, in Datenbanken realisieren kann. Die unterschiedlichen Impleme...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Möglichkeiten wie man Vererbungen, sogenannte IS-A-Beziehungen, in Datenbanken realisieren kann. Die unterschiedlichen Implementierungsmöglichkeiten bringen jeweils Vor- und Nachteile, insbesondere beim Zugriff auf die jeweiligen Tabellen, mit sich.&lt;br /&gt;
&lt;br /&gt;
=Manuelle Definition=&lt;br /&gt;
==Implementierungsvarianten Relationenschema==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
 e: id, e1, e2&lt;br /&gt;
 f: id, e1, e2, f1, f2 (id -&amp;gt; E: id)&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
 e: id, e1, e2&lt;br /&gt;
 f: id, f1, f2 (id -&amp;gt; E: id)&lt;br /&gt;
&lt;br /&gt;
Hierbei ist die Auflistung aller Objekte der Tabelle e einfacher, für alle Objekte und f und deren zugehörigen von e geerbten Attribute ist ein einfacher Join möglich. Die zweite Variante ist die sauberste aller Implementierungsmöglichkeiten und wird empfohlen.&lt;br /&gt;
&lt;br /&gt;
3. Möglichkeit(nicht empfohlen)&lt;br /&gt;
 e: id, e1, e2, f1*, f2*&lt;br /&gt;
&lt;br /&gt;
Es ist theoretisch möglich für die gesamte Vererbungs-Hierachie nur eine einzige Tabelle zu definieren. Diese enthält dann alle Attribute der Basisklasse sowie aller Subklassen. Die Attribute der Subklassen dürfen NULL werden. &lt;br /&gt;
&lt;br /&gt;
Der große Nachteil dieser Variante: Es können Inkonsistenzen auftreten. Attribute wie f1 und f2, welche bei einem Objekt der Klasse f nicht undefiniert sein dürften; können nun den WERT NULL annehmen. Denkbar wäre z.B. dass f1 mit einem richtigen Wert initialisiert wird, während f2 leer bleibt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff==&lt;br /&gt;
&#039;&#039;&#039;1. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Objekte der Art e:&lt;br /&gt;
 SELECT id, e1, e2 FROM e&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT id, e1, e2 FROM F&lt;br /&gt;
&lt;br /&gt;
Alle Informationen über f-Objekte:&lt;br /&gt;
 SELECT id, e1, e2, f1, f2 FROM f&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Möglichkeit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Objekte der Art e:&lt;br /&gt;
 SELECT id, e1, e2 FROM e&lt;br /&gt;
&lt;br /&gt;
Alle Informationen über f-Objekte:&lt;br /&gt;
 SELECT id, e1, e2, f1, f2 FROM e, f&lt;br /&gt;
 WHERE e.id = f.id&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Direkte Vererbung in SQL=&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
Wenn die Definitionen und/oder die Anmerkungen nicht von einem selbst stammen, sollte man die Quellen angeben&lt;br /&gt;
(das sind natürlich nur Beispiele, keine echten Quellen dieses Artikels :-) ):&lt;br /&gt;
&lt;br /&gt;
*Hinz und Kunz, &amp;quot;Der Bau einer Musterseite&amp;quot;, 7. Auflage, Wiki-Verlag, 1931&lt;br /&gt;
&lt;br /&gt;
Besser ist es spezielle Quellendokumente zu erstellen (und diese dann auch mit Inhalt zu füllen):&lt;br /&gt;
&lt;br /&gt;
*[[Kowarschick, W. et al. (2005): Musterquelle (Buch)]]&lt;br /&gt;
*[[Goldratt, E.; Cox , J. (2004): The Goal]]&lt;br /&gt;
*[[Leach, L. (2005): Critical Chain Project Management]]&lt;br /&gt;
&lt;br /&gt;
Auch externe Quellen können zitiert werden.&lt;br /&gt;
&lt;br /&gt;
*[http://kowa.fh-augsburg.de Kowarschicks gesammelte Werke] (besser als eigenes Quellen-Dokument, basierend auf der [[Vorlage:Quelle:URL]])&lt;br /&gt;
*[http://de.wikipedia.org/ Wikipedia] (&#039;&#039;&#039;so nicht&#039;&#039;&#039;, da zu allgemein und außerdem nicht der Wikipedia-Verweis benutzt wurde)&lt;br /&gt;
*[[Wikipedia:Vorlage (Datenverarbeitung)]] (sondern eher so, aber noch besser auch als eigenes Quellen-Dokument)&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
Zu guter letzt kann Sekundärliteratur angegeben werden, die zwar im Artikel nicht direkt verwendet, aber doch irgendwie interessant ist.&lt;br /&gt;
Außerdem sollten eine oder mehrere Kategorien angegeben werden sowie ein Verweis auf den zugehörigen englischen Artikel&lt;br /&gt;
in [[GlossaryWiki:Main Page|GlossaryWiki]], auch wenn es diesen noch gar nicht gibt.&lt;br /&gt;
&lt;br /&gt;
*[[Theory of Constraints (Quellen)]] (eine ganze Sammlung von Quellen in einem Quellen-Dokument)&lt;br /&gt;
*[[Wikipedia:Wikipedia:Formatvorlagen|Wikipedia: Formatvorlagen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:GlossarWiki]]&lt;br /&gt;
[[en:GlossaryWiki:Sample Page]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=13121</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=13121"/>
		<updated>2009-07-17T06:52:23Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* flashjiglib */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden erfahren Sie, welche Möglichkeiten Ihnen für die Arbeit mit vorhandenen 3D-Physics-Engines in Actionscript 3 gegeben sind. Wer sich die Grundlagen der Physik aneignen will oder gar eine eigene (2D)Physics-Engine bauen will wird der Artikel [[AS3-Tutorium:Physics:Grundlagen]] empfohlen.&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden. Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstige Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance deutlich besser. Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich, die es beispielsweise erlauben, die Arbeit mit den 3D-Render-Engines zu erleichtern. Eine Demo können sie [http://www.flashbookmarks.com/demos/jiglibtimestep/ hier] ausprobieren.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir eine einfache 3D-Physics-Szene mit Papervision3D und flashjiglib bauen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	&lt;br /&gt;
	import jiglib.geometry.JBox;&lt;br /&gt;
	import jiglib.math.JNumber3D;&lt;br /&gt;
	import jiglib.physics.RigidBody;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Papervision3DPhysics;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Pv3dMesh;&lt;br /&gt;
	&lt;br /&gt;
	import org.papervision3d.cameras.Camera3D;&lt;br /&gt;
	import org.papervision3d.lights.PointLight3D;&lt;br /&gt;
	import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.utils.MaterialsList;&lt;br /&gt;
	import org.papervision3d.objects.primitives.Cube;&lt;br /&gt;
	import org.papervision3d.render.LazyRenderEngine;&lt;br /&gt;
	import org.papervision3d.scenes.Scene3D;&lt;br /&gt;
	import org.papervision3d.view.Viewport3D;&lt;br /&gt;
&lt;br /&gt;
	public class Physics3DTutorial extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		private var physics:Papervision3DPhysics;&lt;br /&gt;
		&lt;br /&gt;
		private var camera3D:Camera3D;&lt;br /&gt;
		private var viewport3D:Viewport3D;&lt;br /&gt;
		private var renderEngine:LazyRenderEngine;&lt;br /&gt;
		private var scene3D:Scene3D;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		public function Physics3DTutorial()&lt;br /&gt;
		{&lt;br /&gt;
			initPapervision();&lt;br /&gt;
			initJiglib();&lt;br /&gt;
			&lt;br /&gt;
			initObjects();&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann den Programmfluß in 4 wichtige Schritte aufteilen. Drei davon sind Initialisierungsschritte und werden direkt im Konstruktor aufgerufen. (( Der vierte Schritt, die Aktualisierung der Engines pro Frame, wird über einen EventListener auf ENTER_FRAME aufgerufen. Der EventListener wird bei erfolgreicher Initalisierung, also nach der Erzeugung aller Objekte hinzugefügt. ))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 	        private function initPapervision () :void {&lt;br /&gt;
			this.camera3D = new Camera3D();&lt;br /&gt;
			this.viewport3D = new Viewport3D(640, 480);&lt;br /&gt;
			this.scene3D = new Scene3D();&lt;br /&gt;
			this.renderEngine = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);&lt;br /&gt;
			this.addChild(this.viewport3D);&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier wird die Papervision3D-Engine zur Darstellung von dreidimensionalen Objekten intialisiert. Dafür braucht man folgende Elemente:&lt;br /&gt;
*Die Kamera. Sie ist der Blickpunkt auf die Szene. Du kannst es dir also genau so vorstellen wie eine Filmkamera. Man sie beispielsweise nach oben verschieben um eine „Draufsicht“ auf die Szene zu erreichen.&lt;br /&gt;
*Die Szene. Sie enthält alle zu renderenden Objekte. Wenn du später ein Objekt erzeugst musst du es der Szene per addChild() übergeben.&lt;br /&gt;
*Der Viewport ist die Zeichenfläche für die Darstellung. Den Viewport musst du immer deiner darstellenden Klassen mitt addChild übergeben. In unserem Falle ist dies das eigene Objekt.&lt;br /&gt;
*Der Renderer. Ihm musst die restlichen Elemente übergeben damit er weiß was er wie rendern muss. Außerdem musst du ihn später pro Schritt updaten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initJiglib():void&lt;br /&gt;
		{&lt;br /&gt;
			physics = new Papervision3DPhysics(this.scene3D, 7);&lt;br /&gt;
			physics.engine.setGravity(new JNumber3D(0, -1, 0));&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung der Physics-Engine ist recht einfach; wir müssen lediglich ein Papervision3DPhysics-Objekt erzeugen. Dieses Objekt muss wissen auf welche Szene sie einen Einfluss hat, in unserem Falle „scene3D“. Anschließend können wir noch Einstellungen vornehmen und so  z.B. die Gravitation verändern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initObjects():void&lt;br /&gt;
		{&lt;br /&gt;
			var pointLight3D:PointLight3D = new PointLight3D();&lt;br /&gt;
			pointLight3D.x = 1000;&lt;br /&gt;
			pointLight3D.y = 1000;&lt;br /&gt;
			pointLight3D.z = -1000;&lt;br /&gt;
&lt;br /&gt;
			var materialsList1 :MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pointLight3D)});&lt;br /&gt;
			var boxPV:Cube = new Cube(materialsList1, 100, 10, 40 );&lt;br /&gt;
			var boxJL:JBox = new JBox(new Pv3dMesh(boxPV), 100, 10, 40);&lt;br /&gt;
			&lt;br /&gt;
			boxJL.y = 30;&lt;br /&gt;
			boxJL.rotationY = 20;&lt;br /&gt;
			boxJL.rotationZ = 20;&lt;br /&gt;
			&lt;br /&gt;
			this.scene3D.addChild(boxPV);&lt;br /&gt;
			this.physics.addBody(boxJL);&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
			var ground:RigidBody = physics.createGround(new FlatShadeMaterial(pointLight3D), 300, 2);&lt;br /&gt;
			ground.y = - 100;&lt;br /&gt;
&lt;br /&gt;
			var sphere:RigidBody = physics.createSphere(new WireframeMaterial(0xFF44FF), 20);&lt;br /&gt;
			&lt;br /&gt;
			this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Objekt auf einem vergleichsweise komplizierten Weg. Dieser Weg eignet sich z.b. wenn noch andere Routinen in den Worflow eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Punktlicht der Klasse PointLight3D, das wir im Raum platzieren und eine MaterialsList, welche wir für die Darstellung eines Quaders brauchen. Als nächstes erzeugen wir die zwei grundlegenden Objekte. &lt;br /&gt;
*Das von Papervision3D darzustellende Objekt, welches immer von DisplayObject3D ableitet. In unserem Falle ist es ein „Cube“.&lt;br /&gt;
*Der dem darstellenden Objekt entsprechende physikalische Körper, immer eine Subklasse von RigidBody. Der RigidBody muss wissen, welches Darstellungs-Objekt er beeinflusst. In unserem Falle entspricht dem Cube die JBBox; sie sollte auch die selben Maße haben.&lt;br /&gt;
Da wir zwei getrennte Libraries haben wird grundsätzlich immer mit diesen beiden Objekten gearbeitet. Da es aber etwas umständlich ist, beide Objekte einzeln zu erzeugen, lernen wir im folgenden noch eine verkürzte Schreibweise, bei dir die Erzeugung und Verknüpfung beider Objekte im Hintergrund abläuft.&lt;br /&gt;
&lt;br /&gt;
Wir können jetzt noch die Rotation oder Position des Quaders verändern. Beachte, dass die Koordinatenachsen nicht wie in der Informatik üblich von links oben nach rechts unten verlaufen. Stattdessen beginnen sie in der Mitte. Y-Werte werden nach oben und X-Werte nach rechts größer.&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt stellt uns das Papervision3DPhysics-Objekt Komfortfunktionen zur Verfügung mit der wir die Erzeugung von Objekten vereinfachen können. Mit physics.createGround() erzeugen wir einen begrenzte Ebene und mit createSphere() eine Kugel. Das Objekt kümmert sich darum das flashjiglib-Objekt als auch das enstprechende Papervision-Objekt zu erzeugen und es zur Szene hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fügen wir einen EventListener auf ENTER_FRAME hinzu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
                private function onEnterFrame(evt: Event):void&lt;br /&gt;
		{&lt;br /&gt;
			this.physics.step();&lt;br /&gt;
			this.renderEngine.render();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alles war wir jetzt noch tun müssen ist den Renderer sowie die Physics-Engine jeden Schritt zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[http://www.papervision3d.org/docs/as3/ Papervision3D API Documentation]&lt;br /&gt;
*[http://as3.miguelmoraleda.com/2009/04/24/flash/jiglibflash/tutorial-jiglibflash-how-to-create-basic-physics-3d-scenetutorial-jiglibflash-como-crear-una-scena-en-3d-con-fisica/  Tutorial JigLibFlash – How to create basic physics 3d scene.]&lt;br /&gt;
*[http://blog.zupko.info/?p=96 BasicView - Making Life In Papervision a Little Easier]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HowTo]]&lt;br /&gt;
[[Kategorie:Informatik]]&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>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Verbundoperatoren_(Join)&amp;diff=12978</id>
		<title>Verbundoperatoren (Join)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Verbundoperatoren_(Join)&amp;diff=12978"/>
		<updated>2009-07-12T14:39:32Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Quellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Verbundoperatoren (auch Joins genannt) verbinden die Spalten zweier Tabellen zu einer Tabelle. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Beschreibung=&lt;br /&gt;
&lt;br /&gt;
Es existieren verschiedene Verbundoperatoren:&lt;br /&gt;
&lt;br /&gt;
*Cross Join&lt;br /&gt;
*Inner Join, Equivalent Join&lt;br /&gt;
*Natural Join&lt;br /&gt;
*Left Join, Left Outer Join&lt;br /&gt;
*Right Outer Join, Right Join&lt;br /&gt;
*Full Outer Join, Full Join&lt;br /&gt;
*Union Join&lt;br /&gt;
*Theta Join&lt;br /&gt;
*Self Join&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cross Join ==&lt;br /&gt;
Der Cross Join (auch als Kartesisches Produkt oder Kreuzprodukt bezeichnet)verbindet jede Zeile der ersten Tabelle mit jeder Zeile der Zweiten Tabelle. Die Ergebnistabelle eines Cross Joins kann sehr groß werden und ist häufig nutzlos. &lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA CROSS JOIN TabelleB&lt;br /&gt;
&lt;br /&gt;
== Inner Join ==&lt;br /&gt;
Der Inner Join verbindet Datensätze aus zwei Tabellen, welche in beiden Tabellen denselben Werte enthalten. Die Spalten die in beiden Tabellen verglichen werden sollen, muß explizit angegeben werden.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Index&lt;br /&gt;
&lt;br /&gt;
== Natural Join ==&lt;br /&gt;
Der Natural Join verknüpft die beiden Tabellen über die gleichheit der Felder, in Spalten mit gleichem Namen.&lt;br /&gt;
Spalten mit gleichem Namen werden im Ergebnis nur einmal angezeigt. Haben die Tabellen keine Spalten mit gleichem Namen, wird der Natural Join automatisch zum Cross Join.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA NATURAL JOIN TabelleB&lt;br /&gt;
&lt;br /&gt;
== Left Join ==&lt;br /&gt;
Der Left Join (auch Left  Outer Join genannt) erstellt eine so genannte linke Inklusionsverknüpfung. Diese schließt alle Datensätze aus der ersten (linken) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der zweiten (rechten) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index&lt;br /&gt;
&lt;br /&gt;
== Right Join ==&lt;br /&gt;
Der Right Join (auch Right Outer Join genannt) erstellt eine so genannte rechte Inklusionsverknüpfung. Diese schließt alle Datensätze aus der zweiten (rechten) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der ersten (linken) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index&lt;br /&gt;
&lt;br /&gt;
== Full Join ==&lt;br /&gt;
Der Full Join (auch  Full Outer Join genannt) ist eine Kombination von Left Join und Right Join. Die zu vergleichenden Spalten müssen explizit Angegeben werden.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index&lt;br /&gt;
&lt;br /&gt;
==Union Join==&lt;br /&gt;
Der Union Join nimmt die Datensätze beider Tabellen auf und gibt sie in einer Tabelle aus.&lt;br /&gt;
Der Union Join steht nicht immer zur Verfügung, da er zum SQL 92 Intermediate Level gehört. &lt;br /&gt;
In PostgreSQL steht der Union Join nicht zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM TabelleA UNION JOIN TabelleB&lt;br /&gt;
&lt;br /&gt;
==Theta Join==&lt;br /&gt;
Der Theta Join ist eine Verallgemeinerung des Inner Join. Beim Inner Join wird die Gleichheit des Inhalts zweier Attribute verglichen und beim Theta Join wird der Inhalt der Attribute x und y mit einer beliebigen Formel, zum Beispiel &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot; verglichen.&lt;br /&gt;
 SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.x &amp;lt;= TabelleB.y&lt;br /&gt;
&lt;br /&gt;
==Self Join==&lt;br /&gt;
Der Self Join dient dazu, um in bestimmten Situationen einen Verbund innerhalb einer einzigen Tabelle bilden zu können. Dazu muss man der Tabelle zwei verschiedene Aliasnamen geben. Self Joins können mit allen Joins durchgeführt werden. Ein Beispiel für den Gebrauch eines Self Joins ist zum Beispiel ein Vergleich innerhalb einer Tabelle. &lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
==Cross Join==&lt;br /&gt;
 SELECT * FROM TabelleA CROSS JOIN TabelleB&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                                    &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976               1           Jan           1         16.05.1976&lt;br /&gt;
    2      Tom            2     29.07.1985               1           Jan           2         29.07.1985&lt;br /&gt;
    3      Anne           5     08.11.2001               1           Jan           5         08.11.2001&lt;br /&gt;
                                                         2           Tom           1         16.05.1976&lt;br /&gt;
                                                         2           Tom           2         29.07.1985&lt;br /&gt;
                                                         2           Tom           5         08.11.2001&lt;br /&gt;
                                                         3           Anne          1         16.05.1976&lt;br /&gt;
                                                         3           Anne          2         29.07.1985&lt;br /&gt;
                                                         3           Anne          5         08.11.2001&lt;br /&gt;
&lt;br /&gt;
== Inner Join ==&lt;br /&gt;
 SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Liste&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                                    &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976               1           Jan           1         16.05.1976&lt;br /&gt;
    2      Tom            2     29.07.1985               2           Tom           2         29.07.1985&lt;br /&gt;
    3      Anne           5     08.11.2001               &lt;br /&gt;
                                                         &lt;br /&gt;
                                                         &lt;br /&gt;
== Natural Join ==&lt;br /&gt;
 SELECT * FROM TabelleA NATURAL JOIN TabelleB&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                       &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum           Index |  Name |  Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976            1      Jan     16.05.1976&lt;br /&gt;
    2      Tom            2     29.07.1985            2      Tom     29.07.1985&lt;br /&gt;
    3      Anne           5     08.11.2001&lt;br /&gt;
&lt;br /&gt;
== Left Join ==&lt;br /&gt;
 SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                                    &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976               1           Jan           1         16.05.1976&lt;br /&gt;
    2      Tom            2     29.07.1985               2           Tom           2         29.07.1985&lt;br /&gt;
    3      Anne           5     08.11.2001               3           Anne         NULL          NULL&lt;br /&gt;
&lt;br /&gt;
== Right Join ==&lt;br /&gt;
 SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                                    &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976               1           Jan           1         16.05.1976&lt;br /&gt;
    2      Tom            2     29.07.1985               2           Tom           2         29.07.1985&lt;br /&gt;
    3      Anne           5     08.11.2001              NULL         NULL          5         08.11.2001&lt;br /&gt;
&lt;br /&gt;
== Full Join ==&lt;br /&gt;
 SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                                    &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976               1           Jan           1         16.05.1976&lt;br /&gt;
    2      Tom            2     29.07.1985               2           Tom           2         29.07.1985&lt;br /&gt;
    3      Anne           5     08.11.2001               3           Anne         NULL          NULL&lt;br /&gt;
                                                        NULL         NULL          5         08.11.2001&lt;br /&gt;
== Union Join ==&lt;br /&gt;
 SELECT * FROM Mitarbeiter UNION JOIN Projekte&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;TabelleA&#039;&#039;&#039;             &#039;&#039;&#039;TabelleB&#039;&#039;&#039;                                    &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum&lt;br /&gt;
    1      Jan            1     16.05.1976               1           Jan          NULL          NULL&lt;br /&gt;
    2      Tom            2     29.07.1985               2           Tom          NULL          NULL&lt;br /&gt;
    3      Anne           5     08.11.2001               3           Anne         NULL          NULL&lt;br /&gt;
                                                        NULL         NULL          1         16.05.1976&lt;br /&gt;
                                                        NULL         NULL          2         29.07.1985&lt;br /&gt;
                                                        NULL         NULL          5         08.11.2001&lt;br /&gt;
&lt;br /&gt;
== Theta Join == &lt;br /&gt;
Sie haben eine Tabelle mit Mannschaften und möchten diese im Weltmeisterschaftsmodus (Für Hin- und Rückspiel müssen Sie einfach den Operator &amp;quot;&amp;lt;&amp;gt;&amp;quot; verwenden) gegeneinander antreten lassen:&lt;br /&gt;
 SELECT x.Team AS Heim, y.Team AS Gast FROM Mannschaften AS x INNER JOIN Mannschaften AS y ON h.m_id &amp;gt; g.m_id&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;&#039;Mannschaften&#039;&#039;&#039;                                            &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   m_id  | Team                                          Heim    |    Gast&lt;br /&gt;
    1      Deutschland                                   Spanien      Deutschland                  &lt;br /&gt;
    2      Spanien                                       Holland      Deutschland          &lt;br /&gt;
    3      Holland                                       Italien      Deutschland               &lt;br /&gt;
    4      Italien                                       Holland      Spanien          &lt;br /&gt;
                                                         Italien      Spanien          &lt;br /&gt;
                                                         Italien      Holland          &lt;br /&gt;
== Self Join == &lt;br /&gt;
Sie haben eine Tabelle mit Namen, Personalnummer und der Personalnummer des Vorgesetzten. Es soll zu jedem Mitarbeiter der Name des Vorgesetzten ermittelt werden: &lt;br /&gt;
 SELECT x.Name, x.Personalnummer, y.Name &amp;quot;Chef&amp;quot; FROM Mitarbeiter x, Mitarbeiter y WHERE x.ChefsPersonalnummer = y.Personalnummer  &lt;br /&gt;
&lt;br /&gt;
               &#039;&#039;&#039;Mitarbeiter&#039;&#039;&#039;                                              &#039;&#039;&#039;Ergebnis&#039;&#039;&#039;&lt;br /&gt;
   Personalnummer  | Name |  ChefsPersonalnummer         Name    |    Personalnummer   |   Chef&lt;br /&gt;
         1          Maier         2                      Maier              1             Mueller&lt;br /&gt;
         2          Mueller       3                      Mueller            2             Kuenstler       &lt;br /&gt;
         3          Kuenstler     1                      Kuenstler          3             Maier          &lt;br /&gt;
                                        &lt;br /&gt;
=Quellen=&lt;br /&gt;
*http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm&lt;br /&gt;
*http://www.thomaskaelin.ch/media/archive1/zusammenfassungen/db1.pdf&lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/queries-table-expressions.html&lt;br /&gt;
*http://www.tinohempel.de/info/info/datenbank/operation.htm&lt;br /&gt;
*http://aktuell.de.selfhtml.org/artikel/datenbanken/&lt;br /&gt;
* http://rowa.giso.de/oracle/latex/Komplexere_SQL_Abfragen.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:SQL]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=SQL_Unterabfragen&amp;diff=12976</id>
		<title>SQL Unterabfragen</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=SQL_Unterabfragen&amp;diff=12976"/>
		<updated>2009-07-12T14:37:41Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Quellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
Unterabfragen, die auch Sub-Selects oder Sub-Querys genannt werden, können verwendet werden, um andere SQL-Anweisungen mit einzubinden.&lt;br /&gt;
Dadurch können Ergebnisse einer Abfrage sofort in einer neuen Abfrage verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	SELECT 	kundennr, bestelldatum, rechnungsbetrag&lt;br /&gt;
	FROM   	bestellung&lt;br /&gt;
	WHERE 	rechnungsbetrag =&lt;br /&gt;
			(&lt;br /&gt;
			SELECT max(rechnungsbetrag) 	FROM	 bestellung&lt;br /&gt;
			);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier wird in der WHERE-Bedingung eine SELECT-Abfrage formuliert, die sich komplett in runden Klammern befindet. Das Ergebnis dieser Abfrage gibt genau einen Wert zurück, der mit dem Rechnungsbetrag verglichen wird. Der Rückgabewert muss folglich zum Selektionskriterium passen.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich gibt es zwei Varianten, die Unterabfragen liefern können. Entweder liefern sie einen Wert, also eine Zeile zurück oder mehrere Zeilen.&lt;br /&gt;
Dabei können die Abfragen eigenständig ausgeführt werden, ohne Beeinflussung durch die Hauptabfrage oder umgekehrt.&lt;br /&gt;
Sie lassen sich auch in DELETE-, UPDATE- und INSERT-Anweisungen verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Unterabfragen mit einem Rückgabewert=&lt;br /&gt;
Hier gelten folgende Bedingungen:&lt;br /&gt;
Die Unterabfrage gibt genau einen Wert zurück.&lt;br /&gt;
Die Unterabfrage gibt genau eine Spalte zurück.&lt;br /&gt;
&lt;br /&gt;
Bei dieser Art von Abfrage wird hauptsächlich mit Vergleichsoperatoren wie =, &amp;gt;, &amp;gt;=, &amp;lt; oder &amp;lt;= gearbeitet.&lt;br /&gt;
Man kann diese Unterabfragen auch gut für Aggregatfunktionen wie MAX oder AVG verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	SELECT 	bestellnr&lt;br /&gt;
	FROM   	bestellung&lt;br /&gt;
	WHERE 	rechnungsbetrag &amp;gt;&lt;br /&gt;
			(&lt;br /&gt;
			SELECT AVG(rechnungsbetrag) 	FROM	 bestellung&lt;br /&gt;
			);	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier wird mit SELECT AVG(rechnungsbetrag) der durchschnittliche Rechnungsbetrag ermittelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Unterabfragen mit mehreren Rückgabewerten=&lt;br /&gt;
Nun ist der Einsatz von Mengenoperatoren (vo ALL, vo ANY, IN, EXISTS) notwendig, da jetzt mit mehreren Werten verglichen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	SELECT 	name, gehalt, abteilung&lt;br /&gt;
	FROM   	mitarbeiter&lt;br /&gt;
	WHERE 	gehalt &amp;lt; ALL&lt;br /&gt;
			(&lt;br /&gt;
			 SELECT gehalt 	FROM	 mitarbeiter	WHERE abteilung = 5&lt;br /&gt;
			);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Unterabfrage gibt nun alle Gehälter aus der Abteilung 5 aus. ALL vergleicht, ob die Bedingung auf alle Zeilen der Unterabfrage zutrifft. Ob es also ein Gehalt gibt, das kleiner ist als alle Gehälter aus der Abteilung 5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Regeln für Unterabfragen=&lt;br /&gt;
#die Unterabfrage wird in runden Klammer gesetzt&lt;br /&gt;
#wird als rechtsseitiger Ausdruck, Vergleich oder EXISTS-Bedingung eingesetzt&lt;br /&gt;
#ein einzelner Datensatz als Rückgabewert kann mit Vergleichsoperatoren verwendet werden&lt;br /&gt;
#bei mehreren Datensätzen verwendet man Mengenoperatoren&lt;br /&gt;
#ORDER BY und UNION ist in einer Unterabfrage unzulässig&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[[Throll, M.; Bartosch, O. (2005): Einstieg in SQL]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12975</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12975"/>
		<updated>2009-07-12T14:11:41Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Quellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden erfahren Sie, welche Möglichkeiten Ihnen für die Arbeit mit vorhandenen 3D-Physics-Engines in Actionscript 3 gegeben sind. Wer sich die Grundlagen der Physik aneignen will oder gar eine eigene (2D)Physics-Engine bauen will wird der Artikel [[AS3-Tutorium:Physics:Grundlagen]] empfohlen.&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden. Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstige Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance um Welten besser( durch zahlreiche Demos bewiesen, siehe[...Link..]). Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich; die es beispielsweise erlauben, die Papervision-Initialisierung zu verkürzen.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir eine einfache 3D-Physics-Szene mit Papervision3D und flashjiglib bauen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	&lt;br /&gt;
	import jiglib.geometry.JBox;&lt;br /&gt;
	import jiglib.math.JNumber3D;&lt;br /&gt;
	import jiglib.physics.RigidBody;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Papervision3DPhysics;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Pv3dMesh;&lt;br /&gt;
	&lt;br /&gt;
	import org.papervision3d.cameras.Camera3D;&lt;br /&gt;
	import org.papervision3d.lights.PointLight3D;&lt;br /&gt;
	import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.utils.MaterialsList;&lt;br /&gt;
	import org.papervision3d.objects.primitives.Cube;&lt;br /&gt;
	import org.papervision3d.render.LazyRenderEngine;&lt;br /&gt;
	import org.papervision3d.scenes.Scene3D;&lt;br /&gt;
	import org.papervision3d.view.Viewport3D;&lt;br /&gt;
&lt;br /&gt;
	public class Physics3DTutorial extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		private var physics:Papervision3DPhysics;&lt;br /&gt;
		&lt;br /&gt;
		private var camera3D:Camera3D;&lt;br /&gt;
		private var viewport3D:Viewport3D;&lt;br /&gt;
		private var renderEngine:LazyRenderEngine;&lt;br /&gt;
		private var scene3D:Scene3D;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		public function Physics3DTutorial()&lt;br /&gt;
		{&lt;br /&gt;
			initPapervision();&lt;br /&gt;
			initJiglib();&lt;br /&gt;
			&lt;br /&gt;
			initObjects();&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann den Programmfluß in 4 wichtige Schritte aufteilen. Drei davon sind Initialisierungsschritte und werden direkt im Konstruktor aufgerufen. (( Der vierte Schritt, die Aktualisierung der Engines pro Frame, wird über einen EventListener auf ENTER_FRAME aufgerufen. Der EventListener wird bei erfolgreicher Initalisierung, also nach der Erzeugung aller Objekte hinzugefügt. ))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 	        private function initPapervision () :void {&lt;br /&gt;
			this.camera3D = new Camera3D();&lt;br /&gt;
			this.viewport3D = new Viewport3D(640, 480);&lt;br /&gt;
			this.scene3D = new Scene3D();&lt;br /&gt;
			this.renderEngine = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);&lt;br /&gt;
			this.addChild(this.viewport3D);&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier wird die Papervision3D-Engine zur Darstellung von dreidimensionalen Objekten intialisiert. Dafür braucht man folgende Elemente:&lt;br /&gt;
*Die Kamera. Sie ist der Blickpunkt auf die Szene. Du kannst es dir also genau so vorstellen wie eine Filmkamera. Man sie beispielsweise nach oben verschieben um eine „Draufsicht“ auf die Szene zu erreichen.&lt;br /&gt;
*Die Szene. Sie enthält alle zu renderenden Objekte. Wenn du später ein Objekt erzeugst musst du es der Szene per addChild() übergeben.&lt;br /&gt;
*Der Viewport ist die Zeichenfläche für die Darstellung. Den Viewport musst du immer deiner darstellenden Klassen mitt addChild übergeben. In unserem Falle ist dies das eigene Objekt.&lt;br /&gt;
*Der Renderer. Ihm musst die restlichen Elemente übergeben damit er weiß was er wie rendern muss. Außerdem musst du ihn später pro Schritt updaten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initJiglib():void&lt;br /&gt;
		{&lt;br /&gt;
			physics = new Papervision3DPhysics(this.scene3D, 7);&lt;br /&gt;
			physics.engine.setGravity(new JNumber3D(0, -1, 0));&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung der Physics-Engine ist recht einfach; wir müssen lediglich ein Papervision3DPhysics-Objekt erzeugen. Dieses Objekt muss wissen auf welche Szene sie einen Einfluss hat, in unserem Falle „scene3D“. Anschließend können wir noch Einstellungen vornehmen und so  z.B. die Gravitation verändern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initObjects():void&lt;br /&gt;
		{&lt;br /&gt;
			var pointLight3D:PointLight3D = new PointLight3D();&lt;br /&gt;
			pointLight3D.x = 1000;&lt;br /&gt;
			pointLight3D.y = 1000;&lt;br /&gt;
			pointLight3D.z = -1000;&lt;br /&gt;
&lt;br /&gt;
			var materialsList1 :MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pointLight3D)});&lt;br /&gt;
			var boxPV:Cube = new Cube(materialsList1, 100, 10, 40 );&lt;br /&gt;
			var boxJL:JBox = new JBox(new Pv3dMesh(boxPV), 100, 10, 40);&lt;br /&gt;
			&lt;br /&gt;
			boxJL.y = 30;&lt;br /&gt;
			boxJL.rotationY = 20;&lt;br /&gt;
			boxJL.rotationZ = 20;&lt;br /&gt;
			&lt;br /&gt;
			this.scene3D.addChild(boxPV);&lt;br /&gt;
			this.physics.addBody(boxJL);&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
			var ground:RigidBody = physics.createGround(new FlatShadeMaterial(pointLight3D), 300, 2);&lt;br /&gt;
			ground.y = - 100;&lt;br /&gt;
&lt;br /&gt;
			var sphere:RigidBody = physics.createSphere(new WireframeMaterial(0xFF44FF), 20);&lt;br /&gt;
			&lt;br /&gt;
			this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Objekt auf einem vergleichsweise komplizierten Weg. Dieser Weg eignet sich z.b. wenn noch andere Routinen in den Worflow eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Punktlicht der Klasse PointLight3D, das wir im Raum platzieren und eine MaterialsList, welche wir für die Darstellung eines Quaders brauchen. Als nächstes erzeugen wir die zwei grundlegenden Objekte. &lt;br /&gt;
*Das von Papervision3D darzustellende Objekt, welches immer von DisplayObject3D ableitet. In unserem Falle ist es ein „Cube“.&lt;br /&gt;
*Der dem darstellenden Objekt entsprechende physikalische Körper, immer eine Subklasse von RigidBody. Der RigidBody muss wissen, welches Darstellungs-Objekt er beeinflusst. In unserem Falle entspricht dem Cube die JBBox; sie sollte auch die selben Maße haben.&lt;br /&gt;
Da wir zwei getrennte Libraries haben wird grundsätzlich immer mit diesen beiden Objekten gearbeitet. Da es aber etwas umständlich ist, beide Objekte einzeln zu erzeugen, lernen wir im folgenden noch eine verkürzte Schreibweise, bei dir die Erzeugung und Verknüpfung beider Objekte im Hintergrund abläuft.&lt;br /&gt;
&lt;br /&gt;
Wir können jetzt noch die Rotation oder Position des Quaders verändern. Beachte, dass die Koordinatenachsen nicht wie in der Informatik üblich von links oben nach rechts unten verlaufen. Stattdessen beginnen sie in der Mitte. Y-Werte werden nach oben und X-Werte nach rechts größer.&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt stellt uns das Papervision3DPhysics-Objekt Komfortfunktionen zur Verfügung mit der wir die Erzeugung von Objekten vereinfachen können. Mit physics.createGround() erzeugen wir einen begrenzte Ebene und mit createSphere() eine Kugel. Das Objekt kümmert sich darum das flashjiglib-Objekt als auch das enstprechende Papervision-Objekt zu erzeugen und es zur Szene hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fügen wir einen EventListener auf ENTER_FRAME hinzu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
                private function onEnterFrame(evt: Event):void&lt;br /&gt;
		{&lt;br /&gt;
			this.physics.step();&lt;br /&gt;
			this.renderEngine.render();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alles war wir jetzt noch tun müssen ist den Renderer sowie die Physics-Engine jeden Schritt zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[http://www.papervision3d.org/docs/as3/ Papervision3D API Documentation]&lt;br /&gt;
*[http://as3.miguelmoraleda.com/2009/04/24/flash/jiglibflash/tutorial-jiglibflash-how-to-create-basic-physics-3d-scenetutorial-jiglibflash-como-crear-una-scena-en-3d-con-fisica/  Tutorial JigLibFlash – How to create basic physics 3d scene.]&lt;br /&gt;
*[http://blog.zupko.info/?p=96 BasicView - Making Life In Papervision a Little Easier]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HowTo]]&lt;br /&gt;
[[Kategorie:Informatik]]&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>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=CRUD&amp;diff=12973</id>
		<title>CRUD</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=CRUD&amp;diff=12973"/>
		<updated>2009-07-12T14:08:58Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
&#039;&#039;&#039;CRUD&#039;&#039;&#039; ist ein Akronym für die grundlegenden Datenbankoperationen &lt;br /&gt;
*&#039;&#039;&#039;C&#039;&#039;&#039;reate(Datensatz anlegen), &lt;br /&gt;
*&#039;&#039;&#039;I&#039;&#039;&#039;nsert(Datensatz lesen), &lt;br /&gt;
*&#039;&#039;&#039;U&#039;&#039;&#039;pdate(Datensatz aktualisieren) und &lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;elete(Datensatz löschen).&lt;br /&gt;
&lt;br /&gt;
=Alternative Definitionen=&lt;br /&gt;
&lt;br /&gt;
Alternative Ausführungen des Akronyms &#039;&#039;&#039;CRUD&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;R&#039;&#039;&#039;etrieve an Stelle von &#039;&#039;&#039;R&#039;&#039;&#039;ead &lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;estroy an Stelle von &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
Alternative Akronyme sind &lt;br /&gt;
*&#039;&#039;&#039;RUDI&#039;&#039;&#039; (Insert an Stelle von Create) &lt;br /&gt;
*&#039;&#039;&#039;CDUR&#039;&#039;&#039; (in Anlehnung an die Tonart)&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
*&#039;&#039;&#039;C&#039;&#039;&#039;reate: INSERT INTO haendler (name) VALUES (&#039;lisa&#039;)&lt;br /&gt;
*&#039;&#039;&#039;R&#039;&#039;&#039;ead: SELECT * FROM haendler WHERE name=&#039;lisa&#039;&lt;br /&gt;
*&#039;&#039;&#039;U&#039;&#039;&#039;pdate: UPDATE haendler SET name=‘lina&#039; WHERE name=&#039;lisa&#039;&lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;elete: DELETE FROM haendler WHERE name=&#039;lina&#039;&lt;br /&gt;
&lt;br /&gt;
=CRUD-Frameworks=&lt;br /&gt;
&lt;br /&gt;
Man spricht von einem CRUD-Framework, wenn man mithilfe einer grafischen Oberfläche die in der Persistenzschicht gespeicherten Datensätze mithilfe von CRUD-Operationen bearbeiten kann. Weiterhin gibt es eine Entsprechung von relationalen Datensätzen auf Persistenzebene zu Objekten in der Anwendungsschicht, man arbeitet also stetig objektorientiert. CRUD-Frameworks unterstützen Transaktionen, eine CRUD-Operation ist ein atomarer Vorgang.&lt;br /&gt;
&lt;br /&gt;
Bekannte CRUD-Frameworks sind unter z.B. Ruby on Rails oder Django.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[[Wikipedia:CRUD ]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=CRUD&amp;diff=12972</id>
		<title>CRUD</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=CRUD&amp;diff=12972"/>
		<updated>2009-07-12T14:07:59Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: Die Seite wurde neu angelegt: {{In Bearbeitung}}  =Definition= &amp;#039;&amp;#039;&amp;#039;CRUD&amp;#039;&amp;#039;&amp;#039; ist ein Akronym für die grundlegenden Datenbankoperationen  *&amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;reate(Datensatz anlegen),  *&amp;#039;&amp;#039;&amp;#039;I&amp;#039;&amp;#039;&amp;#039;nsert(Datensatz lese...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
&#039;&#039;&#039;CRUD&#039;&#039;&#039; ist ein Akronym für die grundlegenden Datenbankoperationen &lt;br /&gt;
*&#039;&#039;&#039;C&#039;&#039;&#039;reate(Datensatz anlegen), &lt;br /&gt;
*&#039;&#039;&#039;I&#039;&#039;&#039;nsert(Datensatz lesen), &lt;br /&gt;
*&#039;&#039;&#039;U&#039;&#039;&#039;pdate(Datensatz aktualisieren) und &lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;elete(Datensatz löschen).&lt;br /&gt;
&lt;br /&gt;
=Alternative Definitionen=&lt;br /&gt;
&lt;br /&gt;
Alternative Ausführungen des Akronyms &#039;&#039;&#039;CRUD&#039;&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;R&#039;&#039;&#039;etrieve an Stelle von &#039;&#039;&#039;R&#039;&#039;&#039;ead &lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;estroy an Stelle von &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
Alternative Akronyme sind &lt;br /&gt;
*&#039;&#039;&#039;RUDI&#039;&#039;&#039; (Insert an Stelle von Create) &lt;br /&gt;
*&#039;&#039;&#039;CDUR&#039;&#039;&#039; (in Anlehnung an die Tonart)&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
*&#039;&#039;&#039;C&#039;&#039;&#039;reate: INSERT INTO haendler (name) VALUES (&#039;lisa&#039;)&lt;br /&gt;
*&#039;&#039;&#039;R&#039;&#039;&#039;ead: SELECT * FROM haendler WHERE name=&#039;lisa&#039;&lt;br /&gt;
*&#039;&#039;&#039;U&#039;&#039;&#039;pdate: UPDATE haendler SET name=‘lina&#039; WHERE name=&#039;lisa&#039;&lt;br /&gt;
*&#039;&#039;&#039;D&#039;&#039;&#039;elete: DELETE haendler WHERE name=&#039;lina&#039;&lt;br /&gt;
&lt;br /&gt;
=CRUD-Frameworks=&lt;br /&gt;
&lt;br /&gt;
Man spricht von einem CRUD-Framework, wenn man mithilfe einer grafischen Oberfläche die in der Persistenzschicht gespeicherten Datensätze mithilfe von CRUD-Operationen bearbeiten kann. Weiterhin gibt es eine Entsprechung von relationalen Datensätzen auf Persistenzebene zu Objekten in der Anwendungsschicht, man arbeitet also stetig objektorientiert. CRUD-Frameworks unterstützen Transaktionen, eine CRUD-Operation ist ein atomarer Vorgang.&lt;br /&gt;
&lt;br /&gt;
Bekannte CRUD-Frameworks sind unter z.B. Ruby on Rails oder Django.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[[Wikipedia:CRUD ]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12965</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12965"/>
		<updated>2009-07-11T08:45:32Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Quellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden erfahren Sie, welche Möglichkeiten Ihnen für die Arbeit mit vorhandenen 3D-Physics-Engines in Actionscript 3 gegeben sind. Wer sich die Grundlagen der Physik aneignen will oder gar eine eigene (2D)Physics-Engine bauen will wird der Artikel [[AS3-Tutorium:Physics:Grundlagen]] empfohlen.&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden. Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstige Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance um Welten besser( durch zahlreiche Demos bewiesen, siehe[...Link..]). Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich; die es beispielsweise erlauben, die Papervision-Initialisierung zu verkürzen.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir eine einfache 3D-Physics-Szene mit Papervision3D und flashjiglib bauen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	&lt;br /&gt;
	import jiglib.geometry.JBox;&lt;br /&gt;
	import jiglib.math.JNumber3D;&lt;br /&gt;
	import jiglib.physics.RigidBody;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Papervision3DPhysics;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Pv3dMesh;&lt;br /&gt;
	&lt;br /&gt;
	import org.papervision3d.cameras.Camera3D;&lt;br /&gt;
	import org.papervision3d.lights.PointLight3D;&lt;br /&gt;
	import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.utils.MaterialsList;&lt;br /&gt;
	import org.papervision3d.objects.primitives.Cube;&lt;br /&gt;
	import org.papervision3d.render.LazyRenderEngine;&lt;br /&gt;
	import org.papervision3d.scenes.Scene3D;&lt;br /&gt;
	import org.papervision3d.view.Viewport3D;&lt;br /&gt;
&lt;br /&gt;
	public class Physics3DTutorial extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		private var physics:Papervision3DPhysics;&lt;br /&gt;
		&lt;br /&gt;
		private var camera3D:Camera3D;&lt;br /&gt;
		private var viewport3D:Viewport3D;&lt;br /&gt;
		private var renderEngine:LazyRenderEngine;&lt;br /&gt;
		private var scene3D:Scene3D;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		public function Physics3DTutorial()&lt;br /&gt;
		{&lt;br /&gt;
			initPapervision();&lt;br /&gt;
			initJiglib();&lt;br /&gt;
			&lt;br /&gt;
			initObjects();&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann den Programmfluß in 4 wichtige Schritte aufteilen. Drei davon sind Initialisierungsschritte und werden direkt im Konstruktor aufgerufen. (( Der vierte Schritt, die Aktualisierung der Engines pro Frame, wird über einen EventListener auf ENTER_FRAME aufgerufen. Der EventListener wird bei erfolgreicher Initalisierung, also nach der Erzeugung aller Objekte hinzugefügt. ))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 	        private function initPapervision () :void {&lt;br /&gt;
			this.camera3D = new Camera3D();&lt;br /&gt;
			this.viewport3D = new Viewport3D(640, 480);&lt;br /&gt;
			this.scene3D = new Scene3D();&lt;br /&gt;
			this.renderEngine = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);&lt;br /&gt;
			this.addChild(this.viewport3D);&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier wird die Papervision3D-Engine zur Darstellung von dreidimensionalen Objekten intialisiert. Dafür braucht man folgende Elemente:&lt;br /&gt;
*Die Kamera. Sie ist der Blickpunkt auf die Szene. Du kannst es dir also genau so vorstellen wie eine Filmkamera. Man sie beispielsweise nach oben verschieben um eine „Draufsicht“ auf die Szene zu erreichen.&lt;br /&gt;
*Die Szene. Sie enthält alle zu renderenden Objekte. Wenn du später ein Objekt erzeugst musst du es der Szene per addChild() übergeben.&lt;br /&gt;
*Der Viewport ist die Zeichenfläche für die Darstellung. Den Viewport musst du immer deiner darstellenden Klassen mitt addChild übergeben. In unserem Falle ist dies das eigene Objekt.&lt;br /&gt;
*Der Renderer. Ihm musst die restlichen Elemente übergeben damit er weiß was er wie rendern muss. Außerdem musst du ihn später pro Schritt updaten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initJiglib():void&lt;br /&gt;
		{&lt;br /&gt;
			physics = new Papervision3DPhysics(this.scene3D, 7);&lt;br /&gt;
			physics.engine.setGravity(new JNumber3D(0, -1, 0));&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung der Physics-Engine ist recht einfach; wir müssen lediglich ein Papervision3DPhysics-Objekt erzeugen. Dieses Objekt muss wissen auf welche Szene sie einen Einfluss hat, in unserem Falle „scene3D“. Anschließend können wir noch Einstellungen vornehmen und so  z.B. die Gravitation verändern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initObjects():void&lt;br /&gt;
		{&lt;br /&gt;
			var pointLight3D:PointLight3D = new PointLight3D();&lt;br /&gt;
			pointLight3D.x = 1000;&lt;br /&gt;
			pointLight3D.y = 1000;&lt;br /&gt;
			pointLight3D.z = -1000;&lt;br /&gt;
&lt;br /&gt;
			var materialsList1 :MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pointLight3D)});&lt;br /&gt;
			var boxPV:Cube = new Cube(materialsList1, 100, 10, 40 );&lt;br /&gt;
			var boxJL:JBox = new JBox(new Pv3dMesh(boxPV), 100, 10, 40);&lt;br /&gt;
			&lt;br /&gt;
			boxJL.y = 30;&lt;br /&gt;
			boxJL.rotationY = 20;&lt;br /&gt;
			boxJL.rotationZ = 20;&lt;br /&gt;
			&lt;br /&gt;
			this.scene3D.addChild(boxPV);&lt;br /&gt;
			this.physics.addBody(boxJL);&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
			var ground:RigidBody = physics.createGround(new FlatShadeMaterial(pointLight3D), 300, 2);&lt;br /&gt;
			ground.y = - 100;&lt;br /&gt;
&lt;br /&gt;
			var sphere:RigidBody = physics.createSphere(new WireframeMaterial(0xFF44FF), 20);&lt;br /&gt;
			&lt;br /&gt;
			this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Objekt auf einem vergleichsweise komplizierten Weg. Dieser Weg eignet sich z.b. wenn noch andere Routinen in den Worflow eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Punktlicht der Klasse PointLight3D, das wir im Raum platzieren und eine MaterialsList, welche wir für die Darstellung eines Quaders brauchen. Als nächstes erzeugen wir die zwei grundlegenden Objekte. &lt;br /&gt;
*Das von Papervision3D darzustellende Objekt, welches immer von DisplayObject3D ableitet. In unserem Falle ist es ein „Cube“.&lt;br /&gt;
*Der dem darstellenden Objekt entsprechende physikalische Körper, immer eine Subklasse von RigidBody. Der RigidBody muss wissen, welches Darstellungs-Objekt er beeinflusst. In unserem Falle entspricht dem Cube die JBBox; sie sollte auch die selben Maße haben.&lt;br /&gt;
Da wir zwei getrennte Libraries haben wird grundsätzlich immer mit diesen beiden Objekten gearbeitet. Da es aber etwas umständlich ist, beide Objekte einzeln zu erzeugen, lernen wir im folgenden noch eine verkürzte Schreibweise, bei dir die Erzeugung und Verknüpfung beider Objekte im Hintergrund abläuft.&lt;br /&gt;
&lt;br /&gt;
Wir können jetzt noch die Rotation oder Position des Quaders verändern. Beachte, dass die Koordinatenachsen nicht wie in der Informatik üblich von links oben nach rechts unten verlaufen. Stattdessen beginnen sie in der Mitte. Y-Werte werden nach oben und X-Werte nach rechts größer.&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt stellt uns das Papervision3DPhysics-Objekt Komfortfunktionen zur Verfügung mit der wir die Erzeugung von Objekten vereinfachen können. Mit physics.createGround() erzeugen wir einen begrenzte Ebene und mit createSphere() eine Kugel. Das Objekt kümmert sich darum das flashjiglib-Objekt als auch das enstprechende Papervision-Objekt zu erzeugen und es zur Szene hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fügen wir einen EventListener auf ENTER_FRAME hinzu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
                private function onEnterFrame(evt: Event):void&lt;br /&gt;
		{&lt;br /&gt;
			this.physics.step();&lt;br /&gt;
			this.renderEngine.render();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alles war wir jetzt noch tun müssen ist den Renderer sowie die Physics-Engine jeden Schritt zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[http://www.papervision3d.org/docs/as3/ Papervision3D API Documentation]&lt;br /&gt;
*[http://as3.miguelmoraleda.com/2009/04/24/flash/jiglibflash/tutorial-jiglibflash-how-to-create-basic-physics-3d-scenetutorial-jiglibflash-como-crear-una-scena-en-3d-con-fisica/  Tutorial JigLibFlash – How to create basic physics 3d scene.]&lt;br /&gt;
*[http://blog.zupko.info/?p=96 BasicView - Making Life In Papervision a Little Easier]&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>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12964</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12964"/>
		<updated>2009-07-11T08:43:21Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden erfahren Sie, welche Möglichkeiten Ihnen für die Arbeit mit vorhandenen 3D-Physics-Engines in Actionscript 3 gegeben sind. Wer sich die Grundlagen der Physik aneignen will oder gar eine eigene (2D)Physics-Engine bauen will wird der Artikel [[AS3-Tutorium:Physics:Grundlagen]] empfohlen.&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden. Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstige Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance um Welten besser( durch zahlreiche Demos bewiesen, siehe[...Link..]). Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich; die es beispielsweise erlauben, die Papervision-Initialisierung zu verkürzen.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir eine einfache 3D-Physics-Szene mit Papervision3D und flashjiglib bauen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	&lt;br /&gt;
	import jiglib.geometry.JBox;&lt;br /&gt;
	import jiglib.math.JNumber3D;&lt;br /&gt;
	import jiglib.physics.RigidBody;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Papervision3DPhysics;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Pv3dMesh;&lt;br /&gt;
	&lt;br /&gt;
	import org.papervision3d.cameras.Camera3D;&lt;br /&gt;
	import org.papervision3d.lights.PointLight3D;&lt;br /&gt;
	import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.utils.MaterialsList;&lt;br /&gt;
	import org.papervision3d.objects.primitives.Cube;&lt;br /&gt;
	import org.papervision3d.render.LazyRenderEngine;&lt;br /&gt;
	import org.papervision3d.scenes.Scene3D;&lt;br /&gt;
	import org.papervision3d.view.Viewport3D;&lt;br /&gt;
&lt;br /&gt;
	public class Physics3DTutorial extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		private var physics:Papervision3DPhysics;&lt;br /&gt;
		&lt;br /&gt;
		private var camera3D:Camera3D;&lt;br /&gt;
		private var viewport3D:Viewport3D;&lt;br /&gt;
		private var renderEngine:LazyRenderEngine;&lt;br /&gt;
		private var scene3D:Scene3D;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		public function Physics3DTutorial()&lt;br /&gt;
		{&lt;br /&gt;
			initPapervision();&lt;br /&gt;
			initJiglib();&lt;br /&gt;
			&lt;br /&gt;
			initObjects();&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann den Programmfluß in 4 wichtige Schritte aufteilen. Drei davon sind Initialisierungsschritte und werden direkt im Konstruktor aufgerufen. (( Der vierte Schritt, die Aktualisierung der Engines pro Frame, wird über einen EventListener auf ENTER_FRAME aufgerufen. Der EventListener wird bei erfolgreicher Initalisierung, also nach der Erzeugung aller Objekte hinzugefügt. ))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 	        private function initPapervision () :void {&lt;br /&gt;
			this.camera3D = new Camera3D();&lt;br /&gt;
			this.viewport3D = new Viewport3D(640, 480);&lt;br /&gt;
			this.scene3D = new Scene3D();&lt;br /&gt;
			this.renderEngine = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);&lt;br /&gt;
			this.addChild(this.viewport3D);&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier wird die Papervision3D-Engine zur Darstellung von dreidimensionalen Objekten intialisiert. Dafür braucht man folgende Elemente:&lt;br /&gt;
*Die Kamera. Sie ist der Blickpunkt auf die Szene. Du kannst es dir also genau so vorstellen wie eine Filmkamera. Man sie beispielsweise nach oben verschieben um eine „Draufsicht“ auf die Szene zu erreichen.&lt;br /&gt;
*Die Szene. Sie enthält alle zu renderenden Objekte. Wenn du später ein Objekt erzeugst musst du es der Szene per addChild() übergeben.&lt;br /&gt;
*Der Viewport ist die Zeichenfläche für die Darstellung. Den Viewport musst du immer deiner darstellenden Klassen mitt addChild übergeben. In unserem Falle ist dies das eigene Objekt.&lt;br /&gt;
*Der Renderer. Ihm musst die restlichen Elemente übergeben damit er weiß was er wie rendern muss. Außerdem musst du ihn später pro Schritt updaten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initJiglib():void&lt;br /&gt;
		{&lt;br /&gt;
			physics = new Papervision3DPhysics(this.scene3D, 7);&lt;br /&gt;
			physics.engine.setGravity(new JNumber3D(0, -1, 0));&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung der Physics-Engine ist recht einfach; wir müssen lediglich ein Papervision3DPhysics-Objekt erzeugen. Dieses Objekt muss wissen auf welche Szene sie einen Einfluss hat, in unserem Falle „scene3D“. Anschließend können wir noch Einstellungen vornehmen und so  z.B. die Gravitation verändern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
 		private function initObjects():void&lt;br /&gt;
		{&lt;br /&gt;
			var pointLight3D:PointLight3D = new PointLight3D();&lt;br /&gt;
			pointLight3D.x = 1000;&lt;br /&gt;
			pointLight3D.y = 1000;&lt;br /&gt;
			pointLight3D.z = -1000;&lt;br /&gt;
&lt;br /&gt;
			var materialsList1 :MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pointLight3D)});&lt;br /&gt;
			var boxPV:Cube = new Cube(materialsList1, 100, 10, 40 );&lt;br /&gt;
			var boxJL:JBox = new JBox(new Pv3dMesh(boxPV), 100, 10, 40);&lt;br /&gt;
			&lt;br /&gt;
			boxJL.y = 30;&lt;br /&gt;
			boxJL.rotationY = 20;&lt;br /&gt;
			boxJL.rotationZ = 20;&lt;br /&gt;
			&lt;br /&gt;
			this.scene3D.addChild(boxPV);&lt;br /&gt;
			this.physics.addBody(boxJL);&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
			var ground:RigidBody = physics.createGround(new FlatShadeMaterial(pointLight3D), 300, 2);&lt;br /&gt;
			ground.y = - 100;&lt;br /&gt;
&lt;br /&gt;
			var sphere:RigidBody = physics.createSphere(new WireframeMaterial(0xFF44FF), 20);&lt;br /&gt;
			&lt;br /&gt;
			this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Objekt auf einem vergleichsweise komplizierten Weg. Dieser Weg eignet sich z.b. wenn noch andere Routinen in den Worflow eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Punktlicht der Klasse PointLight3D, das wir im Raum platzieren und eine MaterialsList, welche wir für die Darstellung eines Quaders brauchen. Als nächstes erzeugen wir die zwei grundlegenden Objekte. &lt;br /&gt;
*Das von Papervision3D darzustellende Objekt, welches immer von DisplayObject3D ableitet. In unserem Falle ist es ein „Cube“.&lt;br /&gt;
*Der dem darstellenden Objekt entsprechende physikalische Körper, immer eine Subklasse von RigidBody. Der RigidBody muss wissen, welches Darstellungs-Objekt er beeinflusst. In unserem Falle entspricht dem Cube die JBBox; sie sollte auch die selben Maße haben.&lt;br /&gt;
Da wir zwei getrennte Libraries haben wird grundsätzlich immer mit diesen beiden Objekten gearbeitet. Da es aber etwas umständlich ist, beide Objekte einzeln zu erzeugen, lernen wir im folgenden noch eine verkürzte Schreibweise, bei dir die Erzeugung und Verknüpfung beider Objekte im Hintergrund abläuft.&lt;br /&gt;
&lt;br /&gt;
Wir können jetzt noch die Rotation oder Position des Quaders verändern. Beachte, dass die Koordinatenachsen nicht wie in der Informatik üblich von links oben nach rechts unten verlaufen. Stattdessen beginnen sie in der Mitte. Y-Werte werden nach oben und X-Werte nach rechts größer.&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt stellt uns das Papervision3DPhysics-Objekt Komfortfunktionen zur Verfügung mit der wir die Erzeugung von Objekten vereinfachen können. Mit physics.createGround() erzeugen wir einen begrenzte Ebene und mit createSphere() eine Kugel. Das Objekt kümmert sich darum das flashjiglib-Objekt als auch das enstprechende Papervision-Objekt zu erzeugen und es zur Szene hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fügen wir einen EventListener auf ENTER_FRAME hinzu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;actionscript&amp;quot;&amp;gt;&lt;br /&gt;
                private function onEnterFrame(evt: Event):void&lt;br /&gt;
		{&lt;br /&gt;
			this.physics.step();&lt;br /&gt;
			this.renderEngine.render();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alles war wir jetzt noch tun müssen ist den Renderer sowie die Physics-Engine jeden Schritt zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[http://www.papervision3d.org/docs/as3/]&lt;br /&gt;
*[http://as3.miguelmoraleda.com/2009/04/24/flash/jiglibflash/tutorial-jiglibflash-how-to-create-basic-physics-3d-scenetutorial-jiglibflash-como-crear-una-scena-en-3d-con-fisica/]&lt;br /&gt;
*[http://blog.zupko.info/?p=96]&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>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12963</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12963"/>
		<updated>2009-07-11T08:31:05Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Tutorial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
==Bemerkung 1==&lt;br /&gt;
Zu einer Definition kann man viele sinnvolle Bemerkungen angeben.&lt;br /&gt;
&lt;br /&gt;
==Bemerkung 2==&lt;br /&gt;
Natürlich sollte eine Bemerkung einen sinnvollen Titel erhalten und nicht einfach &#039;&#039;Bemerkung 1&#039;&#039;, &#039;&#039;Bemerkung 2&#039;&#039; etc.&lt;br /&gt;
genannt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. &lt;br /&gt;
&lt;br /&gt;
Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden.&lt;br /&gt;
&lt;br /&gt;
Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstiged Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance um Welten besser( durch zahlreiche Demos bewiesen, siehe[...Link..]). Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich; die es beispielsweise erlauben, die Papervision-Initialisierung zu verkürzen.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir eine einfache 3D-Physics-Szene mit Papervision3D und flashjiglib bauen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	&lt;br /&gt;
	import jiglib.geometry.JBox;&lt;br /&gt;
	import jiglib.math.JNumber3D;&lt;br /&gt;
	import jiglib.physics.RigidBody;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Papervision3DPhysics;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Pv3dMesh;&lt;br /&gt;
	&lt;br /&gt;
	import org.papervision3d.cameras.Camera3D;&lt;br /&gt;
	import org.papervision3d.lights.PointLight3D;&lt;br /&gt;
	import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.utils.MaterialsList;&lt;br /&gt;
	import org.papervision3d.objects.primitives.Cube;&lt;br /&gt;
	import org.papervision3d.render.LazyRenderEngine;&lt;br /&gt;
	import org.papervision3d.scenes.Scene3D;&lt;br /&gt;
	import org.papervision3d.view.Viewport3D;&lt;br /&gt;
&lt;br /&gt;
	public class Physics3DTutorial extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		private var physics:Papervision3DPhysics;&lt;br /&gt;
		&lt;br /&gt;
		private var camera3D:Camera3D;&lt;br /&gt;
		private var viewport3D:Viewport3D;&lt;br /&gt;
		private var renderEngine:LazyRenderEngine;&lt;br /&gt;
		private var scene3D:Scene3D;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		public function Physics3DTutorial()&lt;br /&gt;
		{&lt;br /&gt;
			initPapervision();&lt;br /&gt;
			initJiglib();&lt;br /&gt;
			&lt;br /&gt;
			initObjects();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann den Programmfluß in 4 wichtige Schritte aufteilen. Drei davon sind Initialisierungsschritte und werden direkt im Konstruktor aufgerufen. (( Der vierte Schritt, die Aktualisierung der Engines pro Frame, wird über einen EventListener auf ENTER_FRAME aufgerufen. Der EventListener wird bei erfolgreicher Initalisierung, also nach der Erzeugung aller Objekte hinzugefügt. ))&lt;br /&gt;
&lt;br /&gt;
 	        private function initPapervision () :void {&lt;br /&gt;
			this.camera3D = new Camera3D();&lt;br /&gt;
			this.viewport3D = new Viewport3D(640, 480);&lt;br /&gt;
			this.scene3D = new Scene3D();&lt;br /&gt;
			this.renderEngine = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);&lt;br /&gt;
			this.addChild(this.viewport3D);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
Hier wird die Papervision3D-Engine zur Darstellung von dreidimensionalen Objekten intialisiert. Dafür braucht man folgende Elemente:&lt;br /&gt;
*Die Kamera. Sie ist der Blickpunkt auf die Szene. Du kannst es dir also genau so vorstellen wie eine Filmkamera. Man sie beispielsweise nach oben verschieben um eine „Draufsicht“ auf die Szene zu erreichen.&lt;br /&gt;
*Die Szene. Sie enthält alle zu renderenden Objekte. Wenn du später ein Objekt erzeugst musst du es der Szene per addChild() übergeben.&lt;br /&gt;
*Der Viewport ist die Zeichenfläche für die Darstellung. Den Viewport musst du immer deiner darstellenden Klassen mitt addChild übergeben. In unserem Falle ist dies das eigene Objekt.&lt;br /&gt;
*Der Renderer. Ihm musst die restlichen Elemente übergeben damit er weiß was er wie rendern muss. Außerdem musst du ihn später pro Schritt updaten.&lt;br /&gt;
&lt;br /&gt;
 		private function initJiglib():void&lt;br /&gt;
		{&lt;br /&gt;
			physics = new Papervision3DPhysics(this.scene3D, 7);&lt;br /&gt;
			physics.engine.setGravity(new JNumber3D(0, -1, 0));&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung der Physics-Engine ist recht einfach; wir müssen lediglich ein Papervision3DPhysics-Objekt erzeugen. Dieses Objekt muss wissen auf welche Szene sie einen Einfluss hat, in unserem Falle „scene3D“. Anschließend können wir noch Einstellungen vornehmen und so  z.B. die Gravitation verändern.&lt;br /&gt;
&lt;br /&gt;
 		private function initObjects():void&lt;br /&gt;
		{&lt;br /&gt;
			var pointLight3D:PointLight3D = new PointLight3D();&lt;br /&gt;
			pointLight3D.x = 1000;&lt;br /&gt;
			pointLight3D.y = 1000;&lt;br /&gt;
			pointLight3D.z = -1000;&lt;br /&gt;
&lt;br /&gt;
			var materialsList1 :MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pointLight3D)});&lt;br /&gt;
			var boxPV:Cube = new Cube(materialsList1, 100, 10, 40 );&lt;br /&gt;
			var boxJL:JBox = new JBox(new Pv3dMesh(boxPV), 100, 10, 40);&lt;br /&gt;
			&lt;br /&gt;
			boxJL.y = 30;&lt;br /&gt;
			boxJL.rotationY = 20;&lt;br /&gt;
			boxJL.rotationZ = 20;&lt;br /&gt;
			&lt;br /&gt;
			this.scene3D.addChild(boxPV);&lt;br /&gt;
			this.physics.addBody(boxJL);&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
			var ground:RigidBody = physics.createGround(new FlatShadeMaterial(pointLight3D), 300, 2);&lt;br /&gt;
			ground.y = - 100;&lt;br /&gt;
&lt;br /&gt;
			var sphere:RigidBody = physics.createSphere(new WireframeMaterial(0xFF44FF), 20);&lt;br /&gt;
			&lt;br /&gt;
			this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);			&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Objekt auf einem vergleichsweise komplizierten Weg. Dieser Weg eignet sich z.b. wenn noch andere Routinen in den Worflow eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Punktlicht der Klasse PointLight3D, das wir im Raum platzieren und eine MaterialsList, welche wir für die Darstellung eines Quaders brauchen. Als nächstes erzeugen wir die zwei grundlegenden Objekte. &lt;br /&gt;
•	Das von Papervision3D darzustellende Objekt, welches immer von DisplayObject3D ableitet. In unserem Falle ist es ein „Cube“.&lt;br /&gt;
•	Der dem darstellenden Objekt entsprechende physikalische Körper, immer eine Subklasse von RigidBody. Der RigidBody muss wissen, welches Darstellungs-Objekt er beeinflusst. In unserem Falle entspricht dem Cube die JBBox; sie sollte auch die selben Maße haben.&lt;br /&gt;
Da wir zwei getrennte Libraries haben wird grundsätzlich immer mit diesen beiden Objekten gearbeitet. Da es aber etwas umständlich ist, beide Objekte einzeln zu erzeugen, lernen wir im folgenden noch eine verkürzte Schreibweise, bei dir die Erzeugung und Verknüpfung beider Objekte im Hintergrund abläuft.&lt;br /&gt;
&lt;br /&gt;
Wir können jetzt noch die Rotation oder Position des Quaders verändern. Beachte, dass die Koordinatenachsen nicht wie in der Informatik üblich von links oben nach rechts unten verlaufen. Stattdessen beginnen sie in der Mitte. Y-Werte werden nach oben und X-Werte nach rechts größer.&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt stellt uns das Papervision3DPhysics-Objekt Komfortfunktionen zur Verfügung mit der wir die Erzeugung von Objekten vereinfachen können. Mit physics.createGround() erzeugen wir einen begrenzte Ebene und mit createSphere() eine Kugel. Das Objekt kümmert sich darum das flashjiglib-Objekt als auch das enstprechende Papervision-Objekt zu erzeugen und es zur Szene hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fügen wir einen EventListener auf ENTER_FRAME hinzu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 private function onEnterFrame(evt: Event):void&lt;br /&gt;
		{&lt;br /&gt;
			this.physics.step();&lt;br /&gt;
			this.renderEngine.render();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alles war wir jetzt noch tun müssen ist den Renderer sowie die Physics-Engine jeden Schritt zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[http://www.papervision3d.org/docs/as3/]&lt;br /&gt;
*[http://as3.miguelmoraleda.com/2009/04/24/flash/jiglibflash/tutorial-jiglibflash-how-to-create-basic-physics-3d-scenetutorial-jiglibflash-como-crear-una-scena-en-3d-con-fisica/]&lt;br /&gt;
*[http://blog.zupko.info/?p=96]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12962</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12962"/>
		<updated>2009-07-11T08:21:58Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
==Bemerkung 1==&lt;br /&gt;
Zu einer Definition kann man viele sinnvolle Bemerkungen angeben.&lt;br /&gt;
&lt;br /&gt;
==Bemerkung 2==&lt;br /&gt;
Natürlich sollte eine Bemerkung einen sinnvollen Titel erhalten und nicht einfach &#039;&#039;Bemerkung 1&#039;&#039;, &#039;&#039;Bemerkung 2&#039;&#039; etc.&lt;br /&gt;
genannt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. &lt;br /&gt;
&lt;br /&gt;
Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden.&lt;br /&gt;
&lt;br /&gt;
Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstiged Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance um Welten besser( durch zahlreiche Demos bewiesen, siehe[...Link..]). Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich; die es beispielsweise erlauben, die Papervision-Initialisierung zu verkürzen.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir eine einfache 3D-Physics-Szene mit Papervision3D und flashjiglib bauen.&lt;br /&gt;
&lt;br /&gt;
 package {&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	&lt;br /&gt;
	import jiglib.geometry.JBox;&lt;br /&gt;
	import jiglib.math.JNumber3D;&lt;br /&gt;
	import jiglib.physics.RigidBody;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Papervision3DPhysics;&lt;br /&gt;
	import jiglib.plugin.papervision3d.Pv3dMesh;&lt;br /&gt;
	&lt;br /&gt;
	import org.papervision3d.cameras.Camera3D;&lt;br /&gt;
	import org.papervision3d.lights.PointLight3D;&lt;br /&gt;
	import org.papervision3d.materials.WireframeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;&lt;br /&gt;
	import org.papervision3d.materials.utils.MaterialsList;&lt;br /&gt;
	import org.papervision3d.objects.primitives.Cube;&lt;br /&gt;
	import org.papervision3d.render.LazyRenderEngine;&lt;br /&gt;
	import org.papervision3d.scenes.Scene3D;&lt;br /&gt;
	import org.papervision3d.view.Viewport3D;&lt;br /&gt;
&lt;br /&gt;
	public class Physics3DTutorial extends Sprite&lt;br /&gt;
	{&lt;br /&gt;
		private var physics:Papervision3DPhysics;&lt;br /&gt;
		&lt;br /&gt;
		private var camera3D:Camera3D;&lt;br /&gt;
		private var viewport3D:Viewport3D;&lt;br /&gt;
		private var renderEngine:LazyRenderEngine;&lt;br /&gt;
		private var scene3D:Scene3D;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		public function Physics3DTutorial()&lt;br /&gt;
		{&lt;br /&gt;
			initPapervision();&lt;br /&gt;
			initJiglib();&lt;br /&gt;
			&lt;br /&gt;
			initObjects();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann den Programmfluß in 4 wichtige Schritte aufteilen. Drei davon sind Initialisierungsschritte und werden direkt im Konstruktor aufgerufen. (( Der vierte Schritt, die Aktualisierung der Engines pro Frame, wird über einen EventListener auf ENTER_FRAME aufgerufen. Der EventListener wird bei erfolgreicher Initalisierung, also nach der Erzeugung aller Objekte hinzugefügt. ))&lt;br /&gt;
&lt;br /&gt;
 	        private function initPapervision () :void {&lt;br /&gt;
			this.camera3D = new Camera3D();&lt;br /&gt;
			this.viewport3D = new Viewport3D(640, 480);&lt;br /&gt;
			this.scene3D = new Scene3D();&lt;br /&gt;
			this.renderEngine = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);&lt;br /&gt;
			this.addChild(this.viewport3D);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
Hier wird die Papervision3D-Engine zur Darstellung von dreidimensionalen Objekten intialisiert. Dafür braucht man folgende Elemente:&lt;br /&gt;
*Die Kamera. Sie ist der Blickpunkt auf die Szene. Du kannst es dir also genau so vorstellen wie eine Filmkamera. Man sie beispielsweise nach oben verschieben um eine „Draufsicht“ auf die Szene zu erreichen.&lt;br /&gt;
*Die Szene. Sie enthält alle zu renderenden Objekte. Wenn du später ein Objekt erzeugst musst du es der Szene per addChild() übergeben.&lt;br /&gt;
*Der Viewport ist die Zeichenfläche für die Darstellung. Den Viewport musst du immer deiner darstellenden Klassen mitt addChild übergeben. In unserem Falle ist dies das eigene Objekt.&lt;br /&gt;
*Der Renderer. Ihm musst die restlichen Elemente übergeben damit er weiß was er wie rendern muss. Außerdem musst du ihn später pro Schritt updaten.&lt;br /&gt;
&lt;br /&gt;
 code3&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung der Physics-Engine ist recht einfach; wir müssen lediglich ein Papervision3DPhysics-Objekt erzeugen. Dieses Objekt muss wissen auf welche Szene sie einen Einfluss hat, in unserem Falle „scene3D“. Anschließend können wir noch Einstellungen vornehmen und so  z.B. die Gravitation verändern.&lt;br /&gt;
&lt;br /&gt;
 code4&lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Objekt auf einem vergleichsweise komplizierten Weg. Dieser Weg eignet sich z.b. wenn noch andere Routinen in den Worflow eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
Zunächst erzeugen wir ein Punktlicht der Klasse PointLight3D, das wir im Raum platzieren und eine MaterialsList, welche wir für die Darstellung eines Quaders brauchen. Als nächstes erzeugen wir die zwei grundlegenden Objekte. &lt;br /&gt;
•	Das von Papervision3D darzustellende Objekt, welches immer von DisplayObject3D ableitet. In unserem Falle ist es ein „Cube“.&lt;br /&gt;
•	Der dem darstellenden Objekt entsprechende physikalische Körper, immer eine Subklasse von RigidBody. Der RigidBody muss wissen, welches Darstellungs-Objekt er beeinflusst. In unserem Falle entspricht dem Cube die JBBox; sie sollte auch die selben Maße haben.&lt;br /&gt;
Da wir zwei getrennte Libraries haben wird grundsätzlich immer mit diesen beiden Objekten gearbeitet. Da es aber etwas umständlich ist, beide Objekte einzeln zu erzeugen, lernen wir im folgenden noch eine verkürzte Schreibweise, bei dir die Erzeugung und Verknüpfung beider Objekte im Hintergrund abläuft.&lt;br /&gt;
&lt;br /&gt;
Wir können jetzt noch die Rotation oder Position des Quaders verändern. Beachte, dass die Koordinatenachsen nicht wie in der Informatik üblich von links oben nach rechts unten verlaufen. Stattdessen beginnen sie in der Mitte. Y-Werte werden nach oben und X-Werte nach rechts größer.&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt stellt uns das Papervision3DPhysics-Objekt Komfortfunktionen zur Verfügung mit der wir die Erzeugung von Objekten vereinfachen können. Mit physics.createGround() erzeugen wir einen begrenzte Ebene und mit createSphere() eine Kugel. Das Objekt kümmert sich darum das flashjiglib-Objekt als auch das enstprechende Papervision-Objekt zu erzeugen und es zur Szene hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
Zuletzt fügen wir einen EventListener auf ENTER_FRAME hinzu.&lt;br /&gt;
&lt;br /&gt;
 code5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alles war wir jetzt noch tun müssen ist den Renderer sowie die Physics-Engine jeden Schritt zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
*[http://www.papervision3d.org/docs/as3/]&lt;br /&gt;
*[http://as3.miguelmoraleda.com/2009/04/24/flash/jiglibflash/tutorial-jiglibflash-how-to-create-basic-physics-3d-scenetutorial-jiglibflash-como-crear-una-scena-en-3d-con-fisica/]&lt;br /&gt;
*[http://blog.zupko.info/?p=96]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12961</id>
		<title>AS3-Tutorium:Physics:3D-Physics-Engines</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:3D-Physics-Engines&amp;diff=12961"/>
		<updated>2009-07-11T08:16:43Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: Die Seite wurde neu angelegt: {{In Bearbeitung}}   =Grundlegendes Prinzip= Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{In Bearbeitung}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes Prinzip=&lt;br /&gt;
Physics-Engines stellen lediglich Algorithmen für die physikalische Berechnung, jedoch keine Routinen zur Darstellung von Objekten, zur Verfügung! Da Flex oder Flash selber auch keine echten 3D-Engines besitzen, brauchen Sie für die Darstellung eine zusätzliche Bibliothek. Im Code müssen Sie selbständig die physikalische Objekte mit den darstellenden Objekten verbinden, da beide sonst unabhängig voneinander agieren würden. Weiterhin müssen sie beachten, dass die physikalische Berechnung so kompliziert ist, dass nicht alle Objekte die Sie darstellen können, auch physikalisch in ihrer ganzen Komplexität berücksichtigen können. Auf den Umgang mit den Libraries in AS3 wird später genauer eingegangen.&lt;br /&gt;
&lt;br /&gt;
==Bemerkung 1==&lt;br /&gt;
Zu einer Definition kann man viele sinnvolle Bemerkungen angeben.&lt;br /&gt;
&lt;br /&gt;
==Bemerkung 2==&lt;br /&gt;
Natürlich sollte eine Bemerkung einen sinnvollen Titel erhalten und nicht einfach &#039;&#039;Bemerkung 1&#039;&#039;, &#039;&#039;Bemerkung 2&#039;&#039; etc.&lt;br /&gt;
genannt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=3D-Engines=&lt;br /&gt;
&lt;br /&gt;
==Papervision3D==&lt;br /&gt;
Papervision3D eine sehr populäre 3D-Engine für Actionscript. Sie kann alle wichtigen primitive Objekte wie Quader, Kugeln, Ebenen und Zylinder darstellen. Auch komplexe Objekte, beispielsweise 3D-Models aus Maya sind mit einer Hilfsklasse, dem Collada, sehr einfach einzubinden. &lt;br /&gt;
&lt;br /&gt;
Man kann koordinatengenau Punktlichter setzen und verschiedene Materialen, wie beispielweise das einfache FlatShadeMaterial oder das WireFrameMaterial auf seine Objekte anwenden.&lt;br /&gt;
&lt;br /&gt;
Und auch sonst ist Papervision eine recht mächtige Engine. Sie unterstützt beispielsweise die komplexe Rechnung mit Matrizen und stellt uns mit der Matrix3D eine Klasse mit vielen nützlichen Methoden zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation von Papervision3D fällt etwas spärlich aus und verzichtet auf eine ausführliche Beschreibung der Methoden. Da aber einige gute Tutorials im Web zu finden sind fällt der Einstieg nicht schwer.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ist die Arbeit mit Papervision sehr simpel und effektiv: Man erstellt seine Objekte; fügt diese der Szene hinzu, konfiguriert den Renderer, und los geht’s.&lt;br /&gt;
&lt;br /&gt;
==Sonstiged Engines==&lt;br /&gt;
&lt;br /&gt;
Sandy3D&lt;br /&gt;
&lt;br /&gt;
Away3D&lt;br /&gt;
&lt;br /&gt;
Alternativa&lt;br /&gt;
&lt;br /&gt;
=3D-Physics-Engines=&lt;br /&gt;
&lt;br /&gt;
==WOW-Engine==&lt;br /&gt;
&lt;br /&gt;
WOW, nicht zu verwechseln mit World of Warcraft, ist die verbreitetste aller 3D-Physics-Engines für Actionscript. Man stößt bei der Internet-Recherche fast nur auf Beispiele mit der WOW-Engine, was nicht ganz verständlich ist. &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der WOW-Engine ist durchweg intuitiv und komfortabel. Man erstellt seine Objekte, modifiziert ggbf. die Elastizität o.ä., verbindet sie mit der Darstellung und aktualisiert sie jedes Frame. &lt;br /&gt;
&lt;br /&gt;
Die Engine hat jedoch einige große Nachteile:&lt;br /&gt;
&lt;br /&gt;
1. Die Performance lässt zu wünschen übrig. Schon nicht allzu viele gleichzeitig zu berechnende Objekten zwingen die Physics-Engine in die Knie.&lt;br /&gt;
&lt;br /&gt;
2. Es gibt keine Kollisionsberechnung von Quader, Würfeln.&lt;br /&gt;
&lt;br /&gt;
3. Auch sonstige Feinheiten wie Federn o.ä. fehlen. &lt;br /&gt;
&lt;br /&gt;
Was dann überhaupt noch übrig bleibt: Die Kollision von Kugeln sowie einfache Gravitation; bei schlechter Performance. Es ist daher unverständlich, warum die WOW-Engine einen solchen Status erlangt hat. Eine bessere Alternative wird im Folgenden dargestellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==flashjiglib==&lt;br /&gt;
&lt;br /&gt;
Die flashjiglib ist aus unerklärchlich Gründen in den Weiten des World Wide Webs sehr schwer zu entdecken. Sie ist eine Portierung der jiglib aus C++ und deutlich ausgereifter als die WOW-Engine: &lt;br /&gt;
&lt;br /&gt;
Die Arbeit mit der flashjiglib ist ebenso intuitiv, die Performance um Welten besser( durch zahlreiche Demos bewiesen, siehe[...Link..]). Die jiglib unterstützt die Kollision von Kugeln, Quadern, begrenzten Ebenen und Kapseln. Die physikalische Berechnung von Federn ist ebenfalls möglich. Last but not least bringt die flashjiglib Komfortfunktionen mit sich; die es beispielsweise erlauben, die Papervision-Initialisierung zu verkürzen.&lt;br /&gt;
&lt;br /&gt;
=Tutorial=&lt;br /&gt;
&lt;br /&gt;
bla&lt;br /&gt;
&lt;br /&gt;
 test&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
Wenn die Definitionen und/oder die Anmerkungen nicht von einem selbst stammen, sollte man die Quellen angeben&lt;br /&gt;
(das sind natürlich nur Beispiele, keine echten Quellen dieses Artikels :-) ):&lt;br /&gt;
&lt;br /&gt;
*Hinz und Kunz, &amp;quot;Der Bau einer Musterseite&amp;quot;, 7. Auflage, Wiki-Verlag, 1931&lt;br /&gt;
&lt;br /&gt;
Besser ist es spezielle Quellendokumente zu erstellen (und diese dann auch mit Inhalt zu füllen):&lt;br /&gt;
&lt;br /&gt;
*[[Kowarschick, W. et al. (2005): Musterquelle (Buch)]]&lt;br /&gt;
*[[Goldratt, E.; Cox , J. (2004): The Goal]]&lt;br /&gt;
*[[Leach, L. (2005): Critical Chain Project Management]]&lt;br /&gt;
&lt;br /&gt;
Auch externe Quellen können zitiert werden.&lt;br /&gt;
&lt;br /&gt;
*[http://kowa.fh-augsburg.de Kowarschicks gesammelte Werke] (besser als eigenes Quellen-Dokument, basierend auf der [[Vorlage:Quelle:URL]])&lt;br /&gt;
*[http://de.wikipedia.org/ Wikipedia] (&#039;&#039;&#039;so nicht&#039;&#039;&#039;, da zu allgemein und außerdem nicht der Wikipedia-Verweis benutzt wurde)&lt;br /&gt;
*[[Wikipedia:Vorlage (Datenverarbeitung)]] (sondern eher so, aber noch besser auch als eigenes Quellen-Dokument)&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
Zu guter letzt kann Sekundärliteratur angegeben werden, die zwar im Artikel nicht direkt verwendet, aber doch irgendwie interessant ist.&lt;br /&gt;
Außerdem sollten eine oder mehrere Kategorien angegeben werden sowie ein Verweis auf den zugehörigen englischen Artikel&lt;br /&gt;
in [[GlossaryWiki:Main Page|GlossaryWiki]], auch wenn es diesen noch gar nicht gibt.&lt;br /&gt;
&lt;br /&gt;
*[[Theory of Constraints (Quellen)]] (eine ganze Sammlung von Quellen in einem Quellen-Dokument)&lt;br /&gt;
*[[Wikipedia:Wikipedia:Formatvorlagen|Wikipedia: Formatvorlagen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:GlossarWiki]]&lt;br /&gt;
[[en:GlossaryWiki:Sample Page]]&lt;/div&gt;</summary>
		<author><name>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12960</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=12960"/>
		<updated>2009-07-11T08:09:36Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Überblick */&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. Informationen zur Verwendung von vorhanden 3D-Physics-Engines in Actionscript3 finden sie im Artikel [[AS3-Tutorium:Physics:3D-Physics-Engines]].&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 projizierender 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>Jakobw</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=AS3-Tutorium:Physics:Vertiefung&amp;diff=12959</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=12959"/>
		<updated>2009-07-11T08:08:58Z</updated>

		<summary type="html">&lt;p&gt;Jakobw: /* Überblick */&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. [[AS3-Tutorium:Physics:3D-Physics-Engines]]&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 projizierender 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>Jakobw</name></author>
	</entry>
</feed>