Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-04-2009, 09:25   #1 (permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.649
[PV3D] 2D Koordinaten eines 3D Punktes

Hey,

komme gerade nicht wirklich auf einen gruenen Zweig.
Ich brauche den Projektions Punkt einens 3D-Punktes auf meinem Viewport,
ich kann das ja so machen:

PHP-Code:
var DisplayObject3D transformObject;
o.vertex.x;
o.vertex.y;
o.vertex.z;
o.calculateScreenCoords(camera);
return 
o.screen.clone(); 
Aber das funktioniert halt nur wenn das Objekt gerendert wird,
ich bin einfach nur auf der Suche nach ner Funktion wo ich die Kamera und meinen 3DPunkt reinschmeisse und ich den 2D Projektionspunkt bekomme.

Aber Papervision scheint das nicht implementiert zu haben.

Gruss b.asile
__________________
[ WHEN THE GOING GETS WEIRD THE WEIRD TURN PRO ]

devboy.org
b.asile ist offline   Mit Zitat antworten
Alt 22-04-2009, 09:34   #2 (permalink)
hmmm
 
Registriert seit: Dec 2003
Beiträge: 224
Hast du mal probiert den Punkt auch in eine Szene zu packen? Die muss ja nicht unbedingt gerendert werden, aber vielleicht ist das noch die Vorraussetzung.
astrocreep ist offline   Mit Zitat antworten
Alt 22-04-2009, 09:47   #3 (permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.649
Ja der ist in der Scene,
aber das will ich vermeiden, da es nicht noetig ist.
Ausserdem muss ich dann fuer jeden Punkt den ich berechenen will ein Objekt in der Szene haben. Aber da ich zwischen den Renders nicht weiss wieviele Punkte ich habe ist das auch ein Problem.

Daher suche ich nach einem rein mathematischen Loesungsweg.

Doch der Code hier http://osflash.org/pipermail/papervi...st/010225.html gibt mir auch nur falsche Werte aus.
__________________
[ WHEN THE GOING GETS WEIRD THE WEIRD TURN PRO ]

devboy.org
b.asile ist offline   Mit Zitat antworten
Alt 22-04-2009, 11:42   #4 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
Wie du erkannt hast, werden erst beim Rendern bestimmte Werte berechnet, die für die Screenkoordinaten wichtig sind. In diesem Fall wird unbedingt camera.eye und object.view (beides vom Typ Matrix3D) benötigt. Deren Berechnung kann man auch ohne Render-Aufruf "erzwingen":

ActionScript:
  1. var object=new DisplayObject3D();//ein Dummy-Objekt erzeugen
  2. camera.transformView();//zuerst muss die Matrix für die Kamerasicht aktualisiert werden (camera.eye wird gesetzt)
  3. object.x=10;//dann werden die Weltkoordinaten für einen Punkt gesetzt
  4. object.y=5;
  5. object.z=3;
  6. object.view.calculateMultiply4x4(camera.eye, object.transform );//anschließend wird daraus die view-Matrix des Objekts berechnet
  7. object.calculateScreenCoords(camera);//nun kann man die Screen-Koordinaten berechnen ohne vorher zu rendern
  8.  

Damit brauchst du nicht mehr je Punkt ein eigenes Objekt, sondern kannst dasselbe Objekt in einer Schleife immer neu positionieren und die Screen-Werte berechnen lassen (Zeile 3-7).


Es geht sogar ohne den Overhead von DisplayObject3D, allerdings ohne Gewähr, da hier bestimmte Einstellungen einfach ignoriert werden. Für Standard-Szenen sollten jedoch dieselben Werte rauskommen wie oben bzw. wie mit Render-Aufruf:

ActionScript:
  1. camera.transformView();
  2. var pos=new Number3D(10,5,3);//der Punkt im Raum
  3. trace(calculateScreenCoords(camera,pos));
  4.  
  5. function calculateScreenCoords(camera,pos):Number3D
  6.         {
  7.         Matrix3D.multiplyVector(camera.eye,pos);
  8.         var persp:Number = (camera.focus * camera.zoom) / (camera.focus + pos.z);
  9.         return new Number3D(pos.x * persp, pos.y * persp, pos.z);
  10.         }
joeydee ist offline   Mit Zitat antworten
Alt 22-04-2009, 16:11   #5 (permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.649
Danke, funktioniert soweit.
Jetzt muss ich aber noch den transform von dem parent DisplayObject mit reinbekommen.

Mit multiply liege ich da glaub ich falsch:

PHP-Code:
public static function projectVertexDisplayObject3D,vertex Vertex3Dcamera CameraObject3D) : Number3D
        
{
            var 
DisplayObject3D t;
            
camera.transformView();
            
o.vertex.x;
            
o.vertex.y;
            
o.vertex.z;
            
o.updateTransform();
            
o.transform.calculateMultiplyo.transform, (t.parent as DisplayObject3D).transform );
            
o.view.calculateMultiply4x4camera.eyeo.view );
            
o.calculateScreenCoordscamera );
            return 
o.screen.clone();
        } 
__________________
[ WHEN THE GOING GETS WEIRD THE WEIRD TURN PRO ]

devboy.org
b.asile ist offline   Mit Zitat antworten
Alt 22-04-2009, 17:03   #6 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
in der DisplayObject3D-Klasse (function project) wird dies hier multipliziert (Reihenfolge spielt eine Rolle):
this.world.calculateMultiply( parent.world, this.transform );

vielleicht reicht dir der Hinweis ja schon, ich kanns jetzt nicht durchprobieren.
joeydee ist offline   Mit Zitat antworten
Alt 27-04-2009, 14:27   #7 (permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.649
Perfekt.

PHP-Code:
public static function projectVertexDisplayObject3D,vertex Vertex3Dcamera CameraObject3D) : Number3D
        
{
            var 
DisplayObject3D t;
            
camera.transformView();
            
o.vertex.x;
            
o.vertex.y;
            
o.vertex.z;
            
o.view.calculateMultiply4x4camera.eyeo.view );
            
o.world.calculateMultiply( ( o.parent as DisplayObject3D).worldo.transform );
            
o.view.calculateMultiply4x4( ( o.parent as DisplayObject3D).viewo.transform );
            
o.updateTransform();
            
o.calculateScreenCoordscamera );
            return 
o.screen.clone();
        } 
So klappts nun.
__________________
[ WHEN THE GOING GETS WEIRD THE WEIRD TURN PRO ]

devboy.org
b.asile 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 13:15 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele