VB:顶点缓冲

IB: 顶点索引缓冲

三角形的顶点顺序决定了三角形是顺时针还是逆时针,从而决定了三角形在背面剔除的过程中是否会被剔除掉。

相关理论知识可以在前面的文章中找到更多的说明。

实现效果

sfw下载

主要代码

  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矩形,并实现缩放,平移,旋转的更多相关文章

  1. MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点

    1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...

  2. Docker学习计划三:Dockerfile 使用

    我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容 首先通过一张图来了解 Docker 镜像 ...

  3. Python学习日记(三) 学习使用dict

    数据按类型可划分为: 不可变数据类型(可哈希):元祖.string.int.bool 可变数据类型(不可哈希):dict.list 集合本身是可变数据类型,元素是不可变数据类型 字典中的key必须是不 ...

  4. ProgressDialog(三)——代号为中心的屏幕上显示ProgressDialog(ProgressBar)

    MainActivity如下面: package cc.testprogressdialog; import android.os.Bundle; import android.view.Gravit ...

  5. Flash 3D学习计划

    1.理解并记住3D渲染的一般管线流程(一天). 2.理解世界,取景,投影变换,并理解投影坐标系(一天). 3.学习VB,IB相关,理解三角形顶点顺序:在屏幕上显示2D矩形,并实现缩放,平移,旋转(三天 ...

  6. IOS学习计划

    自从接触了IOS后,都没有像样的写过一篇博客去总结这近三个月来对IOS开发的了解.今天,趁着有那么一点的时间,写一下接下来的学习计划和学习路线,以便于自己今后接下来的时间可以更有方向感,更有效率的去学 ...

  7. Socket 学习(三).4 UDP 穿透 客户端与客户端连接

    效果图: 使用方法:  先 修改WinClient\bin\Debug  下面的 ip.ini,写上 服务器 IP地址. 客户端 与 客户端 通讯 之前 ,点击发送打洞消息 按钮,然后过一会再发送消息 ...

  8. Intel汇编语言程序设计学习-第三章 汇编语言基础-中

    3.2  例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...

  9. vim(vi)下的三种模式及其相关命令

    vim(vi)下的三种模式1.命令行模式 2.末行模式 3.插入模式 三种模式的联系及其相互转换 在我们输入vi命令进入编写程序的页面后,我们看到的是命令行模式,在我们输入“a”.“i”.“o”.“O ...

随机推荐

  1. 《大道至简》第一章 编程的精义 java伪代码形式

    愚公.这位名家身上,浓缩了项目组织者.团队经理.编程人员.技术分析师等众多角色的优秀素质. 愚公移山事件分析: 原始需求:惩山北之塞,出入之迂 项目沟通方式:聚室而某曰 项目目标:毕力平险,指通豫南, ...

  2. Python洗牌算法重写

    Python有自带的洗牌算法函数shuffle(). 自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子: import random def shuffle ...

  3. Java进行身份证格式强校验(准)

    最近做了一个系统,涉及到对用户输入的身份证号进行校验,减少脏数据传入后台处理并降低企业验证成本,因此在接入层便对输入信息做格式强校验. 直接附上代码,可直接使用. package hope.ident ...

  4. Linux命令 -磁盘和文件系统类

    声明:本文所涉及到的Linux命令均为最常见的用法,未列举之参数,自行查阅man 1.df 磁盘容量 -h 以人类易读方式展示(GB.KB)等 df -h /usr 2.du 文件或目录的容量 -s ...

  5. freebsd网卡驱动程序详解

    freebsd网卡驱动程序详解 来源 https://blog.csdn.net/h_cszc/article/details/7776116 /* 注释:xie_minix */ /*此处为BSD申 ...

  6. <转自原博客> NOIP2008 传纸条

    小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以 ...

  7. POJ 2115 C-Looooops | exgcd

    题目 给出一个循环for(int i=A;i!=B;i+=C) 在mod (1<<k) 下是否可以退出循环 是,输出时间,否输出FORVEER 题解: 题意可以变换成 A+Cx=B (mo ...

  8. 《c程序设计语言》读书笔记-3.6-数字转字符串最小宽度限制

    #include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  9. code forces 999C Alphabetic Removals

    C. Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. 创建型设计模式之原型模式(Prototype)

    结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...