Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-09-2009, 09:25   #1 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
3D Problem

Gelöst,Gelöst,Gelöst,Gelöst,Gelöst,Gelöst




Hi@all,

ich steige jetzt endlich auf AS3 um. Problem: Viele Funktionen müssen anders gelöst werden. Derzeit nage ich an folgendem Problem. Ich will ein 3D-Karussel für Bilder erstellen. Aber die dummen Kinder wollen nicht begreifen, dass sie weiter hinten auf der Z-Achse von den im Vordergrund spielenden Kindern verdeckt werden müssten. Wie löst man das?

Ich dachte an zwei Container (vorn und hinten), in die ich die Kleinen wechsele, sobald sie in den HG wechseln. Das funktionierte aber nicht. Hier mal der Code, den ich mit irgendwo besorgt habe und anpassen wollte. Ich habe letztendlich nur ein richtig geiles Beispiel für eine sphärische Bildergalerie gefunden (mit Code), wo das funktionierte. Da wird was mit einer 3D-Matrix gemacht. Das Ding scheint mir aber zu aufwendig für meine Zwecke. Vielleicht gibt es ja eine einfache Lösung.

Hier also mein Code:

Code:
var numOfObj:uint=10;
var radius:Point;
var center:Point;
var speed:Number=0.01;



var karusell:MovieClip = new MovieClip();
addChild(karusell);

function Carousel() {

	radius=new Point(300,60);
	center=new Point(stage.stageWidth/2,stage.stageHeight/2);
	for (var i:int=0; i<numOfObj; i++) {
		var t:buttonb=new buttonb();
		t.angle=(i*((Math.PI*2)/numOfObj));
		t.addEventListener(Event.ENTER_FRAME,onEnter);
		karusell.addChild(t);

	}
}

function onEnter(evt:Event):void {
	var obj:buttonb=buttonb(evt.currentTarget);
	obj.x=Math.cos(obj.angle)*radius.x+center.x;
	obj.y=Math.sin(obj.angle)*radius.y+center.y;
	var scale:Number=obj.y /(center.y+radius.y);
	obj.scaleX=obj.scaleY=scale;
	obj.angle=(obj.angle+speed);
	var depth:Number=karusell.getChildIndex(obj);

/*	
moveFront(obj);
moveBack(obj);
*/

}


Carousel();
thx

Geändert von Schwaermer (11-09-2009 um 15:28 Uhr) Grund: Gelöst
Schwaermer ist offline   Mit Zitat antworten
Alt 11-09-2009, 09:33   #2 (permalink)
Nix Wisser
 
Benutzerbild von nullidee
 
Registriert seit: May 2003
Ort: Würzburg, Kleinstadt
Beiträge: 3.510
gibts in AS3 swapDepths nicht mehr?

geh doch mal bei gotoandlearn.com gucken da gibts genügend carousels
__________________
nullidee

Abakus GT 10² Kugeln - 80"Leinwand - CARAN D´ACHE SUPRACOLOR®
nullidee ist offline   Mit Zitat antworten
Alt 11-09-2009, 10:02   #3 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
Nein, swapDepths gibs nicht mehr. Man kann zwar die Kinderchen im Index tauschen lassen. Das bringt aber bei einer Rotation nix. Da wird dann natürlich auch und eigentlich nur die Anzeigereihenfolge geändert.

siehe getChildIndex(obj)...

Die Seite gotoandlearn.com kenne ich natürlich. Da habe ich mich auch schon umgesehen - jedoch kein funktionierendes Beispiel gefunden.
Schwaermer ist offline   Mit Zitat antworten
Alt 11-09-2009, 10:03   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 50
Hi,
es gibt da ne schöne zSort Class, ich weiss leider nur grad nicht von wem die ist.

kannst aber auch ne einfache function nehmen
dann musste aber die buttonb vorher in ein array packen (hier allItems), das wird dann nach der skalierung sortiert.

So hatte ich das gemacht, gibt aber sich noch nen haufen anderer lösungen.

PHP-Code:
private function sortZ():void
{
    
this.allItems.sortOn("scaleX", Array.DESCENDING | Array.NUMERIC);
            
   for(var 
i:uint 0karusell.numChildreni++)
   {
    var 
item:buttonb this.allItems[i];
    
karusell.setChildIndex(itemthis.karusell.numChildren-(i+1));
   }

die rufst du dann einfach im enterFrame mit auf
browerman ist offline   Mit Zitat antworten
Alt 11-09-2009, 10:34   #5 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
Die zSorter-Klasse ist von theFlashBlog gibts hier: The Flash Blog Flash Player 10 Z-Sorting Class

Ich habe aber in dunkler erinnerung das die Klasse nach einem Update nicht mehr funktionierte weil irgendwas im player sang und klanglos weggefallen ist, aber das sollte nicht das Problem sein, ich hatte es selber mal in der Klasse geändert. Wenns probleme gibt meldeste dich einfach nochmal
Plopsi ist offline   Mit Zitat antworten
Alt 11-09-2009, 13:46   #6 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
Also ertmal vielen Dank, dass ihr euch so hilfreich zeigt.

@browerman: Ich rufe das auf und bekomme Folgendes: TypeError: Error #1010: Ein Begriff ist nicht definiert und hat keine Eigenschaften.

@Plopsi: Das Beispiel ist genial. Allerdings fehlt mir dazu einfach die .fla

Ich habe mir die Klasse besorgt, aber beim Kompilieren meckert er nach der fehlenden übergeordneten Klasse, die ich nicht auch noch erst runterladen will.

@all:Gibt es denn nicht ein kostenloses Beispiel per .fla? Ich habe es jetzt mit Papervision versucht und ein Beispiel gefunden, das vielversprechend ist. Ich poste mal den Code.

Code:
var urlx:URLRequest=new URLRequest(wbilder);

var xmlloader:URLLoader = new URLLoader();
xmlloader.addEventListener(Event.COMPLETE, parseXML);
xmlloader.load(urlx);

function parseXML(evt:Event) {
	var xml:XML=XML(xmlloader.data);
	xml.ignoreWhite=true;

	for (var i:uint=1; i<=xml.pfad.length(); i++) {
		var bam:BitmapAssetMaterial=new BitmapAssetMaterial(????);
		bam.oneSide=false;
		bam.smooth=true;
		var p:Plane=new Plane(bam,162,230,2,2);
		p.x=Math.cos(i*anglePer)*radius;
		p.z=Math.sin(i*anglePer)*radius;
		p.rotationY = (-i*anglePer) * (180/Math.PI) + 270;
		scene.addChild(p);
		p.container.filters=[dsf];
	}

}

Hier ist das Problem, dass die Bilder in der Bibliothek waren und für AS exportiert sind. Ich will aber dynamisch laden.
In der Variable "xml.pfad[i]" befinden sich die jeweiligen Pfadangaben zu den Bildern. Wie bekomme ich die nun an die Stelle mit den Fragezeichen? Kann ich die Bilder in das Flash laden und dann zu "new BitmapAssetMaterial(????);" machen?

THX

Geändert von Schwaermer (11-09-2009 um 14:01 Uhr)
Schwaermer ist offline   Mit Zitat antworten
Alt 11-09-2009, 14:05   #7 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 50
zu meinem Bsp. von oben.

hast du dir ein array names "allItems" erstellt und die ganzen buttonb da reingepackt?
sonst kommt natürlich n fehler.
browerman ist offline   Mit Zitat antworten
Alt 11-09-2009, 14:30   #8 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
@browerman: Nee, hatte ich nicht. Jetzt funktioniert es!



Hier der noch etwas ruppige Code für alle, die ein 3D Karussell in AS3 wollen. Allerdings ist das Ergebnis genauso mäßig, wie in AS2. Die Bilder werden nicht wie erhofft, glatter dargestellt. Aber immerhin kann ich jetzt das Projekt in AS3 fortführen. Also Danke liebe Community (esp. browerman) !


XML-File

<?xml version="1.0" encoding="UTF-8"?>
<main>
<pfad>bild1.png</pfad>
<pfad>bild2.png</pfad>
<pfad>bild3.png</pfad>
<pfad>bild4.png</pfad>
<pfad>bild5.png</pfad>
</main>


Code:
var wbilder:String="bilder.xml";

var radius:Point;
var center:Point;
var speed:Number=0.01;
var ausgleich:Number = 65;

var karusell:MovieClip = new MovieClip();
addChild(karusell);
var allItems:Array = new Array();
function Carousel() {

	radius=new Point(350,60);
	center=new Point(stage.stageWidth/2,stage.stageHeight/2);

	var urlx:URLRequest=new URLRequest(wbilder);

	var xmlloader:URLLoader = new URLLoader();
	xmlloader.addEventListener(Event.COMPLETE, parseXML);
	xmlloader.load(urlx);

	function parseXML(evt:Event) {
		var xml:XML=XML(xmlloader.data);
		xml.ignoreWhite=true;
		var itm:uint=xml.pfad.length();
		for (var i:int=0; i<=itm; i++) {
			
			var request:URLRequest=new URLRequest(xml.pfad[i]);
			var loader:Loader = new Loader();
			loader.load(request);
			var t:bildcontainer = new bildcontainer();
			t.addChild(loader);
			t.angle=(i*((Math.PI*2)/itm));
			t.addEventListener(Event.ENTER_FRAME,onEnter);
			karusell.addChild(t);
			allItems[i]=t;

		}
	}
}

function onEnter(evt:Event):void {
	var obj:bildcontainer=bildcontainer(evt.currentTarget);
	obj.x=Math.cos(obj.angle)*radius.x+center.x-ausgleich;
	obj.y=Math.sin(obj.angle)*radius.y+center.y-ausgleich;
	var scale:Number=obj.y /(center.y+radius.y-ausgleich);
	obj.scaleX=obj.scaleY=scale;
	obj.angle=(obj.angle+speed);
	var depth:Number=karusell.getChildIndex(obj);
	sortZ();
}

function sortZ():void {
	this.allItems.sortOn("scaleX", Array.DESCENDING | Array.NUMERIC);

	for (var i:uint = 0; i < karusell.numChildren; i++) {
		var item:bildcontainer=this.allItems[i];
		karusell.setChildIndex(item, this.karusell.numChildren-(i+1));
	}
}

Carousel();


Geändert von Schwaermer (11-09-2009 um 15:33 Uhr)
Schwaermer ist offline   Mit Zitat antworten
Alt 11-09-2009, 15:45   #9 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 50
bin ja schonmal froh, dass es funzt :-)

die reingeladenen bilder haben von hause aus keine kantenglättung.

das was du dir extern reinlädst, wird doch sicher ein Bitmap sein.
da musst du smoothing noch anstellen und schon sieht das alles etwas schicker aus

nur so als beispiel ;-)
PHP-Code:
private function imgLoaded(e:Event):void
{        
    var 
bmp:Bitmap;
    
bmp imgLdr.content as Bitmap
    bmp
.smoothing true;

browerman ist offline   Mit Zitat antworten
Alt 11-09-2009, 16:18   #10 (permalink)
Nix Wisser
 
Benutzerbild von nullidee
 
Registriert seit: May 2003
Ort: Würzburg, Kleinstadt
Beiträge: 3.510
Zitat:
Zitat von Schwaermer Beitrag anzeigen
Hier der noch etwas ruppige Code für alle, die ein 3D Karussell in AS3 wollen. Allerdings ist das Ergebnis genauso mäßig, wie in AS2. Die Bilder werden nicht wie erhofft, glatter dargestellt. Aber immerhin kann ich jetzt das Projekt in AS3 fortführen.
Ich habe keine Probleme das in AS2 smooth, nicht pixelig darzustellen
__________________
nullidee

Abakus GT 10² Kugeln - 80"Leinwand - CARAN D´ACHE SUPRACOLOR®
nullidee ist offline   Mit Zitat antworten
Alt 12-09-2009, 17:06   #11 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
@browerman: Wie baue ich die Funktion in mein Script ein? Kannst du es umschreiben, wie die da eingebaut wird? Wie übergebe ich "imgLdr" an die Funktion? Es sind Bilder, ja...


Ich habe das jetzt folgendermaßen eingebaut:

Code:
for (var i:int=0; i<=itm; i++) {

			var request:URLRequest=new URLRequest(xml.pfad[i]);
			var loader:Loader = new Loader();
			loader.load(request);
			loader.addEventListener(Event.COMPLETE, onLoaded);
			var t:bildcontainer = new bildcontainer();
			t.addChild(loader);
			t.angle=(i*((Math.PI*2)/itm));
			t.addEventListener(Event.ENTER_FRAME,onEnter);
			karusell.addChild(t);
			allItems[i]=t;

		}

function onLoaded(e:Event):void {
var bmp:Bitmap;
bmp=e.currentTarget.content as Bitmap;
bmp.smoothing=true;
}
...habe aber immernoch den Eindruck, als ob das nichts gebracht hat.

Geändert von Schwaermer (12-09-2009 um 17:30 Uhr)
Schwaermer ist offline   Mit Zitat antworten
Alt 12-09-2009, 17:47   #12 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 50
du addest ja in der schleife schon das geladene bild.
und nach dem complete event erstellst du ein bitmap, welches aber nirgends geadded wird, also einfach nur so rumliegt ;-)

ungetestet würd ich jetzt sagen:

Code:
for (var i:int=0; i<=itm; i++) {

			var request:URLRequest=new URLRequest(xml.pfad[i]);
			var loader:Loader = new Loader();
			loader.load(request);
			loader.addEventListener(Event.COMPLETE, onLoaded);

		}

function onLoaded(e:Event):void {
var bmp:Bitmap;
bmp=e.currentTarget.content as Bitmap;
bmp.smoothing=true;

var t:bildcontainer = new bildcontainer();
t.addChild(bmp);
t.angle=(i*((Math.PI*2)/itm));
t.addEventListener(Event.ENTER_FRAME,onEnter);
karusell.addChild(t);
allItems.push(t);
}
ich hoffe ich irr mich da jetzt nicht ;-)

ich hab mir halt ne imageloader class geschrieben, und da greif ich dann immer das geladenen bitmap ab. müsste aber eigentlich das gleiche bei rauskommen.

Geändert von browerman (12-09-2009 um 17:50 Uhr)
browerman ist offline   Mit Zitat antworten
Alt 12-09-2009, 20:25   #13 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
Zitat:
Zitat von browerman Beitrag anzeigen
du addest ja in der schleife schon das geladene bild.
und nach dem complete event erstellst du ein bitmap, welches aber nirgends geadded wird, also einfach nur so rumliegt ;-)

ungetestet würd ich jetzt sagen:

Code:
for (var i:int=0; i<=itm; i++) {

			var request:URLRequest=new URLRequest(xml.pfad[i]);
			var loader:Loader = new Loader();
			loader.load(request);
			loader.addEventListener(Event.COMPLETE, onLoaded);

		}

function onLoaded(e:Event):void {
var bmp:Bitmap;
bmp=e.currentTarget.content as Bitmap;
bmp.smoothing=true;

var t:bildcontainer = new bildcontainer();
t.addChild(bmp);
t.angle=(i*((Math.PI*2)/itm));
t.addEventListener(Event.ENTER_FRAME,onEnter);
karusell.addChild(t);
allItems.push(t);
}
ich hoffe ich irr mich da jetzt nicht ;-)

ich hab mir halt ne imageloader class geschrieben, und da greif ich dann immer das geladenen bitmap ab. müsste aber eigentlich das gleiche bei rauskommen.
Nee, das hatte ich schon probiert. Da fehlt ja auch die Var itm und i, die nicht mit in die Funktion übertragen werden. Es scheint ja zu funktionieren. Ich bin mit dem Ergebnis aber nicht sehr zufrieden, weil die Ränder meiner PNGs mit Transparentem Hintergrund ziemlich wackeln. Das ist aber wohl nicht zu lösen. Ich lasse es erstmal so. Damit, dass ich nun ein funktionierendes Karussell habe in AS3, bin ich zufrieden.

Schön wäre jetzt noch eine Reflektion der Bilder auf dem untergrund, so wie in anderen Beispielen oder meinem alten AS2 Karussel.

Danke dir für die Hilfe. Falls du mal Probs mit PHP hast, da bin ich firm!
Schwaermer ist offline   Mit Zitat antworten
Alt 13-09-2009, 07:21   #14 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 50
oops, das i hatte ich übersehen.
dann nimm doch einfach noch ne counter variable dazu, die du jedesmal in der onLoaded hochzählst.

und itm ist doch nur die gesamtanzahl der items im karussel, die kannst du doch bequem am anfang deklarieren.

was die spiegelung angeht.
in der onLoaded hast du doch das bmp geladen. kopier das einfach in ein anderes bitmap, spiegel das ganze, packs unter die andere und hau dann noch nen gradient, z.b von transparent bis weiss drauf.
browerman ist offline   Mit Zitat antworten
Alt 13-09-2009, 11:17   #15 (permalink)
Homo Sedentarius
 
Benutzerbild von Schwaermer
 
Registriert seit: Jun 2007
Beiträge: 150
@browerman: Klappt alles nicht. Selbst, wenn ich die Funktion mit in die Schleife nehme nicht. Es werden wohl aus den geladenen Bildern keine Bitmaps gemacht. Oder man kann die nicht einfach so an t hängen.
K.A. warum - es geht nicht.

Was noch zu verbessern wäre ist, dass die Bilder hinten weiter auseinander stehen, als die vorderen. Dafür müsste obj.angle entsprechend modifizieren. Aber höhere Mathematik ist nicht so mein Ding. Vielleicht hat jemand da eine simple Lösung, wie man das ausgleichen kann?

Geändert von Schwaermer (13-09-2009 um 11:20 Uhr)
Schwaermer 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ich glaube diesen Problem kennen viele:-( Performance Problem Animator Flash MX 8 11-01-2011 17:07
onRollOver-Problem, oder auch gotoAndPlay - kleines Problem für geübten Skripter Ladina Flash Einsteiger 2 04-05-2007 11:09
Flash -> PHP 5 Problem -> EBay API Problem... mirzahat Server-Seite allgemein 2 22-09-2006 21:36
Online Problem, lokal kein Problem Mr.Brown Flash MX 4 14-05-2006 18:24
loadmovie problem und schleifen problem mit variable Bourne ActionScript 1 8 13-09-2004 00:32


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele