| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| in and out Registriert seit: Jun 2001 Ort: hamburg
Beiträge: 142
|
Holla Zusammen ![]() ich baue gerade mit as3 und papervision ein Element das einen Würfel beinhaltet der über die Maus per "Drag" (googleEarth-artig) rotiert werden kann. Das klappt super. Was ich nun vorhabe und nicht genau weiß wie ich ran gehen soll da ich in Papervision kaum was gemacht habe: Ich möchte onMouseUp ermitteln welche Seite des Cubes die Kamera am ehesten anschaut (und dann den Cube dorthin tweenen mit der richtigen Rotation). Ich bin aber nicht sicher ob das mit dem bisherigen Ansatz so funktionieren kann. Wenn sich jemand erbarmt mir einen Schups zu geben wäre ich echt dankbar... Anschauen: http://labs.advanced-users.de/cube/ Laden: http://labs.advanced-users.de/cube/cubeheader.zip Code: PHP-Code: |
| | |
| | #2 (permalink) |
| Neuer User Registriert seit: Nov 2005
Beiträge: 548
|
Grundsätzlich löst man so etwas, indem man das Punktprodukt von Flächennormale und Richtung zur Kamera für jede Fläche bildet. Genau wie bei der Beleuchtung (die Kamera entspricht dabei dem Licht): Der größte Wert schaut dann am ehesten zur Kamera (wird am hellsten beleuchtet), negative Werte schauen von der Kamera weg (werden gar nicht beleuchtet). Wenn es sich nur um einen Würfel handelt und die Kamera entlang einer Weltachse positioniert ist (z.B. v=(0,0,1)) ist es noch einfacher: die Flächennormalen stecken bereits in der aktuellen Rotationsmatrix, und beim Punktprodukt mit (0,0,1) bleibt nur jeweils der Z-Wert der Normalen übrig. Alles was man tun muss ist also die Z-Werte der drei Achsen sowie die negierten Z-Werte für die jeweils gegenüberliegende Seite zu vergleichen und den größten Wert aus diesen 6 finden - das ist dann die Seite die zur Kamera schaut. ActionScript:
|
| | |
| | #4 (permalink) |
| in and out Registriert seit: Jun 2001 Ort: hamburg
Beiträge: 142
|
Holla nochmal joeydee ![]() eine Frage noch - ich bin mit der Matrix3D noch garnicht warm geworden... Wenn ich nun den Würfel bzw. Container nach dem ich weiss welche Seite vorne ist auf eine feste rotationX, rotationY, rotationZ Position setzen möchte klappt das nicht mehr (sicher weil ich ja mit der Matrix rotiere). Wie würdest du da ran gehen? Habe vorher nur die rotationX (Y, Z) Werte bearbeitet und da war es logischerweise kein Problem dorthin zu tweenen... Danke |
| | |
| | #5 (permalink) |
| Neuer User Registriert seit: Nov 2005
Beiträge: 548
|
Mit Euler-Winkeln (das sind die Rotationswinkel der Achsen) ist das nicht ganz trivial zu lösen, da es u.a. mehrere Möglichkeiten und "Totpunkte" (Gimbal Lock) geben kann. Die mathematisch beste Lösung ist wohl über Quaternions (in diesem Fall sozusagen ein mathematischer Ersatz zur Matrix als Lagebeschreibung eines Objekts), da kann man die Werte leichter interpolieren um von einer Lage in die andere zu drehen. Glücklicherweise unterstützt Papervision das :-) Normalerweise biete ich ungern Komplettlösungen ohne dass der Nutzer versteht was da passiert, aber hier gehts leider nicht anders, Glück gehabt ;-) Überall wo // ----- new ----- steht hat sich was geändert: Einbinden der Quaternion-Klasse und 3 private Vars im Header, der vorher gepostete Code natürlich, sowie eine zusätzliche Funktion zum Tweenen für den Enter-Frame-Listener. Wenn du verstehst dass eine Matrix ein mathematisches Konstrukt zur allgemeinen Lagebeschreibung ist, und ein Quaternion ein Ersatz dafür sein kann, und dass Papervision gewisse Funktionen bietet beide ineinander umzurechnen, dann solltest du im Groben verstehen was da nun passiert (nächster Post, da zu lang) |
| | |
| | #6 (permalink) |
| Neuer User Registriert seit: Nov 2005
Beiträge: 548
| ActionScript:
|
| | |
| | #7 (permalink) |
| in and out Registriert seit: Jun 2001 Ort: hamburg
Beiträge: 142
|
Moin nochmal ![]() danke für die Komplettlösung - ich denke das ich nach ein wenig rumspielen dazu in der Lage bin es besser zu begreifen. Wirklich einen dicken Dank dafür - solltest du dich in der nähe von HH rumtreiben (oder auf der nächsten FFK) lass ich gerne ein paar Biere springen |
| | |
| | #8 (permalink) |
| Neuer User Registriert seit: Dec 2009
Beiträge: 3
| SLERP für ein rotierendes Objekt
Hallo joeydee! Erstmals vielen Dank für dein Beispiel. Es hat mir geholfen, zu verstehen, wie ich meinen eigenen Würfel bauen muss. Leider habe ich nun eine Schwierigkeit, die ich einfach nicht hinkriege. Mein Würfel rotiert, wenn man mit der Maus ausserhalb des Flashfilms ist. D.h. die Rotationsachsen y,z verändern sich ständig. Wenn man auf den Würfel fährt wird die Rotation unterbrochen. Wenn ich nun versuche, anaolg zu deinem Beispiel eine Transformation zu machen, dann wird der Würfel zwar rotiert jedoch werden die Rotationsachsen nicht auf 0 gestellt und der Würfel liegt schrägt im Bild. Wie schaffe ich es, dass ich einen rotierenden Würfel wieder perfekt ausgerichtet hinbekomme? Neuer Eventhandler im build3D(); Code: addEventListener( Event.ENTER_FRAME, rotateObject ); this.stage.addEventListener( MouseEvent.MOUSE_OVER, onMouseOver); Code: private function rotateObject( e:Event ):void {
if (tweening) {
cube.rotationY += 2;
cube.rotationZ += 2;
if (cube.rotationY >= 180) {
cube.rotationY = -180;
}
if (cube.rotationZ >= 180) {
cube.rotationZ = -180;
}
renderer.renderScene( scene, camera, viewport );
}
} Code: private function onMouseOver( event : Event ):void {
tweening = false;
} |
| | |
| | #9 (permalink) |
| Neuer User Registriert seit: Nov 2005
Beiträge: 548
|
Eigentlich sollte das eine absolute Endposition sein, egal wie der Würfel vorher gedreht ist. Fehlersuche würde ich so anfangen: was passiert denn wenn du nach einigem Drehen statt dem Tween die Einheitsmatrix direkt zuweist (container.transform=new Matrix3D()) - ist er dann auch schräg?
|
| | |
| | #10 (permalink) |
| Neuer User Registriert seit: Dec 2009
Beiträge: 3
|
Hallo joeydee Danke für Deinen Vorschlag. Leider habe ich damit nichts herausfinden können. Anstelle des Tweens habe ich die Einheitsmatrix zugewiesen wie du vorschlägst. Das Resultat ist dann ein Würfel, der immer auf eine Art schräg liegt. Ich habe noch versucht, die Achsen auf 0 zusetzen bevor ich den Tween zum shallQUat starte. Dann funnktioniert es zwar, für den Benutzer ist es jedoch unbrauchbar weil der Würfel sich beim Zurücksetzen der Achse irgendwie verdreht und nicht die von der Maus ausgewählte Seite vorne ist. Hast Du mir noch einen Tipp. Ich bin wirklich ratlos. |
| | |
| | #12 (permalink) |
| Neuer User Registriert seit: Dec 2009
Beiträge: 3
|
Hallo joeydee Danke für die beiden Inputs. Ich habe diese geprüft und gemerkt, dass ich den cube rotiert habe und nicht den container und deshalb die Transformation nicht funktionierte. Ich DANKE DIR für Deine Hilfe!! |
| | |
![]() |
| Lesezeichen |
| Stichworte |
| as3, cube, papervision3d |
| Themen-Optionen | |
| Ansicht | |
| |