`

flex/flash 3d基础-生成线框箱体-思路分析(一)

阅读更多
接着上面的例子,我们分析一下设计的思路。
首先,我们假设存在一个三维坐标世界。
http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
基本思路:
1、假设三维坐标系存在;
2、构造三维坐标的点;
3、由三维的点构造二维的点(以三维的点作为参数);
4、根据二维的点绘制图形;

1、假设三维坐标系存在:
   我们把这个坐标系的基本物体构造为一个Object:
package hjh3dcom
{
	public class Object3d extends Object
	{
		private var _x3din:Number;
		private var _y3din:Number;
		private var _z3din:Number;
		
		public function Object3d()
		{
			super();
			init();
		}
		private function init():void{
			_x3din=0;
			_y3din=0;
			_z3din=0;
		}
        //----------------------------------------
		public function set x3d(x3din:Number):void
		{
			_x3din = x3din;	
		}
		public function get x3d():Number
		{
			return _x3din;	
		}
		//----------------------------------------
		public function set y3d(y3din:Number):void
		{
			_y3din = y3din;	
		}
		public function get y3d():Number
		{
			return _y3din;	
		}
		//----------------------------------------
		public function set z3d(z3din:Number):void
		{
			_z3din = z3din;	
		}
		public function get z3d():Number
		{
			return _z3din;	
		}
		
		
	}
}

这里为了区别与Flex本身的坐标特性,我们用了x3d、y3d、z3d来代替X、Y、Z,其实他们的意义是一样的,只不过是一个符合代表而已,你也可以规定为其他的形式。

他们具有三个坐标值:X、Y、Z
在这个坐标中存在一个点的集合,我们可以理解为点阵。

2、构造三维坐标的点;
我们用这个方法来生成点:
			private function MakeA3DPoint(x3d:Number,y3d:Number,z3d:Number):Object3d{
				point=new Object3d();
				point.x3d=x3d;
				point.y3d=y3d;
				point.z3d=z3d;
				return point;
			}//注意,这里函数返回的结果是一个point物体,它是属于Object3d类的物体,这个物体我们给它定义了三个三维坐标属性;

有一点需要注意的,这个点只是我们虚构想像的空中的点,它实际上是不存在的。
好,有了生产点的方法,那么我们就通过它来构成一个空间的点的集合,如果我们要构成一个方体,我们都知道方体有8个点顶,所以我们通过一个数组来存储这8个顶点,然后再对这些顶点进行运算操作。
生成点集合的数组:
				pointsArray = [
	                           MakeA3DPoint(-20, -40, -20), /* bottom half of box (low y value) */
	                           MakeA3DPoint(20, -40, -20),
	                           MakeA3DPoint(20, -40, 20),
	                           MakeA3DPoint(-20, -40, 20),
	                           MakeA3DPoint(-20, 80, -20), /* top half of box (high y value) */
	                           MakeA3DPoint(20, 80, -20),
	                           MakeA3DPoint(20, 80, 20),
	                           MakeA3DPoint(-20, 80, 20)
                               ];

它落实为空间的点为:



把三维的点转换到二维的点的方法:
			private function ConvertPointIn3DToPointIn2D(pointIn3D:Object3d, focalLength:Number):Object{
	            // make an object to act as the 2D point on the screen
	            pointIn2D = new Object();
	            // develop a scale ratio based on focal length and the
	            // z value of this point
	            scaleRatio = focalLength/(focalLength + pointIn3D.z3d);
	            // appropriately scale each x and y position of the 3D point based
	            // on the scale ratio to determine the point in 2D.
	            pointIn2D.x = pointIn3D.x3d * scaleRatio;
	            pointIn2D.y = pointIn3D.y3d * scaleRatio;
	            // return the new 2D point
	            return pointIn2D;
                }

在输入三维的点和定义好的焦距后,
只要执行ConvertPointIn3DToPointIn2D方法,就会获得一个二维点物体。

最后就是实现绘制物体了。
			private function backAndForthAndSideToSide(evt:Event):void{
				screenPoints=new Array();
	            for (var i=0; i<pointsArray.length; i++){
                    thisPoint = pointsArray[i];	
		            if (direction == "left"){
			            thisPoint.x3d -= speed;
			        // only check if this is the last point in pointsArray
			        if (i == pointsArray.length-1 && thisPoint.x3d <= -100) direction = "backward";
		            }else if (direction == "backward"){
			        thisPoint.z3d += speed;
			        // only check if this is the last point in pointsArray
			        if (i == pointsArray.length-1 && thisPoint.z3d >= 150) direction = "right";
		            }else if (direction == "right"){
			        thisPoint.x3d += speed;
			        // only check if this is the last point in pointsArray
			        if (i == pointsArray.length-1 && thisPoint.x3d >= 60) direction = "forward";
		            }else if (direction == "forward"){
			        thisPoint.z3d -= speed;
			        // only check if this is the last point in pointsArray
			        if (i == pointsArray.length-1 && thisPoint.z3d <= 0) direction = "left";
		            }
		
		           // now that the point has been moved, convert it
		           // and save it to the screenPoints array
		           screenPoints[i] = ConvertPointIn3DToPointIn2D(thisPoint, FocalLength);
		
		           // now that its a screen point, we can throw in
		           // the origin offset to center it on the screen
		           //screenPoints[i].x += Origin.x;
		           //screenPoints[i].y += Origin.y;
		           screenPoints[i].x ++;
		           screenPoints[i].y ++;
	               }// end of loop
	            container.graphics.clear(); // clear any previously drawn box
	            container.graphics.lineStyle(2,0xFF0000,100); // make the drawn lines to be red
	
	           // this part can be tedious since it maps out each line - wheeew
	           // this is where having drawn out the image on paper really helps
	           // you can always reference the pointsArray to figure out where
	           // your points are in 3D space so you know where to connect them
	
	           // top
	           container.graphics.moveTo(screenPoints[0].x, screenPoints[0].y);
	           container.graphics.lineTo(screenPoints[1].x, screenPoints[1].y);
	           container.graphics.lineTo(screenPoints[2].x, screenPoints[2].y);
	           container.graphics.lineTo(screenPoints[3].x, screenPoints[3].y);
	           container.graphics.lineTo(screenPoints[0].x, screenPoints[0].y);
	           // bottom
	           container.graphics.moveTo(screenPoints[4].x, screenPoints[4].y);
	           container.graphics.lineTo(screenPoints[5].x, screenPoints[5].y);
	           container.graphics.lineTo(screenPoints[6].x, screenPoints[6].y);
	           container.graphics.lineTo(screenPoints[7].x, screenPoints[7].y);
	           container.graphics.lineTo(screenPoints[4].x, screenPoints[4].y);
	           // connecting bottom and top
	           container.graphics.moveTo(screenPoints[0].x, screenPoints[0].y);
	           container.graphics.lineTo(screenPoints[4].x, screenPoints[4].y);
	           container.graphics.moveTo(screenPoints[1].x, screenPoints[1].y);
	           container.graphics.lineTo(screenPoints[5].x, screenPoints[5].y);
	           container.graphics.moveTo(screenPoints[2].x, screenPoints[2].y);
	           container.graphics.lineTo(screenPoints[6].x, screenPoints[6].y);
	           container.graphics.moveTo(screenPoints[3].x, screenPoints[3].y);
	           container.graphics.lineTo(screenPoints[7].x, screenPoints[7].y);
				}


backAndForthAndSideToSide方法是一个根据Flash的时间来绘制物体了。
  • 大小: 93.2 KB
分享到:
评论

相关推荐

    3dmax插件神器-003-线框图.mse

    3dmax插件神器-003-线框图.mse

    3D-example.zip

    在3D建模的世界里,"3D-example.zip"是一个包含与3D技术相关的资源的压缩包。这个压缩包可能包含示例项目、教程或代码,以帮助用户理解和应用3D建模技术。"vtk"全称为VTK,即Visualization Toolkit,是一个开源的,...

    3ds-max-插件教程3DMAX渲染线框动画

    3ds Max 插件教程 - 3DMAX 渲染线框动画 在本篇文章中,我们将详细介绍 3ds Max 插件教程,着重于 3DMAX 渲染线框动画的技术。首先,让我们了解什么是 3ds Max 和 3DMAX。 3ds Max 是 Autodesk 公司开发的一款三维...

    Wires - Mobile 线框图套件AdobeXD源码下载设计素材UI设计.xd

    Wires - Mobile 线框图套件AdobeXD源码下载设计素材UI设计

    Wires - Web线框图套件AdobeXD源码下载设计素材UI设计.xd

    Wires - Web线框图套件AdobeXD源码下载设计素材UI设计

    Web开发者欣喜若狂的40个UI设计工具和资源

    Lumzy是一款在线UI原型设计工具,允许设计师创建具备实际功能的交互原型,而不仅仅是静态的线框图。它支持原型测试,使得新想法在转化为完整网站前,就能够得到充分验证和优化。 **网址**:http://www.lumzy.com/ ...

    电子功用-基于线框电极进行电火花套料加工的方法

    电子功用-基于线框电极进行电火花套料加工的方法是一种高效的金属切削工艺,尤其适用于精密模具制造和复杂形状零件的加工。电火花加工(Electrical Discharge Machining,简称EDM)是利用电流脉冲在工具电极与工件...

    3DMAX一键渲染线框图插件下载

    总的来说,3DMAX的一键渲染线框图插件是一个实用的工具,结合了MaxScript的强大与3DMAX的灵活性,为用户提供了一种高效快捷的方式来生成线框图。无论是进行项目演示、设计讨论还是教学学习,它都是一种不可或缺的...

    getFood-:克里斯、可可、批判、罗德里戈、扎克

    获取食物() Kris、Koko、Kritika、Rodrigo、Zac '减少食物浪费的人' 数字线框: : 部署了?! (cheeeeeeers Kris!): ://getfoodeda.herokuapp.com/ // ------------------------------------------------ // -...

    图形学实验-立方体线框模型透视投影

    在计算机图形学领域,立方体线框模型是一种基础的3D表示方法,它通过一系列直线段来描绘立方体的边框,通常用于教学和早期的3D渲染。透视投影则是模拟人眼观察真实世界的方式,使得远离观察者的物体显得更小,从而...

    html-to-wireframe:从不同大小的url或html文件生成线框的工具

    html-to-wireframe被创建为一种易于使用的工具,可以从本地或远程html文件生成线框,以进行类似于Facebook的操作,以便用户可以在加载整个页面之前查看应用程序的结构。 该工具基于: Wirify书签-&gt; PhantomJS-&gt; ...

    理解全新的Flash-Catalyst-CS5.5和Flash-Builder-4.5工作流程.docx

    Flash Catalyst CS5.5 提供了一个“公用库”面板,包含基于Spark的Flex组件和专为线框设计的占位符组件,帮助设计师快速构建界面。此外,它可以与Photoshop和Illustrator进行资源的往返传输,允许在设计过程中随时...

    Python-一个单文件Python库用于生成SVG格式的3D线框

    在这个特定的场景中,我们关注的是一个专门用于生成SVG(Scalable Vector Graphics)格式3D线框的Python库。SVG是一种基于XML的矢量图像格式,它允许创建高质量、可缩放的图形,特别适合于网页和交互式应用程序。 ...

    balsamiq-wireframes-linux:有关如何在Linux上运行Balsamiq线框的说明

    如何在Linux上运行Balsamiq线框有关如何使用Wine和Lutris在Linux上运行Balsamiq线框的说明。前提条件一个主流Linux发行版(Ubuntu / Debian / Fedora / Mint),其中包含curl , wine和wine32 。 lutris -Lutris使...

    绿色建模工具3D-DOCTOR.rar

    3D-DOCTOR是一款备受瞩目的绿色建模工具,尤其对于那些在.NET开发环境中处理三维图形的程序员而言,它提供了一种高效且易用的解决方案。该工具以其绿色、轻量级的特性,避免了传统大型软件的繁琐安装过程,只需解压...

    3dsMax2009常用快捷键汇总.pdf

    3ds Max 2009是Autodesk公司开发的一款三维建模、动画和渲染软件。广泛应用于游戏设计、电影特效、建筑可视化等领域。本知识点整理将对文件中给出的3ds Max 2009常用快捷键进行汇总解读。 首先是视图和窗口操作的...

    3D物体的线框消隐^^

    总的来说,这个程序提供了一个基础的3D线框消隐框架,尽管还有待完善,但它展示了如何处理基本的3D图形渲染问题。对于初学者或开发者来说,深入研究这些代码可以加深对3D图形学的理解,为进一步的优化和扩展打下坚实...

    ProjectCost:ProjectCost 是一种工具,可帮助承包人员根据历史定价信息估算合同的每小时人工成本,并汇总此信息以得出总项目人工成本

    ProjectCost 是一种工具,可帮助签约人员根据历史定价信息估算合同的每小时人工成本,并汇总此信息以得出总项目人工成本。 网络资源 projects/ - 项目列表 projects/foo -- foo 项目 projects/foo/positions/ -- foo...

    front-end-handbook-2017(前端开发指南)

    本文档是一本详细的前端开发指南,涵盖了前端开发的多个方面,包括前端工程师的职责、技术、面试、薪资、工作流程、学习路径以及各种工具和技术趋势。为了深入理解前端开发的全貌,我们可以将知识点分为以下几类: ...

    html5-canvas-3d-line-avatar.zip

    3. **线框渲染**:从3D顶点生成线段,形成3D物体的边界。这通常涉及线段交叉检测,以避免产生多余的线条。 4. **变换**:包括平移、旋转和缩放,这些操作可以改变3D对象在视口中的位置和形状。 5. **光照和颜色**...

Global site tag (gtag.js) - Google Analytics