Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-11-2008, 13:16   #1 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Question local3DToGlobal und PerspectiveProjection

Verstehe ich da etwas grundsätzlich falsch, oder projiziert local3DToGlobal nicht in Abhängigkeit zu den in DiplayObject.transform vorliegenden Infos zur Perspektive?

Irgendwie kommen hier nur Müllwerte bei raus:

ActionScript:
  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.geom.*;
  5.    
  6.     [SWF(width = "900", height = "900", backgroundColor = "#000000", framerate = "60")]
  7.    
  8.     public class PerspTest extends Sprite
  9.     {
  10.         public function PerspTest():void
  11.         {
  12.             var spr:Sprite = new Sprite();
  13.             var inner:Sprite = new Sprite();
  14.            
  15.             with (spr.graphics)
  16.             {
  17.                 lineStyle(0, 0x00, 0);
  18.                 beginFill(0xFF00000);
  19.                 drawRect(-100, -50, 200, 100);
  20.                 endFill();
  21.             }
  22.            
  23.             spr.x = stage.stageWidth / 2;
  24.             spr.y = stage.stageHeight / 2;
  25.             spr.rotationX = -10;
  26.            
  27.             inner.x = spr.width / 2;
  28.             inner.y = -spr.height / 2;
  29.            
  30.             with (inner.graphics)
  31.             {
  32.                 lineStyle(0, 0x00, 0);
  33.                 beginFill(0xFFFF00);
  34.                 drawCircle(0, 0, 3);
  35.                 endFill();
  36.             }
  37.            
  38.             addChild(spr);
  39.             spr.addChild(inner);
  40.            
  41.             var pp:PerspectiveProjection = new PerspectiveProjection();
  42.             pp.fieldOfView = 120;
  43.             pp.projectionCenter = new Point(0, 0);
  44.             pp.focalLength = 300;
  45.            
  46.             spr.transform.perspectiveProjection = pp;
  47.            
  48.             var pt:Point = inner.local3DToGlobal(new Vector3D(inner.x, inner.y, inner.z));
  49.            
  50.             trace(pt);
  51.         }
  52.     }
  53. }
__________________
mfg.
edding950 ist offline   Mit Zitat antworten
Alt 27-11-2008, 16:21   #2 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Scheint irgendwie nur zu klappen, wenn PerspectiveProjection im DisplayObject unangetastet bleibt, man es also bei den Defaultwerten belässt - das kann es doch nicht sein, oder?

Ich kotz gleich.
__________________
mfg.
edding950 ist offline   Mit Zitat antworten
Alt 27-11-2008, 18:19   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Musst du vielleicht das transform nochmal neu schreiben?
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 27-11-2008, 18:39   #4 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Nee, irgendwie macht das keinen Unterschied..Was mich echt aufregt ist der Umstand, dass es ohne PerspectiveProjection funktioniert:

ActionScript:
  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.events.Event;
  5.     import flash.geom.*;
  6.    
  7.     [SWF(width = "900", height = "900", backgroundColor = "#000000", framerate = "60")]
  8.    
  9.     public class PerspTest extends Sprite
  10.     {
  11.         public function PerspTest():void
  12.         {
  13.             var spr:Sprite = new Sprite();
  14.             var inner:Sprite = new Sprite();
  15.            
  16.             with (spr.graphics)
  17.             {
  18.                 lineStyle(0, 0x00, 0);
  19.                 beginFill(0xFF00000);
  20.                 drawRect(-100, -50, 200, 100);
  21.                 endFill();
  22.             }
  23.            
  24.             spr.x = stage.stageWidth / 2;
  25.             spr.y = stage.stageHeight / 2;
  26.            
  27.            
  28.             inner.x = spr.width / 2;
  29.             inner.y = -spr.height / 2;
  30.            
  31.             with (inner.graphics)
  32.             {
  33.                 lineStyle(0, 0x00, 0);
  34.                 beginFill(0xFFFF00);
  35.                 drawCircle(0, 0, 3);
  36.                 endFill();
  37.             }
  38.            
  39.             addChild(spr);
  40.             spr.addChild(inner);
  41.            
  42.            
  43.             var transf:Transform = new Transform(spr);
  44.             /*transf.perspectiveProjection = new PerspectiveProjection();
  45.             transf.perspectiveProjection.fieldOfView = 120;
  46.             transf.perspectiveProjection.projectionCenter = new Point(0,0);
  47.             transf.perspectiveProjection.focalLength = 300;*/
  48.             transf.matrix3D = new Matrix3D();
  49.             transf.matrix3D.appendTranslation(100,100,0);
  50.             transf.matrix3D.appendRotation(45, Vector3D.Y_AXIS);
  51.             transf.matrix3D.appendTranslation(100,100,0);
  52.            
  53.             // Marker auf die globale 2D-Position von spr.inner setzen
  54.            
  55.             var pt:Point =  spr.local3DToGlobal(new Vector3D(inner.x, inner.y, inner.z));
  56.            
  57.             var mrk:Sprite = new Sprite();
  58.            
  59.             with (mrk.graphics)
  60.             {
  61.                 lineStyle(0, 0x00, 0);
  62.                 beginFill(0x0000ff);
  63.                 drawCircle(0, 0, 2);
  64.                 endFill();
  65.             }
  66.            
  67.             mrk.x = pt.x;
  68.             mrk.y = pt.y;
  69.            
  70.             addChild(mrk);
  71.            
  72.         }
  73.     }
  74. }

...aber mit PerspectiveProjection der Marker immer falsch positioniert ist:

ActionScript:
  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.events.Event;
  5.     import flash.geom.*;
  6.    
  7.     [SWF(width = "900", height = "900", backgroundColor = "#000000", framerate = "60")]
  8.    
  9.     public class PerspTest extends Sprite
  10.     {
  11.         public function PerspTest():void
  12.         {
  13.             var spr:Sprite = new Sprite();
  14.             var inner:Sprite = new Sprite();
  15.            
  16.             with (spr.graphics)
  17.             {
  18.                 lineStyle(0, 0x00, 0);
  19.                 beginFill(0xFF00000);
  20.                 drawRect(-100, -50, 200, 100);
  21.                 endFill();
  22.             }
  23.            
  24.             spr.x = stage.stageWidth / 2;
  25.             spr.y = stage.stageHeight / 2;
  26.            
  27.            
  28.             inner.x = spr.width / 2;
  29.             inner.y = -spr.height / 2;
  30.            
  31.             with (inner.graphics)
  32.             {
  33.                 lineStyle(0, 0x00, 0);
  34.                 beginFill(0xFFFF00);
  35.                 drawCircle(0, 0, 3);
  36.                 endFill();
  37.             }
  38.            
  39.             addChild(spr);
  40.             spr.addChild(inner);
  41.            
  42.            
  43.             var transf:Transform = new Transform(spr);
  44.             transf.perspectiveProjection = new PerspectiveProjection();
  45.             transf.perspectiveProjection.fieldOfView = 120;
  46.             transf.perspectiveProjection.projectionCenter = new Point(0,0);
  47.             transf.perspectiveProjection.focalLength = 300;
  48.             transf.matrix3D = new Matrix3D();
  49.             transf.matrix3D.appendTranslation(100,100,0);
  50.             transf.matrix3D.appendRotation(45, Vector3D.Y_AXIS);
  51.             transf.matrix3D.appendTranslation(100,100,0);
  52.            
  53.             // Marker auf die globale 2D-Position von spr.inner setzen
  54.            
  55.             var pt:Point =  spr.local3DToGlobal(new Vector3D(inner.x, inner.y, inner.z));
  56.            
  57.             var mrk:Sprite = new Sprite();
  58.            
  59.             with (mrk.graphics)
  60.             {
  61.                 lineStyle(0, 0x00, 0);
  62.                 beginFill(0x0000ff);
  63.                 drawCircle(0, 0, 2);
  64.                 endFill();
  65.             }
  66.            
  67.             mrk.x = pt.x;
  68.             mrk.y = pt.y;
  69.            
  70.             addChild(mrk);
  71.            
  72.         }
  73.     }
  74. }
__________________
mfg.
edding950 ist offline   Mit Zitat antworten
Alt 27-11-2008, 19:27   #5 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
In meiner Doku steht, die focalLength sei read-only??
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 27-11-2008, 19:39   #6 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Die Doku taugt nichts

Nee, also ich kann focalLength schön ändern und der resultierende Effekt, was die perspektivische Ansicht angeht, kommt jeweils auch ganz gut hin.

Ich krieg es aber kein bißchen auf die Kette, die Koordinaten eines Sprites innerhalb eines 3D-transformierten Sprites zu 'globalisieren', wenn PerspectiveProjection auch nur instanziert wurde...Es ist noch nichtmal nötig, Werte zu vergeben - nur instanzieren reicht schon, damit local3DToGlobal nicht mehr funzt.

__________________
mfg.
edding950 ist offline   Mit Zitat antworten
Alt 27-11-2008, 20:38   #7 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Was ich im übrigen auch nicht raffe:

ActionScript:
  1. var pp:PerspectiveProjection = new PerspectiveProjection();
  2.      pp.fieldOfView = 120;
  3.      pp.projectionCenter = new Point(450, 450);
  4.      pp.focalLength = 1000;
  5.  
  6.      var v3:Vector.<Vector3D> = pp.toMatrix3D().decompose();
  7.      var v4:Vector.<Vector3D> = new Matrix3D().decompose();
  8.  
  9.     trace(v3);
  10.     trace(v4);

...wenn man sich das mal so anschaut, fällt einem auf, dass die Matrizen, abgesehen vom Scale-Vector absolut identisch sind. Da frag ich mich doch, was PerspectiveProjection eigentlich macht?!? Oder wo der eigentliche Wirkungsbereich von PerspectiveProjection ist. Ich bin doch einigermaßen ratlos, wo ich ansetzen soll, um ein local3DToGlobal mit perspektivischer Projektion hinzukriegen..

AS3 sucks again.
__________________
mfg.
edding950 ist offline   Mit Zitat antworten
Alt 28-11-2008, 20:03   #8 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Der Groschen ist gefallen.

To whom it may concerns: Selbstverständlich sollte das jeweils übergeordnete DisplayObject die Werte für die PerspectiveProjection bekommen. Die Projektion des gewünschten Punkts im 3D-Raum erfolgt dann schematisch über:

childObject.local3DToGlobal(new Vector3D(x, y, z));

..wobei x, y und z keine Werte sein sollten, die sich in Abhängigkeit von einer Transformation auch schonmal ändern könnten, wie z.B. die Breite eines DisplayObjects innerhalb des 3D-Raums, von dem aus man zu projizieren versucht.


Hier mal ein funktionierendes Beispiel..Der blaue Kreis markiert dabei die globale 2D-Position der rechten oberen Ecke des roten Rechtecks.

ActionScript:
  1. package 
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.geom.PerspectiveProjection;
  5.     import flash.events.Event;
  6.     import flash.geom.*;
  7.    
  8.     [SWF(width = "900", height = "900", backgroundColor = "#FFFFFF", frameRate = "100")]
  9.    
  10.     public class Test006 extends Sprite
  11.     {
  12.         public var container:Sprite;
  13.         public var spr:Sprite;
  14.         public var mrk:Sprite;
  15.        
  16.         public function Test006()
  17.         {
  18.            
  19.             var pp:PerspectiveProjection = new PerspectiveProjection();
  20.             pp.focalLength = 70;
  21.             pp.projectionCenter = new Point(0, -10);
  22.            
  23.             container = new Sprite();
  24.             spr = new Sprite();
  25.             mrk = new Sprite();
  26.            
  27.            
  28.             addChild(container);
  29.             container.addChild(spr);
  30.             addChild(mrk);
  31.            
  32.             spr.graphics.lineStyle(0, 0x00, 0);
  33.             spr.graphics.beginFill(0xFF00000);
  34.             spr.graphics.drawRect(-100, -50, 200, 100);
  35.             spr.graphics.endFill();
  36.            
  37.             container.transform.perspectiveProjection = pp;
  38.             container.x = 450;
  39.             container.y = 450;
  40.            
  41.            
  42.             mrk.graphics.lineStyle(0, 0x00, 0);
  43.             mrk.graphics.lineStyle(0, 0x00, 0);
  44.             mrk.graphics.beginFill(0x0000ff);
  45.             mrk.graphics.drawCircle(0, 0, 5);
  46.             mrk.graphics.endFill();
  47.            
  48.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  49.            
  50.         }
  51.         public function onEnterFrame(event:Event):void
  52.         {
  53.             spr.rotationY++;
  54.             spr.rotationX+=1.9;
  55.            
  56.             var pt:Point = spr.local3DToGlobal(new Vector3D(100, -50, 0));
  57.            
  58.             mrk.x = pt.x
  59.             mrk.y = pt.y
  60.         }
  61.        
  62.     }
  63.    
  64. }

Achso: focalLength und fieldOfView können gleichermaßen gelesen und geschrieben werden, wobei es durch die Interdependanz der beiden Eigenschaften immer nur Sinn macht, jeweils eine zu ändern. Ihr könnt ja mal verschiedene Werte setzen und Euch den jeweils anderen austracen lassen.

So long...
__________________
mfg.
edding950 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
local3dtoglobal, perspectiveprojection

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 11:56 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele