| |||||||
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 2008
Beiträge: 3
|
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 |
| | |
| | #2 (permalink) |
| vermisst ein e 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 |
| | |
| | #3 (permalink) |
| Neuer User 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 |
| | |
| | #4 (permalink) |
| Neuer User 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 |
| | |
| | #5 (permalink) | |
| Flash-Vertrauter Registriert seit: Dec 2003
Beiträge: 137
|
@elysianChaos Vielen Dank für den Tip mit Zitat:
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 | |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |