Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-12-2008, 18:06   #1 (permalink)
MCQ
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 18
Papervision3D-Anfänger hat Texturing-Probleme

Ich bin kein AS 3.0 Anfänger, PV3D-Anfänger schon.
Ich habe aus Blender3D das Maskottchen "Suzanne" (wer Sie nicht kennt, Suzanne ist ein Affenkopf) als 3DS-Datei exportiert und via folgendem Quellcode in Papervision importiert:

Code:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.core.proto.MaterialObject3D;
	import org.papervision3d.materials.BitmapColorMaterial;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.MovieMaterial;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.materials.shaders.FlatShader;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.parsers.Max3DS;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
	
	public class Main extends Sprite 
	{
		
		private var renderer:BasicRenderEngine	=	new BasicRenderEngine();
		private var camera:Camera3D 			= 	new Camera3D();
		private var scene:Scene3D 				= 	new Scene3D();
		private var viewport:Viewport3D 		= 	new Viewport3D(0, 0, true, true);
		
		private var testFigur:Max3DS;
		
		public function Main():void 
		{
			super();
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			stage.frameRate = 50;
			camera.z = -2;
			

			var cm:ColorMaterial = new ColorMaterial();
			cm.fillColor = 0x00FF00;
			var ml:MaterialsList = new MaterialsList();
			ml.addMaterial(cm);
			
			testFigur = new Max3DS('Suzanne');
			testFigur.load('../3ds/Suzanne.3ds', ml, null);
			scene.addChild(testFigur);
			
			this.addChild(viewport);
			
			renderer.renderScene(scene, camera, viewport);
			
			this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onEnterFrame(e:Event):void
		{
			if (!testFigur) return;
			testFigur.rotationY++;
			renderer.renderScene(scene, camera, viewport);
		}
		
	}
	
}
Suzanne wird angezeigt, aber nur als Drahtgittermodell. Ich würde Suzanne nun gern Texturen oder zumindest eine Farbe zuweisen und damit die Polygone füllen. Das habe ich bisher leider nicht geschafft. Ich hoffe Ihr könnt mir helfen.

Gruß und Dank
MCQ



// Edit:

Hat sich erledigt, ich habe Suzanne in Blender ein Material zugewiesen, nun geht es.

Geändert von MCQ (08-12-2008 um 18:16 Uhr)
MCQ ist offline   Mit Zitat antworten
Alt 12-12-2008, 09:42   #2 (permalink)
ich versuchs ja
 
Benutzerbild von netterkerl1981
 
Registriert seit: Sep 2007
Ort: Kassel
Beiträge: 281
Ich greif das Thema jetzt einfach mal auf...

Laut dem vorherigem Post kann man mit Papervision3D *.3DS Dateien direkt einlesen und verarbeiten? Ist das richtig?

Und die texturen aus der 3DS Datei werden auch mit eingebunden und benutzt?

Danke für die kleine Info...
__________________
Zitat:
Eigentlich bin ich ganz anders. Ich komm nur viel zu selten dazu.
Udo Lindenberg und Jan Delay
netterkerl1981 ist offline   Mit Zitat antworten
Alt 12-12-2008, 13:05   #3 (permalink)
asFlasher
 
Benutzerbild von ksw24
 
Registriert seit: Jul 2006
Beiträge: 1.136
Hallo,
ja das stimmt so. Mit DAE Dateien habe ich es selbst schon gemacht, aber mir 3DS wird es das selbe sein.

Gruß ksw24

Geändert von ksw24 (12-12-2008 um 13:06 Uhr)
ksw24 ist offline   Mit Zitat antworten
Alt 12-12-2008, 13:17   #4 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 152
Max3DS Import:

http://drawlogic.com/2008/04/11/3ds-...n-from-away3d/

Texturen kannst auch einbinden.

Was mich jetzt nur interessieren würde:
Beim Import in papervision wird keine meiner Textureinstellungen übernommen. (Shader etc.) Auf was muss ich da achten? Muss ich die Texturen nachträglich in papervision "einshaden"?
Wie hat das mit collada-files funktioniert?

Geändert von grizu (12-12-2008 um 13:20 Uhr)
grizu ist offline   Mit Zitat antworten
Alt 12-12-2008, 13:37   #5 (permalink)
asFlasher
 
Benutzerbild von ksw24
 
Registriert seit: Jul 2006
Beiträge: 1.136
Hallo,
vor genau dem selben Problem stehe ich auch gerade
Habe ein Model (collada) in PV3D geladaden, welches transparente Flächen hat. Doch werden diese nicht angezeigt, also keine transparenz, nur die Grundfarbe.

Ich weiß noch nicht wie man das ändern kann.

1) irgendwie die einzelnen Flächen der collada ansprechen, nur wie
2) externe texturen nutzen, sieht dann aber nicht mehr so schön aus (mapping)
2) weitere lösungen suchen/finden

Denn ich würde auch gern, die Farbe der Fläche zur Laufzeit in Flash per AS ändern, doch habe ich auch dafür noch keinen Weg gefunden, da ich 1) noch nicht Lösen konnte.

Falls hier jemand bescheid weiß, bin ich über jeden Hinweis froh

Gruß ksw24
ksw24 ist offline   Mit Zitat antworten
Alt 12-12-2008, 13:47   #6 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 152
Du kannst über
DisplayObject3D.setChildMaterial()
oder
DisplayObject3D.setchildMaterialByName()
die einzelnen DisplayObjects direkt ansprechen und mats zuweisen.
(Also die Unterobjekte deiner Collada).
grizu ist offline   Mit Zitat antworten
Alt 12-12-2008, 16:34   #7 (permalink)
asFlasher
 
Benutzerbild von ksw24
 
Registriert seit: Jul 2006
Beiträge: 1.136
Hey...
...super Danke.

Ich gestehe nicht genau zu wissen wie ich das nun anzuwenden habe. Als Beispiel:
ActionScript:
  1. dae = new DAE();
  2. dae.load("collada.dae");
  3. holder = new DisplayObject3D();
  4. holder.addChild(dae);
Wie genau kann ich einen Teil der Collada ansprechen?

Besten Dank auf jeden Fall...ksw24
ksw24 ist offline   Mit Zitat antworten
Alt 12-12-2008, 16:48   #8 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 152
sry ich kann dir nur sagen wies mit Max3DS geht

Wenn du das file importierst, zeigt er dir alle Unterobjekte des 3DS-Files mit Namen im Ausgabefenster an.
Die kannst du dann ansprechen und das material setzen:

ActionScript:
  1. var m:Max3DS = new Max3DS()
  2. ...
  3.  
  4. var d:DisplayObject3D = m.getChildByName("kugel");
  5. d.setChildMaterial(d, new PhongMaterial (pointLight, 0x000000, 0x266A48, 10));
  6.  
  7. //oder:
  8. d.material = new PhongMaterial (pointLight, 0x000000, 0x266A48, 10);

ich habs nur auf diese Weise geschafft. Warum ich nicht direkt beim Laden ein Material zuweisen kann, ist mir ein Rätsel...

edit: ok, bin grad selber auf was draufgekommen... klar dass ich erst die einzelnen unterobjekte ansprechen muss, weil das 3dsfile ja nur ein container ist...

Geändert von grizu (12-12-2008 um 16:51 Uhr)
grizu ist offline   Mit Zitat antworten
Alt 06-02-2009, 15:57   #9 (permalink)
ich versuchs ja
 
Benutzerbild von netterkerl1981
 
Registriert seit: Sep 2007
Ort: Kassel
Beiträge: 281
Question

Hi grizu,

Hab mal eine Frag zu deinem Script.
Zitat:
PHP-Code:
var d:DisplayObject3D m.getChildByName("kugel"); 
ist "kugel" eine unterbauart von deinem max3DS-objekt?
Oder anders gefragt:

wenn ich eine 3dS Datei einlade und das ganze kompiliere, dann werden die einzelnen teile automatisch getraced.
Wie kann ich auf die einzelnen Teile zugreifen? Kann ich das überhaupt? Wird dein "kugel" dort auch genannt?

Ich möchte das Objekt gern haben, um ihm ein anderes Material zu verpassen.

Ich hab schonmal das hier (auszug):

PHP-Code:
...
var 
my_object = new Max3DS();
    
my_object.load('3dsdatei.3DS',testmatlist);
    
trace("test: " my_object.materialsList() );
    
//trace("my_object: " + my_object.getChildByName("OberteilMi"));
    //dieser trace gibt mir "null" zurück

    
my_object.scale 50;
    
my_object.0;
    
default_scene.addChild(my_object);
... 
Danke

mfg
Netterkerl1981
__________________
Zitat:
Eigentlich bin ich ganz anders. Ich komm nur viel zu selten dazu.
Udo Lindenberg und Jan Delay
netterkerl1981 ist offline   Mit Zitat antworten
Alt 06-02-2009, 17:54   #10 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 152
Genau, wenn du mit max3ds lädst, tracet er dir alle child-Objekte aus. Und mit den Namen, die du in deinem 3d-Programm vergibst, kannst du die child-Objekte ansprechen und Materialien vergeben.

Also die Max3DS-Instanz ist nix anderes als ein Container für deine Szene, in der du mit "getChildByName" auf deine Szene-Objekte zugreifen kannst.

Dein trace sollt eigentlich gehen, wenn du ein Objekt hast, das "OberteilMi" heisst. Ist das vielleicht noch ein Unterobjekt von irgendwas anderem? Hab jetzt selber länger nix mehr mit dem max-import gemacht...

lg
grisu
grizu ist offline   Mit Zitat antworten
Alt 07-02-2009, 08:57   #11 (permalink)
ich versuchs ja
 
Benutzerbild von netterkerl1981
 
Registriert seit: Sep 2007
Ort: Kassel
Beiträge: 281
Hey danke für die schnelle Antwort!!

Dann muss ich mal untersuchen, ob das evtl. ein Unterobjekt ist.

Der Trace von PPV3D ist in etwa soetwas:
PHP-Code:
INFODisplayObject3DPunktlicht
INFO
DisplayObject3DPunktlich0
INFO
DisplayObject3DPunktlich1
INFO
DisplayObject3DMittelteil
INFO
DisplayObject3DRohr05
INFO
DisplayObject3DUnterteilM
INFO
DisplayObject3DOberteilMi 
Daher hab ichs einfach mal mit "OberteilMi" versucht...

Ich habe es auch schonmal mit "childrenList()" versucht...
Der Befehl sollte doch eigentlich alle Namen ausgeben, die als Objekt vorhanden sind...

Dabei gibt er mir leider auch nur "" aus.

Irgendwas muss ich falsch machen...

Hast du evtl noch eine Idee?

Edit:
Oder versuche ich zu früh auf diese Objekte zuzugreifen...
Mein Trace kommt ja vor dem standart-trace...
Ich forsche mal in die Richtung...
__________________
Zitat:
Eigentlich bin ich ganz anders. Ich komm nur viel zu selten dazu.
Udo Lindenberg und Jan Delay

Geändert von netterkerl1981 (07-02-2009 um 08:59 Uhr) Grund: noch ein Einfall (nach dem Duschen ;-))
netterkerl1981 ist offline   Mit Zitat antworten
Alt 07-02-2009, 11:06   #12 (permalink)
ich versuchs ja
 
Benutzerbild von netterkerl1981
 
Registriert seit: Sep 2007
Ort: Kassel
Beiträge: 281
Lightbulb Lösung!!!

Hi grizu!! (und @all)

Ich hab die Lösung gefunden. Das Objekt war zu dem Zeitpunkt noch gerendert.

Ich habs jetzt mit einem Timeout gelöst.
Jetzt wird das Objekt zwar erst gerendert und dann umgefärbt, aber das ist verkraftbar...

Gibt es dazu auch ein Event, dass ich benutzen kann? (Aber ich suche erstmal selber)


Hier meine bisherige Lösung:
PHP-Code:
...
            
my_object = new Max3DS();
            
my_object.load('3dsdatei.3DS',testmatlist);
            
my_object.scale 50;
            
my_object.0;
            
default_scene.addChild(my_object);
            
setTimeout(recolor1000);
            }
        
        private function 
recolor():void {
            
trace(my_object.childrenList());
            var 
oberteil:DisplayObject3D my_object.getChildByName("OberteilMi"true);
            
oberteil.material mat_red;
        } 
Wenn jemand ein Event weiß, welches dann gefeuert wird, darf er es gern hier einstellen... ;-)

Ansonsten schonmal DANKE!!!

mfg
Netterkerl1981
__________________
Zitat:
Eigentlich bin ich ganz anders. Ich komm nur viel zu selten dazu.
Udo Lindenberg und Jan Delay
netterkerl1981 ist offline   Mit Zitat antworten
Alt 07-02-2009, 11:14   #13 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 152
ActionScript:
  1. max3ds.addEventListener (FileLoadEvent.LOAD_COMPLETE, onLoadComplete);
  2.  
  3.     function onLoadComplete (e:FileLoadEvent) :void
  4.     {
  5.         ...
  6.     }

lg
grisu
grizu 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:57 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele