| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: Mar 2010
Beiträge: 3
|
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 = ...
}
} Vielen Dank schonmal im Vorraus. Marco |
| | |
| | #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. |
| | |
| | #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;
} |
| | |
| | #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.
|
| | |
| | #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);
} |
| | |
![]() |
| Lesezeichen |
| Stichworte |
| ausrichtung, global, local, nested, rotation |
| Themen-Optionen | |
| Ansicht | |
| |
Ä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 |