Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-10-2008, 11:22   #1 (permalink)
Neuer User
 
Benutzerbild von elysianChaos
 
Registriert seit: Mar 2008
Beiträge: 3
Question PerspectiveProjection problem

Hi, hab folgende Frage:

In den gängigen 3D Engines für as3 kann man der Kamera sagen von wo aus sie "aufnehmen" soll, sprich man hat cam.x .y .z. Vergleichbare Einstellungsmöglichkeiten finde ich leider nicht in der nun AS3 eigenen 3D Engine...
Ich kann der Cam zwar sagen worauf sie gerichtet werden soll ( ich glaub es war root.transform.PerspectiveProjection.projectionCen ter = new Point(x,y); ) aber wie gesagt zur position der Cam find ich nix gibts da schon irgendwelche brauchbaren anleitungen ?
__________________
www.gidf.de
elysianChaos ist offline   Mit Zitat antworten
Alt 20-10-2008, 14:23   #2 (permalink)
vermisst ein e
 
Benutzerbild von kRizzl
 
Registriert seit: Oct 2007
Beiträge: 774
"3d engine" ist auch stark uebertrieben.. (: im grunde ists nur ne bessere perspektivische verzerrung.
eine "kamera" gibts in diesem sinne nicht. du musst eher dafuer sorgen, dass deine displayobjects an der richtigen stelle stehen.

wenn du zum beispiel drei content-sprites der z-achse entlang hintereinander angeordnet hast und zwischen denen hin- und herfliegen moechtest, solltest du die drei in einen weiteren container-sprite reinpacken und diesen container dann verschieben.
liegen die sprites im container auf den z-positionen 500, 1000, 1500 und moechtest immer einen abstand zur kamera von 200, setzt du container.z = content[i].z - 200;
dasselbe gilt auch fuer rotationen, da wirds dann aber schon komplizierter zu rechnen, je nach verschachtelei.. ;D

ps: ich weiss gerade nich in welche richtung die z-achse bei flash10 laeuft, kann auch sein, dass die werte negativ statt positiv sind..
__________________
krisrok.de
kRizzl ist offline   Mit Zitat antworten
Alt 20-10-2008, 18:48   #3 (permalink)
Neuer User
 
Benutzerbild von elysianChaos
 
Registriert seit: Mar 2008
Beiträge: 3
^^ die Werte sind positiv, das mit der Rotation is echt halt das Problem, hatte auch erst die idee das ganze einfach in n Sprite zu packen und das dann wie ne Cam zu schwenken nur funktioniert mein z-order script dann nicht mehr .
Naja ich werd dann mit an der z-order n bissl rumtüfteln, trotzdem danke
__________________
www.gidf.de
elysianChaos ist offline   Mit Zitat antworten
Alt 23-10-2008, 13:28   #4 (permalink)
Neuer User
 
Benutzerbild von elysianChaos
 
Registriert seit: Mar 2008
Beiträge: 3
So falls noch jemand das Problem gehabt haben sollte, ich hab mich mal daran begeben das ganze mit nem Sprite als Cam zu lösen.
habs bisjetz nur n bissl getestet, mein z-order funktion macht noch clipping fehler wenn 2 sprites den selben z Wert haben, jedoch unterschiedliche rotationen, deshalb werde ich den Teil in den kommenden Tagen nomma neu schreiben und auch die Rotation der Sprites in die berechnung mit einschließen. Für einfache Anwendungen funktioniert das ganze allerdings schon wunderbar.

Ist allerdings alles noch sehr quick&dirty ^^

Code:
package elysian{
	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;
	
	public class mvision extends Sprite
	{
		private var ViewPort:MovieClip;
		public var camera:Object;
		public var DisplayObjectsList:Array;
		private var reverseRange:Object = {min:90, max:270};
		private var autoRender:Boolean;
		public function mvision(autoRender:Boolean = false):void
		{
			init();
			this.autoRender = autoRender;
		}
		
		private function init(e:Event = null):void
		{
			setDefaults();
			//stage.scaleMode = StageScaleMode.NO_SCALE;
			if(autoRender)
			{
				addEventListener(Event.ENTER_FRAME, render);
			}else{
				render();
			}
		}
		
		public function render(e:Event = null):void
		{
			updateViewPort();
			orderDepths(null);
		}
		
		private function setDefaults():void
		{
			ViewPort = new MovieClip();
			addChild(ViewPort);
			
			camera = {_focusX: 0, _focusY: 0, _focusZ: 0, _rotationY: 0, _rotationX: 0, _rotationZ: 0};
					
			DisplayObjectsList = new Array();
		}
		
		public function addChild3D(Child:DisplayObject):void
		{
			ViewPort.addChild(Child);
			DisplayObjectsList.push(Child);
		}
		
		private function updateViewPort():void
		{
			var checkRotationX:Number = (Math.floor(Math.abs(camera._rotationX)/360)>0)?Math.abs(camera._rotationX)-(360*Math.floor(Math.abs(camera._rotationX)/360)):Math.abs(camera._rotationX);
			var checkRotationY:Number = (Math.floor(Math.abs(camera._rotationY)/360)>0)?Math.abs(camera._rotationY)-(360*Math.floor(Math.abs(camera._rotationY)/360)):Math.abs(camera._rotationY);
			
			ViewPort.rotationX = (camera._rotationX>0)?checkRotationX:checkRotationX*-1;
			ViewPort.rotationY = (camera._rotationY>0)?checkRotationY:checkRotationY*-1;
			ViewPort.rotationZ = camera._rotationZ;
			
			ViewPort.x = camera._focusX;
			ViewPort.y = camera._focusY;
			ViewPort.z = camera._focusZ;
		}
		
		private function orderDepths(e:Event):void
		{
			if(ViewPort && DisplayObjectsList && DisplayObjectsList.length > 0)
			{
				DisplayObjectsList.sortOn("z", Array.DESCENDING | Array.NUMERIC);
				if((Math.abs(ViewPort.rotationX) > reverseRange.min && Math.abs(ViewPort.rotationX) < reverseRange.max ))
				{
					DisplayObjectsList.reverse();
				}
				if((Math.abs(ViewPort.rotationY) > reverseRange.min && Math.abs(ViewPort.rotationY) < reverseRange.max ))
				{
					DisplayObjectsList.reverse(); 
				}
				for(var i:uint = 0; i< DisplayObjectsList.length; i++)
				{
					var tmp:DisplayObject = DisplayObjectsList[i];
					ViewPort.setChildIndex(tmp, i);
				}
			}
		}
	}
}
__________________
www.gidf.de
elysianChaos ist offline   Mit Zitat antworten
Alt 16-12-2008, 21:10   #5 (permalink)
Flash-Vertrauter
 
Benutzerbild von Starmaster
 
Registriert seit: Dec 2003
Beiträge: 137
@elysianChaos Vielen Dank für den Tip mit
Zitat:
ich glaub es war root.transform.perspectiveProjection.projectionCen ter = new Point(x,y);
Damit funktionieren schonmal meine 3D-Fensterinhalte Ebenfalls cool, der Code für den Z-Order. Ist ja einfacher als ich Anfangs dachte.

Falls jemand auf die Idee kommt, ein "Viewport"-Sprite mit ner Perspektiveneinstellung ebenfalls nochmal zu drehen, wird "tolle" Ergebnisse erzielen. Keine Ahnung, ob das nen Bug ist oder ich in der Handhabunf was falsch gemacht habe.
Ich habs jedenfalls mit nem Bitmap gelöst. Ein jeden neuen Frame Kopiere ich das "Viewport-Sprite" per Bitmap.draw() in Bitmap und stelle nur das Bitmap dar. Nun kann ich das Bitmap selber im 3D-Raum drehen, ohne dass das Einfluss auf den Inhalt hat ... und wohalah schon hab ich meinen virtuellen Monitor
Starmaster 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 16:29 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele