// Perspective Line material for PV3D
// Author : Seb Lee-Delisle
// Blog : www.sebleedelisle.com
// Company : www.pluginmedia.net
// Date : 25th March 2008
//
// This work is licensed under a Creative Commons 2.0 License.
// Full details at
// http://creativecommons.org/licenses/by/2.0/uk/
// You may re-use this code as you wish, but a credit would be
// appreciated. And I'd love to see what you do with it!
// mail me : sebleedelisle@gmail.com
// NB!!! THIS CODE WILL ONLY WORK WITH THE CURRENT BUILDS OF GW AND
// EFFECTS BRANCHES IN PV3D AND WILL VERY LIKELY BREAK VERY SOON!
package net.pluginmedia.pv3d.materials.special
{
import org.papervision3d.materials.special.LineMaterial;
import org.papervision3d.core.geom.renderables.Vertex3DInstance;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.core.math.Number2D;
import flash.display.Graphics;
import org.papervision3d.core.geom.renderables.Line3D;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.core.render.data.RenderSessionData;
import org.papervision3d.core.render.draw.ILineDrawer;
public class LineMaterial3D extends LineMaterial implements ILineDrawer
{
private var vertex1 : Number2D = new Number2D();
private var vertex2 : Number2D = new Number2D();
private var p1 : Number2D = new Number2D();
private var p2 : Number2D = new Number2D();
private var p3 : Number2D = new Number2D();
private var p4 : Number2D = new Number2D();
private var lineVector : Number2D = new Number2D();
private var spur : Number2D = new Number2D();
public function LineMaterial3D(color:Number = 0xFF0000, alpha:Number = 1)
{
super(color, alpha);
}
override public function drawLine(line:Line3D, graphics:Graphics, renderSessionData:RenderSessionData):void
{
var fz:Number = (renderSessionData.camera.focus*renderSessionData.camera.zoom);
var radius1:Number = fz / (renderSessionData.camera.focus + line.v0.vertex3DInstance.z) * line.size;
var radius2:Number = fz / (renderSessionData.camera.focus + line.v1.vertex3DInstance.z) * line.size;
graphics.lineStyle();
drawLine3D(graphics, line.v0.vertex3DInstance, line.v1.vertex3DInstance, radius1, radius2);
graphics.moveTo(0,0);
}
function drawLine3D(graphics : Graphics, v1:Vertex3DInstance, v2:Vertex3DInstance, radius1:Number, radius2:Number) : void
{
vertex1.reset(v1.x, v1.y);
vertex2.reset(v2.x, v2.y);
// the vector from vertex2 to vertex1
lineVector.copyFrom(vertex1);
lineVector.minusEq(vertex2);
// the distance between points
var d : Number = lineVector.modulo;
// the angle of the spur from v1
var spurangle:Number = Math.acos( (radius2-radius1) / d) * Number3D.toDEGREES;
if(isNaN(spurangle)) spurangle = 0;
spur.copyFrom(lineVector);
spur.divideEq(d);
spur.rotate(spurangle);
// the first point in the polygon to draw
p1.copyFrom(vertex1);
spur.multiplyEq(radius1);
p1.plusEq(spur);
// now change the spur's length to that of radius2 and add to vertex2 to get the second polygon point
p2.copyFrom(vertex2);
spur.multiplyEq(radius2/radius1);
p2.plusEq(spur);
// now rotate the spur round to get the 3rd point
spur.rotate(spurangle*-2);
p3.copyFrom(vertex2);
p3.plusEq(spur);
// and now change the length back to radius1
spur.multiplyEq(radius1/radius2);
p4.copyFrom(vertex1);
p4.plusEq(spur);
graphics.lineStyle();
graphics.beginFill(lineColor, lineAlpha);
graphics.moveTo(vertex1.x, vertex1.y);
graphics.lineTo(p1.x, p1.y);
graphics.lineTo(p2.x, p2.y);
graphics.lineTo(vertex2.x, vertex2.y);
graphics.lineTo(p3.x, p3.y);
graphics.lineTo(p4.x, p4.y);
graphics.lineTo(vertex1.x, vertex1.y);
graphics.endFill();
graphics.beginFill(lineColor, lineAlpha);
graphics.drawCircle(vertex1.x, vertex1.y, radius1);
graphics.endFill();
graphics.beginFill(lineColor, lineAlpha);
graphics.drawCircle(vertex2.x, vertex2.y, radius2);
graphics.endFill();
}
}
}
分享到:
相关推荐
Papervision3D is a powerful real-time 3D engine for Flash. Papervision3D can take externally created 3D models and render them as Flash content, without requiring end-users to download or install an ...
Papervision3D是一个基于ActionScript的开源项目,目的在于实现更加炫丽美观、功能强大的Flash 3D Web应用程序。尤其是去年ActionScript 3发布了之后,ActionScript的效率得到了大幅度提升,基于此的Papervision3D...
Papervision3D_2.0.869.swc
Papervision3D 教程,pv3d,pv3d+Flex,pv3d中文帮助
例子来自于Flash3D研究所,超简易Papervision3D基础 Main.cs 小球加外部贴图 Main2.cs 物体的各种移动 (讲解移动/旋转/放大物体的方法) Main3.cs导入外部模型 (讲解如何从外部软件导入collada文件) Main4.cs pv...
Papervision3D Essentials 中文版 翻译 第一章 docx格式
Papervision3D_2.1.932.swcPapervision3D_2.1.932.swcPapervision3D_2.1.932.swc
Papervision3D的api,这个帮助文档介绍各种包的使用,有利于快速学习3D
papervision_phunky.swc 控件中包括很多3D动画效果,很好用
《Papervision3D+Essentials》中文翻译
整理了Papervision3d的各方面资料,并且提供一个全景代码案例!
papervision3d 精髓,入门者必备,最新版本
希望对学习PV3D引擎的人提供点帮助。这是一pv3D的api电子书
强烈呼吁大家上传实质性的东西,不能打开的文件就不是放到这里来,浪费下载者的表情!这东西找了好久才找到。老火得很哟
Papervision3D Essentials (PV3D)的中文版电子书及 书中实例源码下载 PV3D FLEX 三维渲染必备开源包
使用papervision3d引擎做的7个实例源码
一个不错的Flash 3D引擎Papervisio3D,让你的flash从2D转化3D不再是难事.最新版本as3
flash3d类文件!
FLASH,FLEX最新PV3D帮助文档,很简便,方便使用查询,单一文档。(英文版),英文比较好的下载,暂未翻译。