`
hereson
  • 浏览: 1451192 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Papervision Perspective Line material

    博客分类:
  • Pv3d
阅读更多
// 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

    "Material"定义了物体表面的颜色和光泽;而"Camera"则负责调整观察者的视角,提供不同的视觉效果。此外,"Light"对象用于模拟光照,为场景增添真实感。 关于文件名列表中的"PaperVision3D",这可能是一个包含完整...

    Papervision3D.Essentials

    ### Papervision3D.Essentials - 关键知识点解析 #### 一、Papervision3D概述 - **定义**: Papervision3D是一种强大的实时3D引擎,专为Flash设计。它能够将外部创建的3D模型渲染成Flash内容,无需终端用户下载或...

    Papervision3D的API

    《Papervision3D API详解》 Papervision3D(PV3D)是Flash平台上的一款强大的3D图形库,它允许开发者在网页上创建丰富的、交互式的三维图形和应用程序。本篇文章将深入探讨Papervision3D的API,帮助读者理解并掌握...

    Papervision3D 教程打包下载

    Papervision3D 是一个基于ActionScript 3.0的开源库,专门用于在Adobe Flash平台上构建三维(3D)图形和交互式应用程序。这个教程集合提供了深入学习Papervision3D所需的知识,包括PV3D的基本概念、对象模型、渲染...

    Papervision3D

    - **Material**: 表示对象表面特性的材质,如颜色、纹理和光照效果。 2. **关键组件** - **Loader**: 负责加载3D模型和其他资源。 - **Matrix3D**: 处理3D变换,如旋转、缩放和平移。 - **Light**: 灯光系统,...

    papervision3D

    Papervision3D是基于Adobe Flash和Flex平台的一个强大的三维(3D)图形渲染引擎。这个技术允许开发者在Web浏览器中创建出丰富的、交互式的3D场景,为用户提供了一种全新的网页体验。该框架利用ActionScript 3.0语言...

    初识Papervision3D

    《初识Papervision3D》 在深入探讨Papervision3D之前,我们首先需要理解3D技术在Web开发中的应用。随着互联网技术的快速发展,网页体验已不再局限于二维平面,用户对交互性和视觉效果的需求日益增长。Papervision3D...

    Papervision3D.swc

    Papervision3D_2.0.869.swc

    Papervision3DEssentials.pdf

    《Papervision3D Essentials》是一本专为希望深入理解和掌握Papervision3D技术的开发者编写的书籍。该书由Jeff Winder和Paul Tondeur共同编写,于2009年7月由Packt Publishing出版,旨在帮助读者创建具有惊人效果和...

    Papervision3D-demo.rar_DEMO_Papervision3D demo_Papervision3D mxm

    - **核心组件**:包括Camera、Scene、Scene3D、Loader、Material等,它们共同构成了3D场景的基础结构。 2. **实例解析** - **实例1:基础3D对象**:展示如何创建、旋转和移动基本3D几何形状,如立方体、球体等,...

    papervision3d_868.swc

    《PaperVision3D SDK在Flex环境中的应用与实践》 PaperVision3D(简称PV3D)是一款基于Adobe Flex和ActionScript 3.0的开源3D图形库,它为Web开发者提供了在Flash Player环境中构建三维图形和交互式应用程序的能力...

    Papervision3D_2.1.932.swc

    Papervision3D_2.1.932.swcPapervision3D_2.1.932.swcPapervision3D_2.1.932.swc

    《Papervision3D+Essentials》中文翻译

    - **材质(Material)**:定义物体表面的外观,如颜色、反射、透明度等。 - **纹理(Texture)**:贴在3D物体表面的图像,增加真实感。 - **光照(Light)**:影响场景中物体的亮度和阴影,提供立体感。 3. **...

    papervision3D学习资料

    - **Material and Textures**: 材质(Material)定义了物体表面的视觉特性,而纹理(Texture)则可以将图像贴在物体表面上,增加视觉细节。 - **Lighting**: PV3D支持各种类型的光源,如点光源、聚光灯和环境光,...

    papervision3d 精髓

    《Papervision3D精髓》一书是针对初学者及有一定基础的开发者设计的,旨在教授如何使用Papervision3D(PV3D)创建具有惊人效果和强大动画功能的交互式3D应用程序。PV3D是一种开源的3D引擎,用于Adobe Flash平台,它...

    Papervision3D Essentials 源码

    4. **材质与纹理**:Material和Texture类是定义物体表面特性的关键,包括颜色、反射、透明度等。通过它们,可以给3D对象赋予丰富多彩的外观。 5. **灯光系统**:Light类提供了各种类型的灯光,如点光源、平行光等,...

Global site tag (gtag.js) - Google Analytics