Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-06-2009, 14:36   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
PV3D DisplayObject3D.container ist null

Ich fange gerade mit PV3D an und wollte nur einen Kreis zeichnen (wenn das klappt mehrere Kreise in ein Objekt die räumlich verschoben werden).
Kann mir jemand sagen, warum container null ist?
ActionScript:
  1. package {
  2.    
  3.     import org.papervision3d.objects.DisplayObject3D;
  4.     import flash.display.Shape;
  5.    
  6.     public class Circle extends DisplayObject3D {
  7.        
  8.         public function Circle() {
  9.             trace(container); // Ausgabe: null
  10.             container.addChild(circle());   
  11.         }
  12.        
  13.         private function circle():Shape {
  14.             var c : Shape = new Shape();
  15.                 c.graphics.beginFill(0xff0000, .5);
  16.                 c.graphics.drawCircle(0, 0, 50);
  17.             return c;
  18.         }
  19.     }
  20.    
  21. }
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 06-06-2009, 15:30   #2 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Weil die public var container nur deklariert wird. Aber was muß ich bei den beiden Parametern angeben...?
ActionScript:
  1. container = new ViewportLayer(Viewport3D, DisplayObject3D);
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 06-06-2009, 20:32   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Ich glaube du zäumst das Pferd falsch herum auf.
Müsstest du nicht erst den "Container" erstellen (also eine View oder Scene, oder wie sowas bei PV3D heißt) und dann dein Objekt demselben hinzufügen? Bei dem "Hinzufügen" Vorgang wird dann vermutlich in deinem Objekt die Eigenschaft "container" erst geschrieben.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 06-06-2009, 20:36   #4 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Ja... ich glaube schon. Hab ich ja auch so gemacht.
ActionScript:
  1. public function createSomeObjectsOnTheScene():void {
  2.             tSphere = new Sphere();
  3.             scene.addChild(tSphere);
  4.                
  5.             tCircle = new Circle();
  6.             scene.addChild(tCircle);
  7. }
Mit der Sphere funktioniert es, die sehe ich, Circle ist die oben gepostete Klasse.
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 06-06-2009, 20:49   #5 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Im Konstruktor kann der container ja noch nicht da sein, er wird ja vor dem addChild ausgeführt.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 06-06-2009, 20:55   #6 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
ActionScript:
  1. public class Circle extends DisplayObject3D {
  2.         public function Circle() {
  3.             trace(container); // Ausgabe: null
  4.             container.addChild(circle());   
  5.         }
Da kann der Container noch nicht da sein?

ActionScript:
  1. public class DisplayObject3D extends DisplayObjectContainer3D
  2.     {
  3.         public var container            :ViewportLayer;
In der gesamten Klasse DisplayObject3D habe ich auch keine Stelle gefunden, wo der Variable container irgendwas zugewiesen wird. Deshalb muß man das wohl selber machen. Und im Konstruktor von Circle ist container vorhanden, weil die Klasse von DisplayObject3D erbt. Deshalb muß man das wohl selber machen:
ActionScript:
  1. public class Circle extends DisplayObject3D {
  2.         public function Circle() {
  3.  
  4.             trace(container); // Ausgabe: null, ist klar
  5.  
  6. container = new ViewportLayer(Viewport3D, DisplayObject3D); // aber was genau muß man hier angeben?
  7.  
  8.             container.addChild(circle());   
  9.         }
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 06-06-2009, 21:22   #7 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Nein, ganz falsch
(behaupte ich mal, was PV3D angeht, hab ich eigentlich keine Ahnung, ich spreche nur aus AS3 Erfahrung)

Erstens kann die Variable im Konstruktor technisch gesehen keinen Wert haben. Woher sollte sie diesen bekommen? Es handelt sich um ein frisches Objekt, das einzige was vor der Stelle passiert ist, an der du das trace ausführst ist, dass der Konstruktor der super-Klasse durchgelaufen ist. Aber wie soll dieser etwas vom Container wissen? Soll er ihn erraten? addChild hast du zu diesem Zeitpunkt noch nicht aufgerufen, alles könnte also der zukünftige Container sein.

Zweitens wird der container wenn dann, im aufruf von addChild geschrieben, denn davor macht der Begriff "container" ja noch garkeinen Sinn, es gibt ja noch garkeine "Ist Teil von X" bzw. "Enhält Y" Beziehung.
Wenn du also den Code suchst, der die container-Variable schreibt, dann musst du in der addChild-Methode der Scene nachsehen.

Einfach überprüfen, ob ich mit diesen Vermutungen recht habe, kannst du, indem du einfach mal nach dem scene.addChild Aufruf (also dem in der createSomeObjectsOnTheScene Methode) tCircle.container ausgibst.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 06-06-2009, 21:47   #8 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Zitat:
Zitat von Janoscharlipp Beitrag anzeigen
was PV3D angeht, hab ich eigentlich keine Ahnung, ich spreche nur aus AS3 Erfahrung
Ok, aber dann stell doch hier bitte keine Vermutungen an, wenn Du keine Ahnung hast (von PV3D offensichtlich noch weniger als ich).
container ist eine Eigenschaft von DisplayObject3D, wie man in der PV3D Dokumentation nachlesen kann.

Und natürlich kann eine Variable einer Klasse schon im Konstruktor einen Wert haben.
ActionScript:
  1. public class Klasse {
  2.  
  3. private var nummer : int = 1;
  4.  
  5. public function Klasse(){
  6. trace(nummer); // Ausgabe: 1
  7.  

Also: Ich habe KEIN Problem mit AS3, sondern ich kenne mich mit Papervision3D (noch) nicht aus. Dieser Thread richtet sich also an Leute, die sich mit Papervison3D auskennen. Sorry.
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 06-06-2009, 21:57   #9 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Hast du es denn überprüft, so wie ich im letzten Satz vorgeschlagen habe?

EDIT: das der Container nicht bekannt sein _kann_, ist dir jetzt nicht klargeworden, oder wie?
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)

Geändert von Janoscharlipp (06-06-2009 um 21:58 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 07-06-2009, 00:11   #10 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Ja, habe ich. Aber nur um auf Nachfrage sagen zu können, daß ich es getan habe (ist auch da null, was völlig logisch ist!). Und ich habe keine Ahnung, wie Du darauf
Zitat:
Zitat von Janoscharlipp Beitrag anzeigen
Zweitens wird der container wenn dann, im aufruf von addChild geschrieben, denn davor macht der Begriff "container" ja noch garkeinen Sinn
kommst. Das macht nämlich keinen Sinn, wie Du sicher weißt, macht addChild nichts weiter, als ein Objekt der DisplayList hinzuzufügen. Sonst nichts.
Vielleicht muß ich es auch noch mal deutlich erklären (eigentlich kann man das meinen letzten Posts entnehmen):

Es geht hier nicht um irgendeinen "Container" *, sondern um eine Eigenschaft der DisplayObject3D Klasse, die container heißt. Diese Eigenschaft ist bekannt, jedoch null, weil ihr in der Klasse DisplayObject3D nichts zugewiesen wird.
Zitat:
http://www.papervision3d.org/docs/as...yObject3D.html

Property container : Sprite
Defined by DisplayObject3D

The Sprite that you draw into when rendering in a MovieScene3D.
Zitat:
Zitat von Janoscharlipp Beitrag anzeigen
das der Container nicht bekannt sein _kann_, ist dir jetzt nicht klargeworden, oder wie?
Wie gesagt, mir ist das schon alles klar, aber Dir anscheinend nicht.

Entschuldigung, aber das wird jetzt gerade etwas nervig. Wo mein Problem liegt, ist in meinem zweiten Post genau beschrieben.

* Ich pflege die Dinge beim Namen zu nennen: Ich nenne MovieClips oder Sprites, die etwas enthalten sollen, nicht "Container", sondern "MovieClip" oder "Sprite".
__________________
EDV = Ende Der Vernunft

Geändert von hmpf (07-06-2009 um 00:12 Uhr)
hmpf ist offline   Mit Zitat antworten
Alt 07-06-2009, 01:40   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
kaum zu glauben, dass ich hier nochmal antworte, aber wie gesagt, als PV3D-Unbedarfter habe auch ich die Hoffnung hier was zu lernen.

Konkret zu deiner Frage scheint mir der einfachste Weg an einen Container zu kommen der folgende zu sein:
PHP-Code:
// in der Methode der View, die deinen Circle erstellt:
circle = new Circle();
circle.container viewport.getChildLayer(circletrue); 
Auch hier ist der container nicht im Konstruktor verfügbar, technisch nicht machbar, dabei bleibe ich. (parent zum Beispiel ist ebensowenig sinnvoll zu diesem Zeitpunkt)

Dein eigentliches Problem aber (einen Kreis im Raum zeichnen, wenn ich das richtig sehe) ist damit soweit ich das sehe nicht gelöst, einfach in den container malen geht nicht.
Der nahe liegende Ansatz wäre für mich, eine Plane zu erstellen, dieser ein MovieMaterial zu geben, und eben dieses Material deinen Circle darstellen zu lassen. (Das funktioniert auch, ich vermute allerdings (hoho) das dann das gezeichnete den Umweg über eine Bitmap-Data gemacht hat).
Ein anderer Ansatz wäre, ein VectorShapeMaterial zu verwenden, in eine VectorShape3D kann man mit der Graphics3D-Klasse scheinbar einfach reinmalen.

Zu meiner Vermutung, dass container beim addChild initialisiert würde, kann ich dich nur noch auf SceneObject3D.addChild und DisplayObjectContainer3D.addChild verweisen, dort werden einige relevante Eigenschaften (parent, root, scene) geschrieben (ebenso im Flex-Framework übrigens) meine Behauptung war also nicht aus der Luft gegriffen.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 07-06-2009, 21:18   #12 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Post

ActionScript:
  1. var material : VectorShapeMaterial = new VectorShapeMaterial();   
  2. var shape : VectorShape3D = new VectorShape3D(material);
  3. shape.graphics.lineStyle(1, 0xcccccc, 1);
  4. shape.graphics.beginFill(0xcccccc, .2);
  5. shape.graphics.drawCircle(0, 0, 300);
  6. addChild(shape);
__________________
EDV = Ende Der Vernunft
hmpf 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:21 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele