PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#, Visual Studio, XNA Game Studio 4.0, Silverlight: Cubes im Raum drehen


mobius
2012-04-13, 20:16:21
Nabend Forum,

hab hier folgende Konstellation: C#, Visual Studio, XNA Game Studio 4.0 und es geht generell um Silverlight.

Ich habe die Aufgabe 3 Cubes im Raum zu drehen. Einer in der Mitte um sich selbst, einer rotatiert in etwas Entfernung um die Mitte und einer dritte weiter weg um den zweiten.
Hier mal ein Bild:
http://img6.imagebanana.com/img/15z6f38h/thumb/wuerfel.png (http://www.imagebanana.com/view/15z6f38h/wuerfel.png)

Würfel 1 und 2 funktionieren, aber den dritten bekomm ich nicht hin. Wie rotiere ich um ein anderes Objekt anstatt standardmäßig um die Mitte?
Dürfte etwas mit Quaternions zu tun haben, aber da steig ich nicht durch. Nützliche Beispiele hab ich auch keine gefunden.

Kennt sich damit Jemand aus?
Kann das ganze Projekt mal hochladen, falls Interesse besteht.

Gast
2012-04-13, 21:43:46
Wenn sich A um B dreht kenn ich das so, dass für die Rotation erst mal die Koordinaten von A um B "verschoben" werden

also wenn B in bx und by liegt zieht man von ax und ay die ab... dann dreht man A ganz normal um den Ursprung, und dann wird wieder zurückverschoben...

del_4901
2012-04-13, 22:20:32
Die Rotation ist nicht kommutativ. Oder mit anderen Worten der Punkt um den du rotierst liegt immer im Koordinatenursprung. Wenn du also ein Objekt um ein anderes rotieren moechtest, dann musst du es relativ zum Ursprung verschieben, rotieren und danach wieder zurueckschieben.

Elemental
2012-04-14, 22:07:09
Da ist ein schoenes Beispiel in Petzolds WPF3D Buch, wo er die Planeten des Sonnensystem rotieren laesst. Wenn du damit was anfangen kannst such ich das morgen mal raus.

mobius
2012-04-15, 18:51:09
Danke Leute ich werds mal versuchen.

@Elemental: Wäre wirklich super, wenn du das machen könntest. Ich denke ein schönes Tutorial bringt mir am meisten.

Elemental
2012-04-17, 09:42:05
Zitat:
"Wenn über Himmelskörper wie Sonne, Erde und Mond gesprochen wird, ist es üblich, das Wort Rotation zu benutzen, um sich auf die Drehung eines Objektes um seine Achse zu beziehen, wohingegen das Wort Umlauf (engl. Revolution) benutzt wird, um zu beschreiben, wie sich ein Objekt in einem Orbit um ein anderes Objekt bewegt. Ob Sie eine Rotation oder einen Umlauf erhalten, ist davon abhängig, in welcher Reihenfolge Sie RotateTransform3D und TranslateTransform3D anwenden.

Damit sich der rotierende cyane Würfel wie der kreisende rosa Würfelverhält, können Sie das RotateTransform3D-Tag, das auf den cyanen Würfel angewendet wird, wie folgt ändern:

<RotateTranform3D CenterX="-3" />


Wie Sie vielleicht noch wissen, entspricht das Setzen der CenterX-Eigenschaft von RotateTransform3D einer Rotation, der eine Translation vorangeht und folgt:

<TranslateTranform3D CenterX="3" />
<RotateTransform3D>
...
</RotateTransform3D>
<TranslateTranform3D CenterX="-3" />


...

Wenn der rosa Würfel um den grauen Würfel im Zentrum kreisst, vollzieht er im Verlauf jeder Umkreisung eine Rotation. Dem grauen Würfel ist somit immer dieselbe Seite des rosa Würfels zugewandt. Woran erinnert Sie das? An den Mond vielleicht?

Lassen Sie uns versuchen, die Sonne, die Erde und den Mond mit einer Kombination aus TranslateTranform3D, ScaleTransform3D und RotateTransform3D nachzuahmen. Unglücklicherweise ist es fast unmöglich, diese 3 Himmelskörper mit den richtigen Proportionen nachzubilden. Würde für den Mond eine Grösse von einem Pixel (was einer Standard-Anzeigegrösse von 1/96 Inch entspricht) verwendet, wäre die Erde vier Pixel gross, und die beiden Körper wären 100 Pixel voneinander entfernt. Dies ließe sich durchaus realisieren, bis die Sonne ins Spiel käme. Die Sonne wäre ca. 400 Pixel gross und ungefähr 40 000 Pixel von der Erde entfernt. Dies ist etwas mehr, als die meisten heutigen Monitore zu leisten vermögen.
Abgesehen davon arbeiten wir mit Würfeln, sodass wir in jedem Fall kein sehr realistisches Abbild erhalten."


Das dazugehörende Code gibts hier:
http://examples.oreilly.de/english_examples/9780735623941/3DProgWin/Chapter%203/CelestialBodies.xaml

Die .xaml Datei lokal abspeichern. Dann kannst du sie mit dem InternetExplorer öffnen und siehst die rotierenden Würfel. (geht zumindest bei Windows 7, bei meinem XP gehts nicht).

edit:
Das einfachere erste Beispiel, woran das Problem der Reihenfolge von Rotation uns Translation gezeigt wird, ist das hier:
http://examples.oreilly.de/english_examples/9780735623941/3DProgWin/Chapter%203/RotationAndRevolution.xaml

mobius
2012-04-23, 23:38:47
Danke vielmals. Ich werde mir das mal in Ruhe zu gemütige führen. Langsam gehts voran ^^.