Flash3D学习计划(三)——学习VB,IB相关,理解三角形顶点顺序;在屏幕上显示2D矩形,并实现缩放,平移,旋转
VB:顶点缓冲
IB: 顶点索引缓冲
三角形的顶点顺序决定了三角形是顺时针还是逆时针,从而决定了三角形在背面剔除的过程中是否会被剔除掉。
相关理论知识可以在前面的文章中找到更多的说明。
实现效果
主要代码
- 1 package
- 2 {
- 3 import com.adobe.utils.AGALMiniAssembler;
- 4 import com.adobe.utils.PerspectiveMatrix3D;
- 5
- 6 import flash.display.Sprite;
- 7 import flash.display.Stage3D;
- 8 import flash.display3D.Context3D;
- 9 import flash.display3D.Context3DProgramType;
- 10 import flash.display3D.Context3DVertexBufferFormat;
- 11 import flash.display3D.IndexBuffer3D;
- 12 import flash.display3D.Program3D;
- 13 import flash.display3D.VertexBuffer3D;
- 14 import flash.events.Event;
- 15 import flash.geom.Matrix3D;
- 16 import flash.geom.Vector3D;
- 17
- 18 /**
- 19 * @author smartqi
- 20 * @E-mail:
- 21 * 创建时间:2013-6-29 上午9:36:36
- 22 *
- 23 */
- 24 public class RectangleTest extends Sprite
- 25 {
- 26
- 27 private var context:Context3D;
- 28 private var vertexBuff:VertexBuffer3D;
- 29 private var indexBuff:IndexBuffer3D;
- 30 private var vertexData:Vector.<Number>;
- 31 private var indexData:Vector.<uint>;
- 32 private var shaderProgram:Program3D;
- 33 private var perspectiveMatrix:PerspectiveMatrix3D;
- 34 private var i:int;
- 35 private var sign:int = 1;
- 36 private const angleGap:Number = 20;
- 37 private var angle:Number = 0;
- 38 private var modelMatrix:Matrix3D;
- 39 private var viewMatrix:Matrix3D;
- 40 private var finalMatrix:Matrix3D;
- 41
- 42
- 43 public function RectangleTest()
- 44 {
- 45 var stage3d:Stage3D = stage.stage3Ds[0];
- 46 stage3d.addEventListener(Event.CONTEXT3D_CREATE,onContextCreate);
- 47 stage3d.requestContext3D();
- 48 }
- 49
- 50 private function onContextCreate(e:Event):void{
- 51 context = (e.target as Stage3D).context3D;
- 52 if(context == null) return;
- 53 context.enableErrorChecking = true; //允许进行错误检测,release版本应设置
- 54 context.configureBackBuffer(500,500,0); //设置显示区域的大小
- 55 setupVertexBuff(); //设置顶点缓冲
- 56 setupShaderProgram(); //设置shander
- 57 setupPerspectiveMatrix(); //设置投影矩阵
- 58 initMatrix();
- 59 addEventListener(Event.ENTER_FRAME,onEnterFrame);
- 60 }
- 61
- 62 private function setupVertexBuff():void{
- 63 vertexData = Vector.<Number>([
- 64 // x y z r g b
- 65 40, 40, -40, 1, 0, 0,
- 66 40, -40, -40, 0, 1, 0,
- 67 -40, -40, -40, 0, 0, 1,
- 68 -40, 40, -40, 1, 1, 1,
- 69 ]);
- 70
- 71 indexData = Vector.<uint>([0,1,2,0,2,3]);
- 72 vertexBuff = context.createVertexBuffer(4,vertexData.length/4);
- 73 vertexBuff.uploadFromVector(vertexData,0,4);
- 74 indexBuff = context.createIndexBuffer(6);
- 75 indexBuff.uploadFromVector(indexData,0,6);
- 76 context.setVertexBufferAt(0,vertexBuff,0,Context3DVertexBufferFormat.FLOAT_3);
- 77 context.setVertexBufferAt(1,vertexBuff,3,Context3DVertexBufferFormat.FLOAT_3);
- 78 }
- 79
- 80 private function setupShaderProgram():void{
- 81 var vertexProgram:AGALMiniAssembler = new AGALMiniAssembler();
- 82 vertexProgram.assemble(Context3DProgramType.VERTEX,
- 83 "m44 op,va0,vc0\n" +
- 84 "mov v1,va1\n");
- 85 var fragmentProgram:AGALMiniAssembler = new AGALMiniAssembler();
- 86 fragmentProgram.assemble(Context3DProgramType.FRAGMENT,
- 87 "mov oc,v1");
- 88 shaderProgram = context.createProgram();
- 89 shaderProgram.upload(vertexProgram.agalcode,fragmentProgram.agalcode);
- 90 context.setProgram(shaderProgram);
- 91 }
- 92
- 93 private function setupPerspectiveMatrix():void{
- 94 perspectiveMatrix = new PerspectiveMatrix3D();
- 95 perspectiveMatrix.perspectiveFieldOfViewRH(Math.PI*90/180,1,1,1000); //注意这里的角度使用的是弧度
- 96 }
- 97
- 98 private function initMatrix():void{
- 99 modelMatrix = new Matrix3D();
- 100 viewMatrix = new Matrix3D();
- 101 finalMatrix = new Matrix3D();
- 102 }
- 103
- 104 private function onEnterFrame(e:Event):void{
- 105 context.clear(0,0,0);
- 106 angle += angleGap;
- 107 modelMatrix.identity();
- 108 modelMatrix.prependRotation(angle,Vector3D.Z_AXIS); //绕着Z轴旋转物体,注意这里的角度使用的是角度
- 109 if(i>30){
- 110 sign = -1;
- 111 }
- 112 if(i<0){
- 113 sign = 1;
- 114 }
- 115 i += sign;
- 116 viewMatrix.identity();
- 117 viewMatrix.prependTranslation(0,0,-30 + i); //将相机向后移,使物体看起来变小了,将相机向前移,使物体看起来变大
- 118 finalMatrix.identity();
- 119 finalMatrix.append(modelMatrix);
- 120 finalMatrix.append(viewMatrix);
- 121 finalMatrix.append(perspectiveMatrix);
- 122 context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX,0,finalMatrix,true); //上传最终的顶点转换矩阵,注意这里最后一个参数为true
- 123 context.drawTriangles(indexBuff,0,2);
- 124 context.present();
- 125 }
- 126 }
- 127 }
Flash3D学习计划(三)——学习VB,IB相关,理解三角形顶点顺序;在屏幕上显示2D矩形,并实现缩放,平移,旋转的更多相关文章
- MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点
1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...
- Docker学习计划三:Dockerfile 使用
我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容 首先通过一张图来了解 Docker 镜像 ...
- Python学习日记(三) 学习使用dict
数据按类型可划分为: 不可变数据类型(可哈希):元祖.string.int.bool 可变数据类型(不可哈希):dict.list 集合本身是可变数据类型,元素是不可变数据类型 字典中的key必须是不 ...
- ProgressDialog(三)——代号为中心的屏幕上显示ProgressDialog(ProgressBar)
MainActivity如下面: package cc.testprogressdialog; import android.os.Bundle; import android.view.Gravit ...
- Flash 3D学习计划
1.理解并记住3D渲染的一般管线流程(一天). 2.理解世界,取景,投影变换,并理解投影坐标系(一天). 3.学习VB,IB相关,理解三角形顶点顺序:在屏幕上显示2D矩形,并实现缩放,平移,旋转(三天 ...
- IOS学习计划
自从接触了IOS后,都没有像样的写过一篇博客去总结这近三个月来对IOS开发的了解.今天,趁着有那么一点的时间,写一下接下来的学习计划和学习路线,以便于自己今后接下来的时间可以更有方向感,更有效率的去学 ...
- Socket 学习(三).4 UDP 穿透 客户端与客户端连接
效果图: 使用方法: 先 修改WinClient\bin\Debug 下面的 ip.ini,写上 服务器 IP地址. 客户端 与 客户端 通讯 之前 ,点击发送打洞消息 按钮,然后过一会再发送消息 ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-中
3.2 例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...
- vim(vi)下的三种模式及其相关命令
vim(vi)下的三种模式1.命令行模式 2.末行模式 3.插入模式 三种模式的联系及其相互转换 在我们输入vi命令进入编写程序的页面后,我们看到的是命令行模式,在我们输入“a”.“i”.“o”.“O ...
随机推荐
- mac虚拟机上(centos系统)设置联网第二种方式
这种方式简单,不容易出错,用的桥接的方式. 这样的安装的centos会得到ip地址 然后编辑一下网卡配置,使其变为静态得ip 输入命令 # vi /etc/sysconfig/network-scri ...
- Python网络编程(OSI模型、网络协议、TCP)
前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...
- Python全栈工程师(异常(基础))
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 补充:包的相对导入 只对后两种导入方式有用 ...
- java单例模式(类只能创建唯一对象)
//饿汉式 class Single { private static final Single s= new Single(); private Single(){} public static S ...
- JavaScript里面的正则以及eval
1.eval JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值. eval() EvalError 执行字符串中的JavaScript代码 ...
- Android记事本06
昨天: activity的生命周期 今天: activity横竖屏切换的生命周期 遇到的问题: 为了匹配ADK,下载了更旧的版本SDK,布局文件仍然无法显示.
- nyoj 题目 孪生素数问题
孪生素数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再 ...
- B - Help Jimmy
B - Help Jimmy Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem ...
- 获取JNDI数据源
1 在容器中配置数据源 Tomcat <?xml version="1.0" encoding="UTF-8"?> <Context> ...
- Jquery不同版本共用的解决方案(插件编写)
最近在为某公司做企业内部UI库,经过研究分析和评审,决定基于Jquery开发,结合Bootstrap插件那简洁,优雅,高效的思想进行插件编写. 但是在编写的过程中遇到一个头疼的问题,就是正在编写的插件 ...