Hello!
I'm trying to use one View3D with seperate camera and scene as a
MovieMaterial to be shown on Planes in another View3D. I tried to
figure this out several times but all i can see is just a background
of first (buffer) View3D.
Sorry for posting such a long code but it's still a bit messy. Hope
you'll forgive and help me ;) Thanks in advance
first simple custom class (just for holding Planes in linked list):
package
{
import away3d.primitives.Plane;
public class LinkedPlane extends Plane
{
public var next:LinkedPlane = null;
public function LinkedPlane()
{
super();
}
}
}
here comes the main code:
package {
import __AS3__.vec.Vector;
import away3d.cameras.*;
import away3d.containers.*;
import away3d.materials.*;
import away3d.primitives.*;
import flash.display.*;
import flash.events.*;
import flash.geom.Rectangle;
[SWF
(width='1000',height='800',frameRate='60',backgroundColor='0x000000')]
public class WormholeSpheres extends Sprite
{
private var view:View3D;
private var camera:Camera3D;
private var sph:Sphere;
private var bufferView:View3D;
private var bufferCamera:HoverCamera3D;
private var bufferMaterial:MovieMaterial;
private var wormLayer:Vector.<Sphere> = new Vector.<Sphere>();
private var circleX:Vector.<int> = new Vector.<int>();
private var circleY:Vector.<int> = new Vector.<int>();
private const QUALITY:int = 12; // defines number of spheres in
each layer
private var spheres:Vector.<LinkedPlane> = new
Vector.<LinkedPlane>;
private function createBuffer():void
{
sph = new Sphere();
sph.x = 60;
sph.y = 60;
sph.z = 100;
sph.radius = 50;
sph.segmentsH = 12;
sph.segmentsW = 12;
bufferView.graphics.beginFill(0xff0000);
bufferView.graphics.drawRect(0,0,256,256);
bufferView.graphics.endFill();
bufferView.scene.addChild(sph);
}
private function debug():void
{
createBuffer();
precalculateXY(200);
var s: LinkedPlane;
for (var i:int = 0 ; i<=40 ; i++)
{
createCircle(i, 0,0,-4000+ i*100);
s = spheres[i].next;
do
{
view.scene.addChild(s);
s = s.next;
} while(s);
}
}
private function precalculateXY(radius:Number):void
{
const d360:Number = 2 * Math.PI;
var i:int;
var step:Number = d360 / QUALITY;
for (i = 0 ; i <= QUALITY ; i++)
{
circleX[i] = radius * Math.sin(i*step);
circleY[i] = radius * Math.cos(i*step);
}
}
private function createCircle(index: int, xOffset:int,
yOffset:int,
zOffset:int):void
{
const polygonsQuality:int = 1;
const rad:int = 60;
var current: LinkedPlane;
var n: int = QUALITY;
var i:int = 0;
current = spheres[index] = new LinkedPlane();
for(;i<n;++i)
{
current = current.next = new LinkedPlane();
current.x = circleX[i] + xOffset;
current.y = circleY[i] + yOffset;
current.z = zOffset;
current.segmentsH = polygonsQuality;
current.segmentsW = polygonsQuality;
current.height = rad;
current.width = rad;
current.rotationX = 90;
current.bothsides = true;
current.material = bufferMaterial;
}
}
private function init3d():void
{
camera = new HoverCamera3D();
camera.zoom = 4;
camera.x = 0;
camera.y = 0;
camera.z = 0;
view = new View3D();
view.x = 500;
view.y = 400;
view.camera = camera;
bufferCamera = new HoverCamera3D();
bufferView = new View3D();
bufferView.camera = bufferCamera;
bufferView.visible = false;
}
private function initStage():void
{
stage.quality = StageQuality.LOW;
addChild(view);
addChild(bufferView);
bufferMaterial = new MovieMaterial(bufferView);
fps = new FPSCounter();
addChild(fps);
}
public function WormholeSpheres()
{
init3d();
initStage();
debug();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
bufferCamera.hover();
bufferView.render();
view.render();
camera.z -= 2;
}
}
}