Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 24-07-2008, 13:46   #1 (permalink)
Flash Developer
 
Benutzerbild von luschn
 
Registriert seit: Aug 2004
Ort: Wien
Beiträge: 248
Unhappy Papervision localRotation und rotation

ich hab ein kleines problem bei der steuerung eines objektes (ein kreuz) in papervision (code befindet sich im onEnterFrame):
Code:
kreuz_container.localRotationZ = ((mouseX / stage.width) * 360);
kreuz_container.rotationX = ((mouseY / stage.height) * 360);
zeile 1 soll mir das objekt über die lokale Z-achse drehen, d.h. der hauptstab in der mitte soll sich immer um die längsachse drehen. funktioniert auch soweit, sobald ich zeile 2 hinzufüge funktionierts allerdings nicht mehr, dann greift nur noch zweile 2 und man kann lediglich nach vorne/hinten bewegen, eben über die globale X-achse. wenn ich "localRotationZ" in "rotationZ" ändere dann funktionierts, aber es wird halt immer um die globale Z-achse gedreht und das ist für mich unbrauchbar. sobald man das objekt etwas um die X-achse gedreht hat, dreht es sich danach nicht mehr um die längsachse des mittelstabes...

wenn ich zweile 1 nach zeile 2 angebe, dann funktioniert die bewegung nach oben unten nach wie vor, aber links/rechts drehen um die eigene Z-achse geht nicht so wirklich, dann zuckt das kreuz ein wenige aber dreht sich nicht richtig.

ich hoffe das war irgendwie vesrständlich...

edit: gut, prinzipiell mach ich da wohl einiges falsch. ich darf natürlich NUR das lokale koordinatensystem verwenden, sonst kann ich das objekt ja nicht im globalen system verschieben, dann würds nur im ursprung funktionieren...
das problem ist also jetzt: wenn ich das kreuz um die x-achse drehe, dann kann ichs danach nicht mehr so wirklich um die z-achse drehen. irgendwie..klappt das nicht so ganz mit diesem code:

Code:
//nach oben/unten: -45° bis +45°
kreuz_container.localRotationX = ((mouseY / stage.height) * 90) - 45;
//kreuz drehen: -45° bis +45°
kreuz_container.localRotationZ = ((mouseX / stage.width) * 90) - 45;
es wird zwar immer richtig gedreht, wenn ich aber etwas herumfahre mit der maus und dann wieder in die mitte, dann kommt immer ein anderes ergebnis raus.

Geändert von luschn (24-07-2008 um 15:39 Uhr)
luschn ist offline   Mit Zitat antworten
Alt 25-07-2008, 09:53   #2 (permalink)
Neuer User
 
Registriert seit: Oct 2006
Beiträge: 64
sieht das bei dir in etwas so aus?
bei mir verhält es sich zumindest so wie man es erwarten würde. aber evtl kannst du ja noch etwas mehr code posten.


PHP-Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="init()">
    <mx:Script>
        <![CDATA[
            import mx.core.UIComponent;
            import org.papervision3d.objects.primitives.Plane;
            import org.papervision3d.materials.MovieMaterial;
            import org.papervision3d.materials.BitmapMaterial;
            import org.papervision3d.render.BasicRenderEngine;
            import org.papervision3d.view.Viewport3D;
            import org.papervision3d.cameras.DebugCamera3D;
            import org.papervision3d.scenes.Scene3D;
        
            public var scene:Scene3D;
            public var camera:DebugCamera3D;
            public var viewport:Viewport3D;
            public var renderer:BasicRenderEngine;
            
            private var bitmapMat:BitmapMaterial = new BitmapMaterial(new BitmapData(100,100,false,0xFFFFBB));
            private var movieMat:MovieMaterial;
            private var plane:Plane = new Plane(null,100,100);
            public function init():void
            {
                scene = new Scene3D();
                viewport = new Viewport3D(800,600);
                renderer = new BasicRenderEngine();
                camera = new DebugCamera3D(viewport);
                camera.z = -200;
                addEventListener(Event.ENTER_FRAME,update);
                
                var myui:UIComponent = new UIComponent();
                myui.addChild(viewport)
                addChild(myui);
                plane.material = bitmapMat;
                scene.addChild(plane);
                camera.lookAt(plane);
            }
            private function update(e:Event):void{
                renderer.renderScene(scene,camera,viewport)
                
                plane.localRotationX = ((viewport.mouseY / viewport.height) * 90) - 45;
                plane.localRotationZ = ((viewport.mouseX / viewport.width) * 90) - 45;
            }
        ]]>
    </mx:Script>
</mx:Application>
reap ist offline   Mit Zitat antworten
Alt 25-07-2008, 10:29   #3 (permalink)
Flash Developer
 
Benutzerbild von luschn
 
Registriert seit: Aug 2004
Ort: Wien
Beiträge: 248
das ist so ziemlich der selbe code, und er führt exakt zum selben ergebnis. fahr mal mit der maus ein paar mal um das objekt herum, dann siehst du was ich meine.
wie ich das sehe müsste ich um eine FIXE x-achse drehen, aber um eine variable z-achse. wenn ich nämlich zb um die z-achse drehe, dann dreht sich ja auch die x-achse mit.
luschn ist offline   Mit Zitat antworten
Alt 25-07-2008, 11:22   #4 (permalink)
Flash Developer
 
Benutzerbild von luschn
 
Registriert seit: Aug 2004
Ort: Wien
Beiträge: 248
hurra, ich habs! die lösung war denkbar einfach, ich hab einen container angelegt der wiederum das eigentliche objekt beinhaltet. der container rotiert um die x-achse, das objekt selbst um seine eigene z-achse.
Code:
kreuz_container_main.addChild(kreuz_container_sub); //eigentliches objekt in den haupt-container
default_scene.addChild(kreuz_container_main);
Code:
override protected function processFrame():void
{	
   //nach oben/unten: -45° bis +45°
   kreuz_container_main.localRotationX = ((mouseY / stage.height) * 90) - 45;
   //kreuz drehen: -45° bis +45°
   kreuz_container_sub.localRotationZ = ((mouseX / stage.width) * 90) - 45;
}
kommt mir zwar nicht sooo sauber vor, aber es funktioniert...
luschn ist offline   Mit Zitat antworten
Alt 25-07-2008, 15:02   #5 (permalink)
Flash Developer
 
Benutzerbild von luschn
 
Registriert seit: Aug 2004
Ort: Wien
Beiträge: 248
so, nächstes problem:

ich hab im sub-container ein 3d-objekt. von diesem weiss ich zu beginn die koordinaten (zb: kreuz_container_main.x+kreuz_container_sub.x+testo bjekt.x)...vielleicht gibts dafür ne schönere möglichkeit, aber es funkt zumindest mal. ich brauche auf jeden fall die koordinaten relativ zum globalen koordinatensystem.
jetzt muss ich aber die koordinaten bei jedem screen-refresh wissen, allerdings bleiben die IMMER konstant. vermutlich weil...das lokale koordinatensystem gedreht wird? keine ahnung...
luschn ist offline   Mit Zitat antworten
Alt 30-07-2008, 08:49   #6 (permalink)
Flash Developer
 
Benutzerbild von luschn
 
Registriert seit: Aug 2004
Ort: Wien
Beiträge: 248
die lösung ist wie immer einfach:

sceneX, sceneY und sceneZ ist die lösung
luschn ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele