返回顶部
首页 > 资讯 > 后端开发 > Python >AS3 2D转3D【算法】
  • 398
分享到

AS3 2D转3D【算法】

算法 2023-01-31 07:01:58 398人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

FLASH只是有二维的坐标.怎么把三维坐标转换成二维坐标: (一).公式     给定点:(x,y,z)    绕x轴旋转后的点(x1,y1,z1)    绕y轴旋转后的点(x2,y2,z2)    绕z轴旋转后的点(x3,y3,z3)  

FLASH只是有二维的坐标.怎么把三维坐标转换成二维坐标:
(一).公式
    给定点:(x,y,z)
    绕x轴旋转后的点(x1,y1,z1)
    绕y轴旋转后的点(x2,y2,z2)
    绕z轴旋转后的点(x3,y3,z3)
 1.x旋转(x不变):
 x1=x
 y1=y*cosb+z*sinb
 z1=z*cosb-y*sinb
    2.y旋转(y不变):
 x2=x*cosb-z*sinb
 y2=y
 z2=z*cosb+x*sinb
    3.z旋转(z不变)
    x3=x*cosb-y*sinb
 y3=y*cosb+x*sinb
 z3=z
 
(二).原理分析
1.三角形定理:
如上图,已知一个点(x,y,z),利用三角形相似的原理,可以得出下列结论:
  d/(d+z)=y1/y,推出:y1=d*y/(d+z),可在二维平面上来表现空间上的点的位置。进一步把它简化。提出因子d/(d+z),用ratio(比率)表示,这个公式就变为
  ratio=d/(d+z);
  y1=ratio*y;同理可推出
  x1=ratio*x;
 
2.flash模拟3D坐标:
如上图,z轴表示一个物体离屏幕的远近,当物体的z轴位置增加时,物体朝远离屏幕的方向运动,当物体的z值减小时,物体朝接近屏幕的方向运动。在三维坐标中,当z值增大,也就是远离屏幕时,物体应越小,反之越大。我们可以用上面的ratio,当z增加时,ratio减少,因为在ratio中,z是作为分母的。反之,当z减少时,ratio增加。所以可用ratio来控制mc的大小。z值最大,物体应在最底层,最小,在最上层。
 
3.公式推导:
旋转有三种,x旋转:坐标x不变,y旋转:y不变,z旋转:z不变,我们先来推导z旋转。如上图:从点(x,y,0)转到(x1.y1.0),求点(x1.y1.0)
利用数学中的正弦、余弦公式得出
  x1=r*cos(a+b),而cos(a+b)=sina*cosb+cosa*sinb
  推出:x1=r(cosa*cosb-sina*sinb)
  又因为x=r*cosa,y=r*sina
  所以x1=x*cosb-y*sinb
  同样推出:y1=y*cosb+x*sinb
  这就是z旋转的公式。用同样的方法可推出x旋转,y旋转的公式。总结如下:
给定点:(x,y,z)
绕x轴旋转后的点(x1,y1,z1)
绕y轴旋转后的点(x2,y2,z2)
绕z轴旋转后的点(x3,y3,z3)
 x旋转(x不变)
 x1=x
 y1=y*cosb-z*sinb
 z1=z*cosb+y*sinb
注:是先加后减,因为FLASH里的Y轴是反的,箭头向下的。 即:
 y1=y*cosb+z*sinb
 z1=z*cosb-y*sinb
 
同理推出:
 y旋转(y不变)
 x2=x*cosb-z*sinb
 y2=y
 z2=z*cosb+x*sinb

 z旋转(z不变)
 x3=x*cosb-y*sinb
 y3=y*cosb+x*sinb
 z3=z
  从以上公式可看出,在flash要实现旋转,先要求x轴的旋转点,再求y轴的旋转点,最后再求出z轴的旋转点。
 
(三).实例应用
最后我们来一个y旋转的AS3应用(复制代码到时间轴即可)
// 全局变量
var mcNums:Number=3;
var mcArr:Array = new Array();
var rocArr_x:Array=new Array(100,-100,0);
var rocArr_y:Array=new Array(0,10,0);
var rocArr_z:Array=new Array(-100,0,0);
var hutu:Number=0.001;// 控制旋转的速度
var jiaodu:Number=hutu*180/Math.PI;
var distance:int=1000;

initConfig();

//初始化
function initConfig():void {
  for (var i=1; i<=mcNums; i++) {
    var t:MovieClip=doDrawRoundRect(); 
    //t.angle = i * ((Math.PI*2)/mcNums);
    this.addChild(t);
    mcArr.push( t );
  }
  addEventListener(Event.ENTER_FRAME, EnterFrame);
}

//刷频
function EnterFrame(e:Event) {
  for (var i = 0; i<mcNums; i++) {
    // 按公式计算
    var x1=rocArr_x[i]*Math.cos(jiaodu)-rocArr_z[i]*Math.sin(jiaodu);
    var y1=rocArr_y[i];
    var z1=rocArr_z[i]*Math.cos(jiaodu)+rocArr_x[i]*Math.sin(jiaodu);
    //赋值
    rocArr_x[i]=x1;
    rocArr_y[i]=y1;
    rocArr_z[i]=z1;
    // 更新数组元素
    var ratio:Number = distance/(distance+z1);
    var perspective_x=x1*ratio;
    var perspective_y=y1*ratio;
    var perspective_z=z1*ratio;
    // 赋值X Y坐标 
    mcArr[i].x=stage.stageWidth/2+perspective_x;
    mcArr[i].y=stage.stageHeight/2-perspective_y;
    // mc的大小
    mcArr[i].scaleX=mcArr[i].scaleY=80*ratio/100;
    mcArr[i].alpha=50*ratio
    // mc的层次
    this.setChildIndex(mcArr[i],ratio);
  }
}

//产生随机颜色的矩形影片
function doDrawRoundRect():MovieClip {
  var size:uint=80;
  var bGColor:uint=Math.random()*0xffffff;
  var borderColor:uint=0x666666;
  var borderSize:uint=0;
  var cornerRadius:uint=9;
  var gutter:uint=5;
  var child:MovieClip = new MovieClip();
  child.graphics.beginFill(bgColor);
  child.graphics.lineStyle(borderSize, borderColor);
  child.graphics.drawRoundRect(0, 0, size, size, cornerRadius);
  child.graphics.endFill();
  return child;
}

 
 

--结束END--

本文标题: AS3 2D转3D【算法】

本文链接: https://lsjlt.com/news/191895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • AS3 2D转3D【算法】
    FLASH只是有二维的坐标.怎么把三维坐标转换成二维坐标: (一).公式     给定点:(x,y,z)    绕x轴旋转后的点(x1,y1,z1)    绕y轴旋转后的点(x2,y2,z2)    绕z轴旋转后的点(x3,y3,z3)  ...
    99+
    2023-01-31
    算法
  • css中2D/3D转换属性有哪些
    这篇文章主要为大家展示了“css中2D/3D转换属性有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css中2D/3D转换属性有哪些”这篇文章吧。 ...
    99+
    2024-04-02
  • AS3 角度算法与实现
    学习as3制作动画的时候发现一个好例子,箭头指向鼠标方向很有意思跟大家分享一下,都很简单的例子,箭头实体类代码如下 package {   import flash.display.Sprite;   public class Arrow...
    99+
    2023-01-31
    算法 角度
  • AS3 斜坡角度反弹【算法】
    1.公式 坐标旋转: x1 = Math.cos(angle) * x - Math.sin(angle) * y; y1 = Math.cos(angle) * y + Math.sin(angle) * x; 反坐标旋转: x1 =...
    99+
    2023-01-31
    斜坡 算法 角度
  • CSS3的3D转换方法是什么
    这篇文章主要介绍了CSS3的3D转换方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS3的3D转换方法是什么文章都会有所收获,下面我们一起来看看吧。  ...
    99+
    2024-04-02
  • CSS样式更改之2D转换的方法有哪些
    本篇内容介绍了“CSS样式更改之2D转换的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!2D转换...
    99+
    2024-04-02
  • Android编程实现3D滑动旋转效果的方法
    本文实例讲述了Android编程实现3D滑动旋转效果的方法。分享给大家供大家参考,具体如下: 这里我们通过代码实现一些滑动翻页的动画效果。 Animation实现动画有两个方式...
    99+
    2022-06-06
    方法 3d Android
  • C#算法之整数反转
    题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出:...
    99+
    2024-04-02
  • Go 小时转换算法未正确转换
    php小编新一今天要给大家介绍的是Go语言中的一个问题,即“Go 小时转换算法未正确转换”。在Go语言中,时间转换是一个常见的操作,但是在某些情况下,小时转换的结果可能会出现错误。本文...
    99+
    2024-02-14
    go语言
  • 详解Matlab绘制3D玫瑰花的方法(内附旋转版本)
    目录1.玫瑰花绘制绘制效果完整代码2.月季花绘制绘制效果完整代码3.玫瑰配色4.旋转版本1.玫瑰花绘制 绘制效果 完整代码 function drawrose grid on [x...
    99+
    2024-04-02
  • python反转单链表算法题
    现在算法是大厂面试的必考题,而且越来越难,已经不是简单的列表,字符串操作了,会涉及到各种数据结结构。单链表的反转也是经常考的一道题,里面故在此记录一下。 1.链表的特点: 顺序存储元...
    99+
    2024-04-02
  • C#算法之罗马数字转整数
    罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I ...
    99+
    2024-04-02
  • Java排序算法速度比较(转载)
    public class Sort { public void swap(int a[], int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } p...
    99+
    2023-06-03
  • Python3实现旋转数组的3种算法
    下面是python3实现的旋转数组的3种算法。一、题目给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。例如:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步:...
    99+
    2023-01-31
    数组 算法
  • 深入理解PHP数组反转的算法
    php 数组反转有两种方法:array_reverse() 函数:直接修改数组,时间复杂度 o(n)。手动反转方法:创建新数组存储反转元素,时间复杂度 o(n),可自定义操作。...
    99+
    2024-04-28
    php 数组反转
  • 十进制与BCD码转换的算法详解
    目录BCD码算法原理总结手头上在做的项目需要用到ds1302实时时钟,ds1302读出来的数据是BCD码,需要转换,写入也是。 BCD码 BCD是指用二进制来表示十进制数的编码,即用...
    99+
    2024-04-02
  • 示例解析php的大转盘概率算法
    随着电商、营销活动的火热开展,各种打折、赠送活动越来越多,其中大转盘是一种非常受欢迎的赠送方式。然而,如果大家没有进行详细的概率算法,就有可能会导致奖品的概率失衡,甚至被玩家利用漏洞。而对于php大转盘的概率算法,更是需要我们深入研究。首先...
    99+
    2023-05-14
  • js算法实例之字母大小写转换
    题目:输入字符串将大写转换成小写,小写转换成大写? <strong>js字母大小写转换方法:1、转换成大写:toUpperCase()2、转换成小写:toLowerCas...
    99+
    2022-12-26
    js字母大小写转换自定义方法 实现大小写转换的代码 js大写字母转小写
  • 如何通过纯CSS实现图片的3D立体旋转效果的方法和技巧
    如何通过纯CSS实现图片的3D立体旋转效果的方法和技巧,需要具体代码示例随着Web技术的发展,我们可以通过CSS实现各种令人惊叹的效果,其中包括图片的3D立体旋转效果。本文将介绍如何通过纯CSS实现这样的效果,并提供具体的代码示例,帮助读者...
    99+
    2023-10-24
    图片 旋转 纯CSS
  • php十进制转八进制的算法是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php十进制转八进制的算法是什么decoct() 函数把十进制数转换为八进制数。如需把八进制转换为十进制,可以利用octdec() 函数。语法decoc&#...
    99+
    2021-10-01
    PHP
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作