| Alex Lexcuk |
30.03.2013 13:43 |
В исходнике не разобрался, возможно ещё надо
Код AS3:
dir = Matrix3DUtils.getRight(view.camera.transform);
container.lookAt(view.camera.position, dir);
пример набросал с 9 кубиками (четко лицом к пользователю)
Код AS3:
package
{
import away3d.animators.*;import away3d.core.partition.*;
import away3d.events.*;import away3d.cameras.lenses.*;
import away3d.core.base.*;import away3d.core.math.*;
import away3d.library.assets.*;import away3d.debug.*;
import away3d.cameras.*;import away3d.containers.*;import away3d.entities.*;
import away3d.lights.*; import away3d.materials.*;
import away3d.materials.lightpickers.*;
import away3d.materials.methods.*; import away3d.primitives.*;
import away3d.textures.*;import away3d.filters.*;
import away3d.materials.utils.*;import away3d.primitives.data.*;
import flash.display.*; import flash.events.*; import flash.system.*;
import flash.ui.*; import flash.utils.*; import flash.sampler.*;
import flash.net.*; import flash.media.*; import flash.net.*;
import flash.external.*; import flash.text.*;
import flash.geom.*;
/**
* ...
* @author Lexcuk
*/
public class TestLookAtDoc extends Sprite
{
private var container:ObjectContainer3D;
public var sprite:Sprite;
public var view:View3D;
private var containerArr:Array;
private var blaMaterial:TextureMaterial;
private var hrefTxt:TextField;
private var nArr:Array;
public function TestLookAtDoc()
{
view = new View3D();
view.camera.lens.far = 5000;
view.camera.lens.near = 1;
//view.camera.moveTo( 0, 1000, 0);
view.camera.moveTo( 1000, 500, 300);
//view.camera.moveTo( 300, 500, 1000);
view.camera.lookAt(new Vector3D(0, 0, 0))
sprite = new Sprite();
sprite.addChild(view);
sprite.addChild(new AwayStats(view));
addChild(sprite);
var perlinBitmap:BitmapData = getPerlinBmd();
container = new ObjectContainer3D();
view.scene.addChild(container);
var sunLight:DirectionalLight = new DirectionalLight( -1, -0.4, 1);
//with (sunLight) { color = 0xFFFF80; castsShadows = true; ambient = diffuse = specular = 1; }
container.addChild(sunLight);
var bgMesh:Mesh = new Mesh(new PlaneGeometry(1000, 1000));;
var bgMaterial:TextureMaterial = new TextureMaterial(new BitmapTexture(perlinBitmap), false, true);
bgMesh.material = bgMaterial;
container.addChild(bgMesh);
blaMaterial = mekeBlaMaterial();
containerArr = [];
var con:ObjectContainer3D;
nArr = ['A', 'B', 'C', 'D', 'E', 'G', 'H', 'K','L','M','N','O','P'];
for (var i:int; i < 9; i++) {
container.addChild(con = makeContainer(
300-int(i / 3) * 300,
300-int(i % 3) * 300,
nArr[i]
));
containerArr.push(con);
con.lookAt(view.camera.position, Vector3D.Z_AXIS);
}
sprite.addChild(hrefTxt = new TextField());
hrefTxt.border = true;
hrefTxt.background = true;
hrefTxt.backgroundColor = 0xFFFFFF;
hrefTxt.autoSize = TextFieldAutoSize.LEFT;
hrefTxt.x = 200;
var htmStr:String = '';
htmStr = addStrHref('camA') + addStrHref('camB') + addStrHref('camC');
for (i = 0; i < 9; i++) htmStr += addStrHref(nArr[i]);
htmStr += addStrHref('поставить всё')
hrefTxt.htmlText = htmStr;
hrefTxt.addEventListener("link", txtNavHandler);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function txtNavHandler(e:TextEvent):void {
if (e.text == 'camA') view.camera.moveTo( 0, 1000, 0);
if (e.text == 'camB') view.camera.moveTo( 1000, 500, 300);
if (e.text == 'camC') view.camera.moveTo( 300, 500, 1000);
view.camera.lookAt(new Vector3D(0, 0, 0));
for (var i:int; i < 9; i++) {
var dir:Vector3D = Matrix3DUtils.getRight(view.camera.transform);
if (e.text == nArr[i]) {
containerArr[i].lookAt(view.camera.position, dir);
}
}
if (e.text == 'поставить всё') {
for (i=0; i < 9; i++) {
dir = Matrix3DUtils.getRight(view.camera.transform);
containerArr[i].lookAt(view.camera.position, dir);
}
}
}
private function addStrHref(str:String, delimStr:String = ' | '):String {
return "<a href='event:" + str + "'>" + str + "<u></u>"+delimStr;
}
private function enterFrameHandler(e:Event):void {
view.render();
}
public function makeContainer(posX:Number, posY:Number, str:String = 'A'):ObjectContainer3D {
var con:ObjectContainer3D = new ObjectContainer3D();
var c3:ObjectContainer3D = new ObjectContainer3D();
var cM:Mesh = new Mesh(new CubeGeometry(100, 100, 100), blaMaterial);
var pM:Mesh = new Mesh(new PlaneGeometry(100, 100, 1, 1), makeAMaterial(str));
c3.addChild(cM);
c3.addChild(pM);
pM.position = new Vector3D(0, 51, 0);
c3.rotationX = 90;
c3.rotationZ = 90;
con.addChild(c3);
con.position = new Vector3D(posX, 50, posY);
return con;
}
public function mekeBlaMaterial():TextureMaterial {
var txt:TextField = new TextField();
for (var i:int; i < 100; i++) txt.appendText('bla bla blabla bla blabla bla bla\n');
txt.autoSize = TextFieldAutoSize.LEFT;
var tbmd:BitmapData = new BitmapData(128, 128);
var m:Matrix = new Matrix();
tbmd.draw(txt,m);
return new TextureMaterial(new BitmapTexture(tbmd), false, true);
}
public function makeAMaterial(str:String = 'A'):TextureMaterial {
var txt:TextField = new TextField();
txt.text = str;
var tbmd:BitmapData = new BitmapData(128, 128);
var m:Matrix = new Matrix();
m.ty = -4;
m.tx = -1;
m.scale(13, 13);
tbmd.draw(txt,m);
return new TextureMaterial(new BitmapTexture(tbmd), false, true);
}
public function getPerlinBmd():BitmapData {
var s:Number = 512;
var bitmapData:BitmapData = new BitmapData(s, s, true);
var numOctaves:Number = 1;
bitmapData.perlinNoise(25, 52, 1, 1314, false, false, 10, false)
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xFFFFFF);
sp.graphics.drawRect(0, 0, s, s);
sp.addChild(new Bitmap(bitmapData));
var resBitmap:BitmapData = new BitmapData(s, s, true);
resBitmap.draw(sp);
return resBitmap;
}
}
}
|