Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 18-08-2009, 15:21   #1 (permalink)
in and out
 
Benutzerbild von Nikolai
 
Registriert seit: Jun 2001
Ort: hamburg
Beiträge: 142
Question Papervision - ermitteln welche Seite eines Cubes die Kamera anschaut

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:
package {
    
import br.com.stimuli.loading.BulkLoader;
    
import br.com.stimuli.loading.BulkProgressEvent;
    
    
import org.papervision3d.core.math.Matrix3D;
    
import org.papervision3d.core.math.Number3D;
    
import org.papervision3d.core.proto.CameraObject3D;
    
import org.papervision3d.core.proto.MaterialObject3D;
    
import org.papervision3d.materials.*;
    
import org.papervision3d.materials.utils.*;
    
import org.papervision3d.objects.*;
    
import org.papervision3d.objects.primitives.*;
    
import org.papervision3d.render.*;
    
import org.papervision3d.scenes.*;
    
import org.papervision3d.view.*;
    
    
import flash.display.Bitmap;
    
import flash.display.BitmapData;
    
import flash.events.Event;
    
import flash.events.MouseEvent;
    
import flash.geom.Point;    

    
/**
     *    @author    Nikolai
     *    @date      10:42:26 06.08.2009
     */
    
public class CubeRotator extends BasicView {

        private var 
cube Cube;

        private var 
texture_bmp_data1 BitmapData;
        private var 
texture_bmp_data2 BitmapData;
        private var 
texture_bmp_data3 BitmapData;
        private var 
texture_bmp_data4 BitmapData;
        private var 
texture_bmp_data5 BitmapData;
        private var 
texture_bmp_data6 BitmapData;

        private var 
targetTexture1 BitmapData;
        private var 
targetTexture2 BitmapData;
        private var 
targetTexture3 BitmapData;
        private var 
targetTexture4 BitmapData;
        private var 
targetTexture5 BitmapData;
        private var 
targetTexture6 BitmapData;

        private var 
loader BulkLoader;

        private var 
textureImage : Class;
        private var 
container DisplayObject3D;

        private var 
previousMousePoint Point = new Point();
        private static const 
FORWARD Number3D = new Number3D(001);

        
        public function 
CubeRotator() {
            
addEventListener(Event.ADDED_TO_STAGEonAddedToStage);
        }

        private function 
onAddedToStage(event Event) : void {

            
loader = new BulkLoader("cube");
            
loader.logLevel BulkLoader.LOG_INFO;
            
loader.add("1.jpg", {id:"1"});
            
loader.add("2.jpg", {id:"2"});
            
loader.add("3.jpg", {id:"3"});
            
loader.add("4.jpg", {id:"4"});
            
loader.add("5.jpg", {id:"5"});
            
loader.add("6.jpg", {id:"6"});
            
loader.addEventListener(BulkLoader.COMPLETEonAllItemsLoaded);
            
loader.addEventListener(BulkLoader.PROGRESSonAllItemsProgress);
            
            
loader.start();
        }

        private function 
onAllItemsProgress(event BulkProgressEvent) : void {
            
trace(event.loadingStatus());
        }

        
        private function 
onAllItemsLoaded(event Event) : void {
            
            var 
bitmap1 Bitmap loader.getBitmap("1");
            var 
bitmap2 Bitmap loader.getBitmap("2");
            var 
bitmap3 Bitmap loader.getBitmap("3");
            var 
bitmap4 Bitmap loader.getBitmap("4");
            var 
bitmap5 Bitmap loader.getBitmap("5");
            var 
bitmap6 Bitmap loader.getBitmap("6");
            
            
texture_bmp_data1 bitmap1.bitmapData;
            
texture_bmp_data2 bitmap2.bitmapData;
            
texture_bmp_data3 bitmap3.bitmapData;
            
texture_bmp_data4 bitmap4.bitmapData;
            
texture_bmp_data5 bitmap5.bitmapData;
            
texture_bmp_data6 bitmap6.bitmapData;
            
            
targetTexture1 = new BitmapData(200200false0xffffff);
            
targetTexture1.draw(texture_bmp_data1);
            
targetTexture2 = new BitmapData(200200false0xffffff);
            
targetTexture2.draw(texture_bmp_data2);
            
targetTexture3 = new BitmapData(200200false0xffffff);
            
targetTexture3.draw(texture_bmp_data3);
            
targetTexture4 = new BitmapData(200200false0xffffff);
            
targetTexture4.draw(texture_bmp_data4);
            
targetTexture5 = new BitmapData(200200false0xffffff);
            
targetTexture5.draw(texture_bmp_data5);
            
targetTexture6 = new BitmapData(200200false0xffffff);
            
targetTexture6.draw(texture_bmp_data6);
            
            
build3D();
        }

        private function 
build3D() : void {
            
            
viewport = new Viewport3D(00truetrue);
            
addChild(viewport);
                                    
            
renderer = new BasicRenderEngine();
                                    
            
scene = new Scene3D();
            
            var 
frontmat BitmapMaterial = new BitmapMaterial(targetTexture1);
            
frontmat.interactive true;    
            
frontmat.name "1";
            
            var 
backmat BitmapMaterial = new BitmapMaterial(targetTexture2);
            
backmat.interactive true;    
            
backmat.name "2";
            
            var 
leftmat BitmapMaterial = new BitmapMaterial(targetTexture3);
            
leftmat.interactive true;
            
leftmat.name "3";
            
            var 
rightmat BitmapMaterial = new BitmapMaterial(targetTexture4);
            
rightmat.interactive true;    
            
rightmat.name "4";
            
            var 
topmat BitmapMaterial = new BitmapMaterial(targetTexture5);
            
topmat.interactive true;    
            
topmat.name "5";
            
            var 
bottommat BitmapMaterial = new BitmapMaterial(targetTexture6);
            
bottommat.interactive true;
            
bottommat.name "6";
            
            
cube = new Cube(new MaterialsList({front:frontmatback:backmatleft:leftmatright:rightmattop:topmatbottom:bottommat}), 200200200555);
            
            
camera.zoom 11;
            
camera.focus 100;      
            
            
this.stage.addEventListener(MouseEvent.MOUSE_DOWNonMouseDown);
            
            
container = new DisplayObject3D();
            
container.addChild(cube"cube");
         
            
scene.addChild(container);
            
singleRender();
        }

        private function 
onMouseDownevent Event ) : void {
            
this.startRendering();
            
previousMousePoint = new Point(viewport.containerSprite.mouseXviewport.containerSprite.mouseY);
            
this.stage.addEventListener(MouseEvent.MOUSE_MOVEonMouseMove);
            
this.stage.addEventListener(MouseEvent.MOUSE_UPonMouseUp);
        }

        private function 
onMouseUpevent Event ) : void {
            
//this.stopRendering();
            
this.stage.removeEventListener(MouseEvent.MOUSE_MOVEonMouseMove);
            
this.stage.removeEventListener(MouseEvent.MOUSE_UPonMouseUp);
            
            
trace(container.rotationXcontainer.rotationYcontainer.rotationZ); 
            
            
//container.lookAt(camera, new Number3D(0,90,0));
            //container.lookAt(camera);
        
            //side1 180 0 180
            //side2 0 0 0
            //side3 -180 -90 180
            //side4 180 90 180
            //side5 90 0 0
            //side6 90 0 180
            
        
}

        private function 
onMouseMoveevent Event ) : void {  
            var 
currentMousePoint Point = new Point(viewport.containerSprite.mouseXviewport.containerSprite.mouseY);
    
            var 
difference Point currentMousePoint.subtract(previousMousePoint);
            var 
vector Number3D = new Number3D(difference.xdifference.y0);
    
            var 
rotationAxis Number3D Number3D.cross(vectorFORWARD);
            
rotationAxis.normalize();
    
            var 
distance Number Point.distance(currentMousePointpreviousMousePoint);
            var 
rotationMatrix Matrix3D Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.yrotationAxis.zdistance*/ (600 Math.pow(container.scale5)));
    
            
container.transform.calculateMultiply3x3(rotationMatrixcontainer.transform);
            
container.copyTransform(container);
         
            
previousMousePoint currentMousePoint;
        }
        
    }

__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Alt 19-08-2009, 08:26   #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:
  1. private function onMouseUp( event : Event ) : void {
  2.             //this.stopRendering();
  3.             this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
  4.             this.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  5.            
  6.            
  7.             // ----- new -----
  8.            
  9.             //Skalarprodukte der einzelnen Oberflächennormalen mit der Kameraposition
  10.             var s=new Array();
  11.             s[1]=-container.transform.n33;
  12.             s[2]=container.transform.n33;
  13.             s[3]=container.transform.n31;
  14.             s[4]=-container.transform.n31;
  15.             s[5]=-container.transform.n32;
  16.             s[6]=container.transform.n32;
  17.            
  18.             //Maximum finden
  19.             var max=0;
  20.             var side=0;
  21.             for(var i=1;i<=6;i++){
  22.                 if(s[i]>max){
  23.                     max=s[i];
  24.                     side=i;
  25.                     }
  26.                 }
  27.                
  28.             //gefundene Seite ausgeben
  29.             trace(side);
  30.    
  31.            
  32.             // ----- /new -----
  33.            
  34.            
  35.             //trace(container.rotationX, container.rotationY, container.rotationZ);
  36.            
  37.             //container.lookAt(camera, new Number3D(0,90,0));
  38.             //container.lookAt(camera);
  39.        
  40.             //side1 180 0 180
  41.             //side2 0 0 0
  42.             //side3 -180 -90 180
  43.             //side4 180 90 180
  44.             //side5 90 0 0
  45.             //side6 90 0 180
  46.            
  47.         }
joeydee ist offline   Mit Zitat antworten
Alt 19-08-2009, 10:36   #3 (permalink)
in and out
 
Benutzerbild von Nikolai
 
Registriert seit: Jun 2001
Ort: hamburg
Beiträge: 142
Toll

und danke für das BSP denn rein mit der Erklärung wäre ich glaube ich noch überfordert gewesen. 1a
__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Alt 19-08-2009, 13:34   #4 (permalink)
in and out
 
Benutzerbild von Nikolai
 
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
__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Alt 19-08-2009, 14:32   #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)
joeydee ist offline   Mit Zitat antworten
Alt 19-08-2009, 14:33   #6 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
ActionScript:
  1. package {
  2.     import br.com.stimuli.loading.BulkLoader;
  3.     import br.com.stimuli.loading.BulkProgressEvent;
  4.    
  5.     import org.papervision3d.core.math.Matrix3D;
  6.     import org.papervision3d.core.math.Quaternion;  // ----- new -----
  7.     import org.papervision3d.core.math.Number3D;
  8.     import org.papervision3d.core.proto.CameraObject3D;
  9.     import org.papervision3d.core.proto.MaterialObject3D;
  10.     import org.papervision3d.materials.*;
  11.     import org.papervision3d.materials.utils.*;
  12.     import org.papervision3d.objects.*;
  13.     import org.papervision3d.objects.primitives.*;
  14.     import org.papervision3d.render.*;
  15.     import org.papervision3d.scenes.*;
  16.     import org.papervision3d.view.*;
  17.    
  18.     import flash.display.Bitmap;
  19.     import flash.display.BitmapData;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.geom.Point;   
  23.  
  24.     /**
  25.      *    @author    Nikolai
  26.      *    @date      10:42:26 06.08.2009
  27.      */
  28.     public class CubeRotator extends BasicView {
  29.  
  30.         private var cube : Cube;
  31.  
  32.         private var texture_bmp_data1 : BitmapData;
  33.         private var texture_bmp_data2 : BitmapData;
  34.         private var texture_bmp_data3 : BitmapData;
  35.         private var texture_bmp_data4 : BitmapData;
  36.         private var texture_bmp_data5 : BitmapData;
  37.         private var texture_bmp_data6 : BitmapData;
  38.  
  39.         private var targetTexture1 : BitmapData;
  40.         private var targetTexture2 : BitmapData;
  41.         private var targetTexture3 : BitmapData;
  42.         private var targetTexture4 : BitmapData;
  43.         private var targetTexture5 : BitmapData;
  44.         private var targetTexture6 : BitmapData;
  45.  
  46.         private var loader : BulkLoader;
  47.  
  48.         private var textureImage : Class;
  49.         private var container : DisplayObject3D;
  50.  
  51.         private var previousMousePoint : Point = new Point();
  52.         private static const FORWARD : Number3D = new Number3D(0, 0, 1);
  53.        
  54.         // ----- new -----
  55.         private var isQuat:Quaternion;
  56.         private var shallQuat:Quaternion;
  57.         private var tweenTime:Number;
  58.        
  59.         public function CubeRotator() {
  60.             trace("myClass");
  61.             addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  62.         }
  63.  
  64.         private function onAddedToStage(event : Event) : void {
  65.  
  66.             loader = new BulkLoader("cube");
  67.             loader.logLevel = BulkLoader.LOG_INFO;
  68.             loader.add("1.jpg", {id:"1"});
  69.             loader.add("2.jpg", {id:"2"});
  70.             loader.add("3.jpg", {id:"3"});
  71.             loader.add("4.jpg", {id:"4"});
  72.             loader.add("5.jpg", {id:"5"});
  73.             loader.add("6.jpg", {id:"6"});
  74.             loader.addEventListener(BulkLoader.COMPLETE, onAllItemsLoaded);
  75.             loader.addEventListener(BulkLoader.PROGRESS, onAllItemsProgress);
  76.            
  77.             loader.start();
  78.         }
  79.  
  80.         private function onAllItemsProgress(event : BulkProgressEvent) : void {
  81.             trace(event.loadingStatus());
  82.         }
  83.  
  84.        
  85.         private function onAllItemsLoaded(event : Event) : void {
  86.            
  87.             var bitmap1 : Bitmap = loader.getBitmap("1");
  88.             var bitmap2 : Bitmap = loader.getBitmap("2");
  89.             var bitmap3 : Bitmap = loader.getBitmap("3");
  90.             var bitmap4 : Bitmap = loader.getBitmap("4");
  91.             var bitmap5 : Bitmap = loader.getBitmap("5");
  92.             var bitmap6 : Bitmap = loader.getBitmap("6");
  93.            
  94.             texture_bmp_data1 = bitmap1.bitmapData;
  95.             texture_bmp_data2 = bitmap2.bitmapData;
  96.             texture_bmp_data3 = bitmap3.bitmapData;
  97.             texture_bmp_data4 = bitmap4.bitmapData;
  98.             texture_bmp_data5 = bitmap5.bitmapData;
  99.             texture_bmp_data6 = bitmap6.bitmapData;
  100.            
  101.             targetTexture1 = new BitmapData(200, 200, false, 0xffffff);
  102.             targetTexture1.draw(texture_bmp_data1);
  103.             targetTexture2 = new BitmapData(200, 200, false, 0xffffff);
  104.             targetTexture2.draw(texture_bmp_data2);
  105.             targetTexture3 = new BitmapData(200, 200, false, 0xffffff);
  106.             targetTexture3.draw(texture_bmp_data3);
  107.             targetTexture4 = new BitmapData(200, 200, false, 0xffffff);
  108.             targetTexture4.draw(texture_bmp_data4);
  109.             targetTexture5 = new BitmapData(200, 200, false, 0xffffff);
  110.             targetTexture5.draw(texture_bmp_data5);
  111.             targetTexture6 = new BitmapData(200, 200, false, 0xffffff);
  112.             targetTexture6.draw(texture_bmp_data6);
  113.            
  114.             build3D();
  115.         }
  116.  
  117.         private function build3D() : void {
  118.            
  119.             viewport = new Viewport3D(0, 0, true, true);
  120.             addChild(viewport);
  121.                                     
  122.             renderer = new BasicRenderEngine();
  123.                                     
  124.             scene = new Scene3D();
  125.            
  126.             var frontmat : BitmapMaterial = new BitmapMaterial(targetTexture1);
  127.             frontmat.interactive = true;   
  128.             frontmat.name = "1";
  129.            
  130.             var backmat : BitmapMaterial = new BitmapMaterial(targetTexture2);
  131.             backmat.interactive = true
  132.             backmat.name = "2";
  133.            
  134.             var leftmat : BitmapMaterial = new BitmapMaterial(targetTexture3);
  135.             leftmat.interactive = true;
  136.             leftmat.name = "3";
  137.            
  138.             var rightmat : BitmapMaterial = new BitmapMaterial(targetTexture4);
  139.             rightmat.interactive = true;   
  140.             rightmat.name = "4";
  141.            
  142.             var topmat : BitmapMaterial = new BitmapMaterial(targetTexture5);
  143.             topmat.interactive = true
  144.             topmat.name = "5";
  145.            
  146.             var bottommat : BitmapMaterial = new BitmapMaterial(targetTexture6);
  147.             bottommat.interactive = true;
  148.             bottommat.name = "6";
  149.            
  150.             cube = new Cube(new MaterialsList({front:frontmat, back:backmat, left:leftmat, right:rightmat, top:topmat, bottom:bottommat}), 200, 200, 200, 5, 5, 5);
  151.            
  152.             camera.zoom = 11;
  153.             camera.focus = 100;     
  154.            
  155.             this.stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  156.            
  157.             container = new DisplayObject3D();
  158.             container.addChild(cube, "cube");
  159.          
  160.             scene.addChild(container);
  161.             singleRender();
  162.         }
  163.  
  164.         private function onMouseDown( event : Event ) : void {
  165.             this.startRendering();
  166.             previousMousePoint = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
  167.             this.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
  168.             this.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  169.         }
  170.  
  171.         private function onMouseUp( event : Event ) : void {
  172.             //this.stopRendering();
  173.             this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
  174.             this.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  175.            
  176.            
  177.             // ----- new -----
  178.            
  179.             //Skalarprodukte der einzelnen Oberflächennormalen mit der Kameraposition
  180.             var s=new Array();
  181.             s[1]=-container.transform.n33;
  182.             s[2]=container.transform.n33;
  183.             s[3]=container.transform.n31;
  184.             s[4]=-container.transform.n31;
  185.             s[5]=-container.transform.n32;
  186.             s[6]=container.transform.n32;
  187.            
  188.             //Soll-Positionen als Quaternions
  189.             var quaternionPos=new Array();
  190.             quaternionPos[0]=new Quaternion();//Einheits-Quaternion, falls Maximum-Test weiter unten fehlschlägt
  191.             quaternionPos[1]=Quaternion.createFromEuler(180,0,0,true);
  192.             quaternionPos[2]=Quaternion.createFromEuler(0,0,0,true);
  193.             quaternionPos[3]=Quaternion.createFromEuler(-90,0,0,true);
  194.             quaternionPos[4]=Quaternion.createFromEuler(90,0,0,true);
  195.             quaternionPos[5]=Quaternion.createFromEuler(0,0,-90,true);
  196.             quaternionPos[6]=Quaternion.createFromEuler(0,180,90,true);
  197.  
  198.  
  199.             //Maximum finden
  200.             var max=0;
  201.             var side=0;
  202.             for(var i=1;i<=6;i++){
  203.                 if(s[i]>max){
  204.                     max=s[i];
  205.                     side=i;
  206.                     }
  207.                 }
  208.                
  209.             //Debug only: gefundene Seite ausgeben
  210.             //trace(side);
  211.    
  212.             isQuat=Quaternion.createFromMatrix(container.transform);    //Quaternion aus aktueller Matrix
  213.             shallQuat=quaternionPos[side]; //Soll-Position als Quaternion aus der Liste
  214.            
  215.             //Tween zwischen isQuat und shallQuat starten
  216.             tweenTime=0;
  217.             this.addEventListener(Event.ENTER_FRAME,tweenToPos);
  218.            
  219.             // ----- /new -----
  220.            
  221.            
  222.             //trace(container.rotationX, container.rotationY, container.rotationZ);
  223.            
  224.             //container.lookAt(camera, new Number3D(0,90,0));
  225.             //container.lookAt(camera);
  226.        
  227.             //side1 180 0 180
  228.             //side2 0 0 0
  229.             //side3 -180 -90 180
  230.             //side4 180 90 180
  231.             //side5 90 0 0
  232.             //side6 90 0 180
  233.            
  234.         }
  235.        
  236.        
  237.         // ----- new -----
  238.         // Rotation tweenen
  239.         private function tweenToPos(event:Event){
  240.             //time läuft von 0 bis 1;
  241.             tweenTime+=0.1;
  242.             if(tweenTime>1){
  243.                 this.removeEventListener(Event.ENTER_FRAME,tweenToPos); //Listener beenden
  244.                 container.transform=shallQuat.matrix; //Endposition zuweisen
  245.                 tweenTime=0;
  246.                 }
  247.             else{
  248.                 var tweenQuat:Quaternion=Quaternion.slerp(isQuat,shallQuat,tweenTime); //aktuelle Tween-Position
  249.                 container.transform=tweenQuat.matrix; //Rotation zuweisen
  250.                 }
  251.             }
  252.  
  253.         private function onMouseMove( event : Event ) : void { 
  254.             var currentMousePoint : Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
  255.    
  256.             var difference : Point = currentMousePoint.subtract(previousMousePoint);
  257.             var vector : Number3D = new Number3D(difference.x, difference.y, 0);
  258.    
  259.             var rotationAxis : Number3D = Number3D.cross(vector, FORWARD);
  260.             rotationAxis.normalize();
  261.    
  262.             var distance : Number = Point.distance(currentMousePoint, previousMousePoint);
  263.             var rotationMatrix : Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance*2 / (600 * Math.pow(container.scale, 5)));
  264.    
  265.             container.transform.calculateMultiply3x3(rotationMatrix, container.transform);
  266.             container.copyTransform(container);
  267.          
  268.             previousMousePoint = currentMousePoint;
  269.         }
  270.        
  271.     }
  272. }
joeydee ist offline   Mit Zitat antworten
Alt 19-08-2009, 14:38   #7 (permalink)
in and out
 
Benutzerbild von Nikolai
 
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
__________________
stay tuned, play hard, be real

Nikolai™
Nikolai ist offline   Mit Zitat antworten
Alt 15-12-2009, 13:38   #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);
//Roation tweening
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;
		}
Für einen Tipp wäre ich unendlich dankbar!
brainski ist offline   Mit Zitat antworten
Alt 15-12-2009, 14:09   #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?
joeydee ist offline   Mit Zitat antworten
Alt 18-12-2009, 08:54   #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.
brainski ist offline   Mit Zitat antworten
Alt 18-12-2009, 12:08   #11 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
Finde heraus, warum der Würfel trotz Einheitsmatrix verdreht dargestellt wird. Evtl. hast du die Kamera verdreht oder der Würfel liegt in einem Container, welcher verdreht ist.
joeydee ist offline   Mit Zitat antworten
Alt 11-01-2010, 11:20   #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!!
brainski ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
as3, cube, papervision3d

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:09 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele