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 }

转载于:https://www.cnblogs.com/hisiqi/p/3162151.html

Flash3D学习计划(三)——学习VB,IB相关,理解三角形顶点顺序;在屏幕上显示2D矩形,并实现缩放,平移,旋转...相关推荐

  1. ROS学习08-NVIDIA JETSON TX2安装配置激光雷达-思岚RPLIDAR S1(在Rviz上显示点位图)

    ROS学习08-NVIDIA JETSON TX2安装配置激光雷达-思岚RPLIDAR S1(在Rviz上显示点位图) 在前一节我们创建了ROS工作空间,这一节开始要给我们的机器人装一些感官了,这里我 ...

  2. ABAP屏幕上显示LIST的三种方法

    屏幕上显示LIST的三种方法 在abap开发中,经常有用户提出list的需求,实现的方法很多,通常用的有以下三种总结一下供大家参考: 1:手工添加-就是根据需要把LIST要显示的内容一条一条加到LIS ...

  3. 【Python之pymysql库学习】三.sql语句的相关知识(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python之pymysql库学习』 系列,持续更新中 欢迎关注 『Python之pymysql库学习』 系列,持续更新中 实现效果 把给读取数据 ...

  4. html5学习计划,个人学习计划时间表2018

    个人学习计划时间表2018 一.时间计划 1.早上 (1).每天6:20必起.(2).每天6:30必到教室.(3).每天7:00-7:10分吃早餐.(4).7:10分回教室直到早自习下(7:50).( ...

  5. java 学习计划_Java学习计划范例

    Java学习计划范例 Java学习计划 好的计划是成功的一半,今天是在创新思维的第一节课,在这门课程的开始,一个有策略的.有目的性的计划是非常必要的,为了在以后的学习中能够达到最好的.效果," ...

  6. mysql学习计划_MySQL学习计划

    2019.1.15更新 没有按照既定计划执行,借口当然是一大堆,耐心得读完了这本书,受益匪浅,解决了我日报和周报中的很多问题,虽然离目标还有很大的距离,但是这本书让我看到了希望,科技改变世界,这一行行 ...

  7. Linux学习(三):管道相关命令

    学习目标 熟练掌握以下命令 1.cut 2.sort 3.wc 4.uniq 5.tee 6.tr 7.split 8.awk 9.sed / grep 熟练掌握以下命令 1.cut 准备工作 成绩表 ...

  8. Android学习计划 Android学习总结

    ********************************2011/07/01********** 之前自己曾参与了一个简单的Android应用项目(简单的拍照功能,利用socket与PC 端服 ...

  9. anki怎么设置学习计划_新媒体企业品牌营销策划公众号运营规划线上推广内容管理sop工作流程计划方案表格模板新手小白零基础怎么学习写作软文涨粉技巧攻略下载...

    新媒体运营工作总结(共10篇) - 大文斗范文网 ...策划方案(总监级的推广方案) | 秦志强笔记_网络新媒体... 月薪30K新媒体运营在用的线上内容管理营销推广计划sop方案... 教你怎么写好 ...

最新文章

  1. laravel 文件上传
  2. 图像处理与计算机视觉:基础,经典以及最近发展(5)计算机视觉
  3. Exchange 2010 Mailtip 功能
  4. 正式发布!鸿蒙,来了!
  5. 程序员面试——C++工程师面试大全第一部分
  6. Firefox 97.0.2 修复两个已遭利用的0day
  7. 【跟着我们学Golang】基础结构
  8. 神经网络之BP神经网络
  9. python求解LeetCode习题Fraction to Recurring Decimal
  10. 打外星生物的塔防java_《异形防御者》测评:外星人也玩塔防游戏
  11. 员工激励格言之《士气与斗志的激励》
  12. requires_grad,grad_fn,grad的含义及使用
  13. python+OpenCv笔记(八):图像噪声(椒盐噪声、高斯噪声)
  14. 约瑟夫环问题(丢手绢)
  15. 最全的浏览器User-Agent
  16. 物理木板过河问题java_抖音捡木板过河游戏
  17. rgb色带python实现opencv
  18. 基于JAVA银杏湖景区旅游管理信息平台计算机毕业设计源码+系统+lw文档+部署
  19. Java全栈系列笔记
  20. MATLAB学习笔记#001 获取矩阵大小

热门文章

  1. 电脑重启很久一直在转_win10重启一直转圈的解决方法
  2. 数据库主键设置 (一看就懂)
  3. 深入理解计算机操作系统(五)
  4. 记一次使用开源代码的微博爬虫的经历
  5. 论文领读:人工智能三巨头的Deep learning
  6. mysql 生成随机(数字、英文字符、汉字函数)
  7. BAT等大厂已开源的70个实用工具盘点(附下载地址)
  8. 将chatGPT集成到知乎做知乎问答
  9. 检查NC系统中资产负债表不平的套路
  10. Jmeter并发测试 - 设置集合点