【贝武易科技专业flex3D开发--www.newflash3d.com】
十分感谢kirupa.com的贡献
我们是在flex下建立三维效果,如下图
主程序代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="init();" width="400" height="400">
<mx:Canvas id="canvas3d" width="300" height="300" x="200" y="200"></mx:Canvas>
<mx:Script>
<![CDATA[
import hjh3dcom.Object3d;
import flash.display.Sprite;
import hjh3dcom.*;
private var container:Sprite;
private var point:Object3d;
private var pointIn2D:Object;
private var pointsArray:Array;//三维的点集
private var screenPoints:Array;//平面投影的点集
private var thisPoint:Object3d;
//基本的元素
//焦距
private var FocalLength:Number;
//方向
private var direction:String;
//速度
private var speed:Number;
//缩放比例
private var scaleRatio:Number;
private function init():void{
FocalLength=200;
direction="left";
speed=5;
container=new Sprite;
canvas3d.rawChildren.addChild(container);
//下面这个数组为Object3d物体集合;
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)
];
container.addEventListener(Event.ENTER_FRAME,backAndForthAndSideToSide);
};
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类的物体,这个物体我们给它定义了三个三维坐标属性;
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;
}
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);
}
]]>
</mx:Script>
</mx:Application>
再加一个自定义3D物体的扩展类Object3d.as,代码如下:
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;
}
}
}
我们会在下面的文章里进一步做分析,请关注。
【贝武易科技专业flex3D开发--www.newflash3d.com】
- 大小: 246.7 KB
分享到:
相关推荐
3dmax插件神器-003-线框图.mse
建模是创建3D形状的基础,可以使用各种方法,如多边形建模(使用顶点、边和面构建形状)、曲线建模(基于数学曲线定义形状)和扫描建模(从真实世界物体扫描得到3D数据)。 VTK在3D建模和可视化中的作用主要体现在...
Wires - Mobile 线框图套件AdobeXD源码下载设计素材UI设计
Wires - Web线框图套件AdobeXD源码下载设计素材UI设计
3DMAX 将根据设置的参数和模型,生成线框动画。 5. 后期处理:渲染完成后,需要对线框动画进行后期处理,例如添加背景、特效、音频等。 在了解了 3DMAX 渲染线框动画的技术细节后,让我们来看一下 3ds Max 插件教程...
电子功用-基于线框电极进行电火花套料加工的方法是一种高效的金属切削工艺,尤其适用于精密模具制造和复杂形状零件的加工。电火花加工(Electrical Discharge Machining,简称EDM)是利用电流脉冲在工具电极与工件...
获取食物() Kris、Koko、Kritika、Rodrigo、Zac '减少食物浪费的人' 数字线框: : 部署了?! (cheeeeeeers Kris!): ://getfoodeda.herokuapp.com/ // ------------------------------------------------ // -...
总的来说,3DMAX的一键渲染线框图插件是一个实用的工具,结合了MaxScript的强大与3DMAX的灵活性,为用户提供了一种高效快捷的方式来生成线框图。无论是进行项目演示、设计讨论还是教学学习,它都是一种不可或缺的...
html-to-wireframe被创建为一种易于使用的工具,可以从本地或远程html文件生成线框,以进行类似于Facebook的操作,以便用户可以在加载整个页面之前查看应用程序的结构。 该工具基于: Wirify书签-> PhantomJS-> ...
如何在Linux上运行Balsamiq线框有关如何使用Wine和Lutris在Linux上运行Balsamiq线框的说明。前提条件一个主流Linux发行版(Ubuntu / Debian / Fedora / Mint),其中包含curl , wine和wine32 。 lutris -Lutris使...
Flash Catalyst CS5.5 提供了一个“公用库”面板,包含基于Spark的Flex组件和专为线框设计的占位符组件,帮助设计师快速构建界面。此外,它可以与Photoshop和Illustrator进行资源的往返传输,允许在设计过程中随时...
- F3:切换线框/光滑+高亮显示模式 - F4:打开/关闭动画模式 - F5:打开/关闭几何体的边/顶点/面的显示模式 - F6:打开/关闭旋转视图模式 - F7:打开/关闭缩放视图模式 - F8:打开/关闭平移视图模式 在物体选择与...
项目成本 ProjectCost 是一种工具,可帮助签约人员根据历史定价信息估算合同的每小时人工... Balsamiq——线框图工具 Adobe Fireworks -- 高保真模型 Flask -- Python 应用服务器 AngularJS -- Javascript 网络框架 Twi
该项目是使用生成的。 :magnifying_glass_tilted_right: Nx是用于Monorepos的一组可扩展开发工具。 向您的工作区添加功能 Nx支持许多插件,这些插件添加了用于开发不同类型的应用程序和不同工具的功能。 这些功能...
在计算机图形学领域,立方体线框模型是一种基础的3D表示方法,它通过一系列直线段来描绘立方体的边框,通常用于教学和早期的3D渲染。透视投影则是模拟人眼观察真实世界的方式,使得远离观察者的物体显得更小,从而...
- 原型设计和线框图工具 - 制图工具 - 应用程序框架工具 - 数据可视化工具 - 图形工具(SVG、Canvas、WebGL) - 前端数据存储工具 - HTTP/网络工具 - 代码编辑工具 - HTML/CSS/JavaScript工具 - 静态网页...
"数字绘"就是这样一款专注于在线线框图、流程图、网络图、组织结构图、UML及BPMN绘制的专业网站,它为用户提供了一个集设计、编辑和分享于一体的综合平台。 首先,我们要了解线框图。线框图是一种视觉设计工具,...
《3D-DOCTOR:绿色建模工具在.NET开发中的应用》 3D-DOCTOR是一款备受瞩目的绿色建模工具,尤其对于那些在.NET开发环境中处理三维图形的程序员而言,它提供了一种高效且易用的解决方案。该工具以其绿色、轻量级的...
掌厅登陆之周末有礼-转盘抽奖-线框图-20141210.jpg
-Wirefame-绘制游戏外观-包括图片-或使用线框工具-用户故事-措辞应围绕用户与游戏互动的方式注意:-项目说明-使用的技术-采用的方法-安装说明-未解决的问题-其他组件? README文件示例: : 一般提示:-分解成较小的...