基于Alternativa3D 7.6的3D line的绘制

与PaperVision3D, Away3D等相对成熟的Flash 3D引擎不同,Alternativa3D 7.6在原生的swc包中没有提供3D线的绘制功能。而对于一些非游戏的应用,比如路径分析的展示,往往需要用到 3DLine这种极简单的Primitive类型。 本文利用A3D 中的Mesh来模拟3D 线的绘制。

package 
{
import alternativa.engine3d.controllers.SimpleObjectController;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3DContainer;
import alternativa.engine3d.core.Vertex;
import alternativa.engine3d.core.View;
import alternativa.engine3d.materials.FillMaterial;
import alternativa.engine3d.objects.Mesh;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Vector3D;


public class DrawLine extends Sprite
{

private var controller:SimpleObjectController;
private var rootContainer:Object3DContainer=new Object3DContainer();

private var camera:Camera3D

public function DrawLine()
{
//引擎基本设置

stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;

camera=new Camera3D();
camera.view=new View(stage.stageWidth, stage.stageHeight);
camera.z=-300;
addChild(camera.view);

rootContainer.addChild(camera);

controller=new SimpleObjectController(stage, camera, 200);
controller.unbindAll();

//调用绘制3D线的函数

drawLine(new Vector3D(0, 0, 0), new Vector3D(100, 0, 0), 0xFFAA11, 5);
drawLine(new Vector3D(100, 0, 0), new Vector3D(0, 100, 0), 0xFF00, 2);
drawLine(new Vector3D(-100, 0, 0), new Vector3D(-100, 150, 200), 0xFF0000, 5);


stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(Event.RESIZE, onResize);

}

private function onEnterFrame(e:Event):void
{

controller.update();
camera.render();
}

private function onResize(e:Event=null):void
{
camera.view.width=stage.stageWidth;
camera.view.height=stage.stageHeight;
}


//绘制3DLine的小技巧
public function drawLine(from:Vector3D, to:Vector3D, lineColor:int, lineWidth:Number):void
{

var line:Mesh=new Mesh();

var v1:Vertex=line.addVertex(from.x, from.y, from.z);
var v2:Vertex=line.addVertex(to.x, to.y, to.z);
//根据第二个Vertex设置一个在Z轴上偏移量极小的Vertex,使得三角形视觉上变形为直线
var v3:Vertex=line.addVertex(to.x, to.y, to.z + 1e-9);

line.addFace(Vector.<Vertex>([v1, v2, v3]), new FillMaterial(lineColor, 1, lineWidth, lineColor));
line.addFace(Vector.<Vertex>([v3, v2, v1]), new FillMaterial(lineColor, 1, lineWidth, lineColor));

//需要调用mesh的calculateNormals来计算Normal方向,否则无法绘制成功
line.calculateNormals(true);

rootContainer.addChild(line);
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值