VB:顶点缓冲

IB: 顶点索引缓冲

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

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

实现效果

sfw下载

主要代码

  1. 1 package
  2. 2 {
  3. 3 import com.adobe.utils.AGALMiniAssembler;
  4. 4 import com.adobe.utils.PerspectiveMatrix3D;
  5. 5
  6. 6 import flash.display.Sprite;
  7. 7 import flash.display.Stage3D;
  8. 8 import flash.display3D.Context3D;
  9. 9 import flash.display3D.Context3DProgramType;
  10. 10 import flash.display3D.Context3DVertexBufferFormat;
  11. 11 import flash.display3D.IndexBuffer3D;
  12. 12 import flash.display3D.Program3D;
  13. 13 import flash.display3D.VertexBuffer3D;
  14. 14 import flash.events.Event;
  15. 15 import flash.geom.Matrix3D;
  16. 16 import flash.geom.Vector3D;
  17. 17
  18. 18 /**
  19. 19 * @author smartqi
  20. 20 * @E-mail:
  21. 21 * 创建时间:2013-6-29 上午9:36:36
  22. 22 *
  23. 23 */
  24. 24 public class RectangleTest extends Sprite
  25. 25 {
  26. 26
  27. 27 private var context:Context3D;
  28. 28 private var vertexBuff:VertexBuffer3D;
  29. 29 private var indexBuff:IndexBuffer3D;
  30. 30 private var vertexData:Vector.<Number>;
  31. 31 private var indexData:Vector.<uint>;
  32. 32 private var shaderProgram:Program3D;
  33. 33 private var perspectiveMatrix:PerspectiveMatrix3D;
  34. 34 private var i:int;
  35. 35 private var sign:int = 1;
  36. 36 private const angleGap:Number = 20;
  37. 37 private var angle:Number = 0;
  38. 38 private var modelMatrix:Matrix3D;
  39. 39 private var viewMatrix:Matrix3D;
  40. 40 private var finalMatrix:Matrix3D;
  41. 41
  42. 42
  43. 43 public function RectangleTest()
  44. 44 {
  45. 45 var stage3d:Stage3D = stage.stage3Ds[0];
  46. 46 stage3d.addEventListener(Event.CONTEXT3D_CREATE,onContextCreate);
  47. 47 stage3d.requestContext3D();
  48. 48 }
  49. 49
  50. 50 private function onContextCreate(e:Event):void{
  51. 51 context = (e.target as Stage3D).context3D;
  52. 52 if(context == null) return;
  53. 53 context.enableErrorChecking = true; //允许进行错误检测,release版本应设置
  54. 54 context.configureBackBuffer(500,500,0); //设置显示区域的大小
  55. 55 setupVertexBuff(); //设置顶点缓冲
  56. 56 setupShaderProgram(); //设置shander
  57. 57 setupPerspectiveMatrix(); //设置投影矩阵
  58. 58 initMatrix();
  59. 59 addEventListener(Event.ENTER_FRAME,onEnterFrame);
  60. 60 }
  61. 61
  62. 62 private function setupVertexBuff():void{
  63. 63 vertexData = Vector.<Number>([
  64. 64 // x y z r g b
  65. 65 40, 40, -40, 1, 0, 0,
  66. 66 40, -40, -40, 0, 1, 0,
  67. 67 -40, -40, -40, 0, 0, 1,
  68. 68 -40, 40, -40, 1, 1, 1,
  69. 69 ]);
  70. 70
  71. 71 indexData = Vector.<uint>([0,1,2,0,2,3]);
  72. 72 vertexBuff = context.createVertexBuffer(4,vertexData.length/4);
  73. 73 vertexBuff.uploadFromVector(vertexData,0,4);
  74. 74 indexBuff = context.createIndexBuffer(6);
  75. 75 indexBuff.uploadFromVector(indexData,0,6);
  76. 76 context.setVertexBufferAt(0,vertexBuff,0,Context3DVertexBufferFormat.FLOAT_3);
  77. 77 context.setVertexBufferAt(1,vertexBuff,3,Context3DVertexBufferFormat.FLOAT_3);
  78. 78 }
  79. 79
  80. 80 private function setupShaderProgram():void{
  81. 81 var vertexProgram:AGALMiniAssembler = new AGALMiniAssembler();
  82. 82 vertexProgram.assemble(Context3DProgramType.VERTEX,
  83. 83 "m44 op,va0,vc0\n" +
  84. 84 "mov v1,va1\n");
  85. 85 var fragmentProgram:AGALMiniAssembler = new AGALMiniAssembler();
  86. 86 fragmentProgram.assemble(Context3DProgramType.FRAGMENT,
  87. 87 "mov oc,v1");
  88. 88 shaderProgram = context.createProgram();
  89. 89 shaderProgram.upload(vertexProgram.agalcode,fragmentProgram.agalcode);
  90. 90 context.setProgram(shaderProgram);
  91. 91 }
  92. 92
  93. 93 private function setupPerspectiveMatrix():void{
  94. 94 perspectiveMatrix = new PerspectiveMatrix3D();
  95. 95 perspectiveMatrix.perspectiveFieldOfViewRH(Math.PI*90/180,1,1,1000); //注意这里的角度使用的是弧度
  96. 96 }
  97. 97
  98. 98 private function initMatrix():void{
  99. 99 modelMatrix = new Matrix3D();
  100. 100 viewMatrix = new Matrix3D();
  101. 101 finalMatrix = new Matrix3D();
  102. 102 }
  103. 103
  104. 104 private function onEnterFrame(e:Event):void{
  105. 105 context.clear(0,0,0);
  106. 106 angle += angleGap;
  107. 107 modelMatrix.identity();
  108. 108 modelMatrix.prependRotation(angle,Vector3D.Z_AXIS); //绕着Z轴旋转物体,注意这里的角度使用的是角度
  109. 109 if(i>30){
  110. 110 sign = -1;
  111. 111 }
  112. 112 if(i<0){
  113. 113 sign = 1;
  114. 114 }
  115. 115 i += sign;
  116. 116 viewMatrix.identity();
  117. 117 viewMatrix.prependTranslation(0,0,-30 + i); //将相机向后移,使物体看起来变小了,将相机向前移,使物体看起来变大
  118. 118 finalMatrix.identity();
  119. 119 finalMatrix.append(modelMatrix);
  120. 120 finalMatrix.append(viewMatrix);
  121. 121 finalMatrix.append(perspectiveMatrix);
  122. 122 context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX,0,finalMatrix,true); //上传最终的顶点转换矩阵,注意这里最后一个参数为true
  123. 123 context.drawTriangles(indexBuff,0,2);
  124. 124 context.present();
  125. 125 }
  126. 126 }
  127. 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. mac虚拟机上(centos系统)设置联网第二种方式

    这种方式简单,不容易出错,用的桥接的方式. 这样的安装的centos会得到ip地址 然后编辑一下网卡配置,使其变为静态得ip 输入命令 # vi /etc/sysconfig/network-scri ...

  2. Python网络编程(OSI模型、网络协议、TCP)

    前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...

  3. Python全栈工程师(异常(基础))

    ParisGabriel                每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰     Python人工智能从入门到精通 补充:包的相对导入 只对后两种导入方式有用 ...

  4. java单例模式(类只能创建唯一对象)

    //饿汉式 class Single { private static final Single s= new Single(); private Single(){} public static S ...

  5. JavaScript里面的正则以及eval

    1.eval JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值. eval() EvalError   执行字符串中的JavaScript代码 ...

  6. Android记事本06

    昨天: activity的生命周期 今天: activity横竖屏切换的生命周期 遇到的问题: 为了匹配ADK,下载了更旧的版本SDK,布局文件仍然无法显示.

  7. nyoj 题目 孪生素数问题

    孪生素数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再 ...

  8. B - Help Jimmy

    B - Help Jimmy Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem ...

  9. 获取JNDI数据源

    1 在容器中配置数据源 Tomcat <?xml version="1.0" encoding="UTF-8"?> <Context> ...

  10. Jquery不同版本共用的解决方案(插件编写)

    最近在为某公司做企业内部UI库,经过研究分析和评审,决定基于Jquery开发,结合Bootstrap插件那简洁,优雅,高效的思想进行插件编写. 但是在编写的过程中遇到一个头疼的问题,就是正在编写的插件 ...