Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-03-2010, 14:02   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 3
Lightbulb globale 3D Ausrichtung von nested Sprites

Hey Dudes!

Folgendes großes Problem auf klein runtergebrochen:

Ich habe ein großes Sprite und darin viele kleine Sprites.
Wenn ich das große Sprite in 3d drehe, sollen die kleinen stehts ihre Ausrichtung ändern, so dass sie die virtuelle Kamera anschauen.

im Endeffekt fehlt mir der code, um die globale drehung der kleinen Sprites auszulesen um sie dann zu manipulieren, da sie ja lokal immer auf 0 stehen.

Hintergrundgeschichte ist z.B. partikeleffekte mit kameradrehung.

mit pointAt(), Matrix3D etc bin ich nicht weitergekommen und auch googlemäßig nichts gefunden.

also Testcode kann folgendes verwendet werden:
Code:
var sp :Sprite = new Sprite();
var shapes :Vector.<Shape> = new Vector.<Shape>(50,false);

for (var i in shapes) {
	var shape :Shape = new Shape();
	with (shape.graphics) {
		lineStyle(0,0x000000);
		beginFill(0x999999);
		drawCircle(0,0,20);
	}
	shapes[i] = shape;
	shape.x = Math.random()*1000-500;
	shape.y = Math.random()*1000-500;
	shape.z = Math.random()*1000-500;
	sp.addChild(shape);
}

sp.x = stage.stageWidth / 2;
sp.y = stage.stageHeight / 2;

addChild(sp);

addEventListener(Event.ENTER_FRAME, move);
function move(e:Event) {
	sp.rotationX++;
	sp.rotationY++;
	for (var i in shapes) {
		// hier fehlt die Aurichtung, etwa in Form:
		//shapes[i].rotationX = ...
	}
}
Hoffe Ihr könnt mir helfen.
Vielen Dank schonmal im Vorraus.

Marco
mad-sign ist offline   Mit Zitat antworten
Alt 02-03-2010, 14:26   #2 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
Müsste mit der inversen Matrix gehen: jedem sprite in sp die Inverse von sp zuweisen. Bei tieferen Verschachtelungen die jeweiligen Matrizen aufmultiplizieren.
Ich kanns nochmal probieren, weiß aber nicht ob ich heute noch dazu komme. Vielleicht hilft dir der Tip aber ja schon.
joeydee ist offline   Mit Zitat antworten
Alt 03-03-2010, 16:56   #3 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 3
Danke für den Tip. Die Idee scheint zu funktionieren. Sieht aber noch sehr unsauber aus. Vielleicht gibt es ja noch eine einfachere Lösung, wo man direkt die Rotation aus der einen Matrix rausziehen kann und invertiert übergibt. Komme nicht so wirklich mit Matrix3D klar

Hier mein Gebastel:

Code:
	for (var i in shapes) {
		var matrix :Matrix3D = sp.transform.matrix3D.clone();
		matrix.invert();
		matrix.position = new Vector3D(shapes[i].x, shapes[i].y, shapes[i].z);
		shapes[i].transform.matrix3D = matrix;
	}
mad-sign ist offline   Mit Zitat antworten
Alt 05-03-2010, 07:02   #4 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
Das sieht nur deshalb unsauber aus, weil man in Flash AS3 leider noch keine Operatoren überladen kann, und weil dir Matrixoperationen noch nicht so geläufig sind. Geschwindigkeitsmäßig ist dies das sauberste, da reine Matrixoperationen nur die Grundrechenarten verwenden. Alles was du mit Winkeln lösen willst braucht in der Regel trigonometrische Funktionen. Und das zweifach, wenn du Winkel aus der Matrix ziehen, ändern, und wieder zurück in die Matrix schreiben willst. Dazu gibt es zwar decompose und recompose, aber garantiert langsamer, kannst es aber ja mal ausprobieren.
joeydee ist offline   Mit Zitat antworten
Alt 09-03-2010, 14:00   #5 (permalink)
Neuer User
 
Registriert seit: Mar 2010
Beiträge: 3
Super, danke Dir. Das hat mir wiklich sehr weiter geholfen

Hier der fertige Code, zu sehen auf:
http://www.madsign.de/labor/3DMatrixInvert.swf

Code:
var tF    :TextField = new TextField();
var tForm :TextFormat = new TextFormat("verdana", 10, 0xffffff);

var spInner    :Sprite = new Sprite();
var spOuter    :Sprite = new Sprite();
var spots      :Vector.<Object> = new Vector.<Object>;
var garbage    :Vector.<Object> = new Vector.<Object>;

var fps :uint = getTimer();
var rad :Number = 0;

function createNewSpot() {
	var spot :Object = { mc:new Pic() };
	rad += Math.PI * 2 / 3 + 0.02;
	rad %= Math.PI * 2;
	spot.speedX = Math.sin(rad) * 5;
	spot.speedZ = Math.cos(rad) * 5;
	spot.speedY = -20;
	spot.age = 0;
	spot.maxAge = 300;
	
	//random color
	var newColour :ColorTransform = spot.mc.transform.colorTransform;
	newColour.color = Math.random() * 0xffffff;
	spot.mc.transform.colorTransform = newColour;
	
	spInner.addChild(spot.mc);
	spots.push(spot);
}

//setup
tF.defaultTextFormat = tForm;
tF.width = 150;
addChild(tF);

spOuter.x = stage.stageWidth / 2;
spOuter.y = stage.stageHeight / 2;
spOuter.z = 500;
spInner.rotationX = 0;

spOuter.addChild(spInner);
addChild(spOuter);

addEventListener(Event.ENTER_FRAME, move);

function move(e:Event) {
	var newFps :uint = getTimer();
	tF.text = "particleCount: "+ spots.length + "\nFPS: "+ int(1000/(newFps - fps));
	fps = newFps;																				  
	
	createNewSpot();
	
	//cam rotation
	spInner.rotationY = root.mouseX;
	spOuter.rotationX = root.mouseY + 180;
	
	normalizeOrientationOfChildren(spInner);
    reorderChildren(spInner);
	
	//spot movement
	for (var i in spots) {
		if (++spots[i].age > spots[i].maxAge) garbage.push(spots[i]);
		with (spots[i]) {
			if (age > maxAge - 10) mc.scaleX = mc.scaleY = mc.scaleZ = (maxAge - age) / 10;
			mc.x += speedX;
			mc.y += speedY;
			mc.z += speedZ;
			speedX *= 0.99;
			speedZ *= 0.99;
			speedY += 0.75;
			if (mc.y > 0) { mc.y = 0; speedY *= -0.75; }
		}
	}
	garbageCollector();

}
function garbageCollector() {
	for (var i in garbage) {
		garbage[i].mc.parent.removeChild(garbage[i].mc);
		spots.splice(spots.indexOf(garbage[i]), 1);
	}
	garbage = new Vector.<Object>;
}

function normalizeOrientationOfChildren(sp :DisplayObjectContainer) {
	for (var i :int = 0; i < sp.numChildren; i++) {
		
		// get 3dMatrix of all parent Sprites
		var matrix :Matrix3D = sp.transform.matrix3D.clone();
		var spParent :DisplayObjectContainer = sp.parent;
		while (!(spParent.parent is Stage)) {
			matrix.append(spParent.transform.matrix3D);
			spParent = spParent.parent;
		}
		var dO :DisplayObject = sp.getChildAt(i);
		matrix.invert();

		//get old spot position
		matrix.position = new Vector3D(dO.x, dO.y, dO.z);
		dO.transform.matrix3D = matrix;
	}
}

function reorderChildren(sp :DisplayObjectContainer) {
	//zsort
	var vec :Vector.<Object> = new Vector.<Object>;
	while (sp.numChildren > 0) {
		vec.push( { dO:sp.getChildAt(0), relZ: sp.getChildAt(0).transform.getRelativeMatrix3D(root).position.z} );
		sp.removeChildAt(0);
	}
    vec.sort(function(x:Object, y:Object) {return y.relZ - x.relZ;}); 
	for (var i in vec) sp.addChild(vec[i].dO);
}
mad-sign ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
ausrichtung, global, local, nested, rotation

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
nested templates kurthurtig Web-Editoren 2 02-06-2009 20:23
complex nested xml icymonkey ActionScript 3 9 20-08-2008 00:39
Nested set Samuel PHP und MySQL 16 04-02-2006 09:27
Nested Animation tebedini Flash MX 4 16-01-2006 09:04
nested buttons pheidrias ActionScript 1 6 08-04-2003 17:19


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele