美文网首页
WebGL-三维立方体

WebGL-三维立方体

作者: 写前端的大叔 | 来源:发表于2020-01-22 13:34 被阅读0次

之前绘制的正方形都是基于三维空间绘制的一个2D图形,这里主要再多绘制5个正方形,来组成一个立方体的正方形。

定义立方体顶点位置

立体的正方形由6个面组成,每个面都有4个顶点,所以一共需要缓存24个顶点信息。在初始化缓存区的时候,需要先将24个点缓存起来。如下所示:

var vertices = [
  // 前
  -1.0, -1.0,  1.0,
   1.0, -1.0,  1.0,
   1.0,  1.0,  1.0,
  -1.0,  1.0,  1.0,
  
  // 后
  -1.0, -1.0, -1.0,
  -1.0,  1.0, -1.0,
   1.0,  1.0, -1.0,
   1.0, -1.0, -1.0,
  
  // 上
  -1.0,  1.0, -1.0,
  -1.0,  1.0,  1.0,
   1.0,  1.0,  1.0,
   1.0,  1.0, -1.0,
  
  // 下
  -1.0, -1.0, -1.0,
   1.0, -1.0, -1.0,
   1.0, -1.0,  1.0,
  -1.0, -1.0,  1.0,
  
  // 右
   1.0, -1.0, -1.0,
   1.0,  1.0, -1.0,
   1.0,  1.0,  1.0,
   1.0, -1.0,  1.0,
  
  // 左
  -1.0, -1.0, -1.0,
  -1.0, -1.0,  1.0,
  -1.0,  1.0,  1.0,
  -1.0,  1.0, -1.0
];

定义顶点颜色

为了区分正方体的每一个页,需要将每个面设置成不同的颜色,下面是为顶点设置颜色的代码,如下所示:

var colors = [
  [1.0,  1.0,  1.0,  1.0],    // 前:白色
  [1.0,  0.0,  0.0,  1.0],    // 后: 红色
  [0.0,  1.0,  0.0,  1.0],    // 上: 绿色
  [0.0,  0.0,  1.0,  1.0],    // 下: 蓝色
  [1.0,  1.0,  0.0,  1.0],    // 右: 黄色
  [1.0,  0.0,  1.0,  1.0]     // 左: 紫色
];

var generatedColors = [];

for (j=0; j<6; j++) {
  var c = colors[j];
  
  for (var i=0; i<4; i++) {
    generatedColors = generatedColors.concat(c);
  }
}

var cubeVerticesColorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesColorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(generatedColors), gl.STATIC_DRAW);

绘制面

设置好顶点和颜色后,就需要来绘制面了,每个面都是由两个三角形组成,首先需要创建三角形,如下所示:

var cubeVerticesIndexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);
var cubeVertexIndices = [
  0,  1,  2,      0,  2,  3,    // 前
  4,  5,  6,      4,  6,  7,    // 后
  8,  9,  10,     8,  10, 11,   // 上
  12, 13, 14,     12, 14, 15,   // 下
  16, 17, 18,     16, 18, 19,   // 右
  20, 21, 22,     20, 22, 23    // 左
];

gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,
    new Uint16Array(cubeVertexIndices), gl.STATIC_DRAW);

代码中的 cubeVertexIndices 数组声明每一个面都使用两个三角形来渲染。通过立方体顶点数组的索引指定每个三角形的顶点。那么这个立方体就是由12个三角形组成的了。

渲染立方体

绘制完面后,就需要来渲染立方体了。

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);
setMatrixUniforms();
gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0);

立方体的每个面都由2个三角形组成,那就是每个面需要6个顶点,或者说总共36个顶点,尽管有许多重复的。然而,因为索引数组的每个元素都是简单的整数类型,所以每一帧动画需要传递给渲染程序的数据也不是很多。
创建好后的效果图如下所示:

正方形.png

个人博客

相关文章

  • WebGL-三维立方体

    之前绘制的正方形都是基于三维空间绘制的一个2D图形,这里主要再多绘制5个正方形,来组成一个立方体的正方形。 定义立...

  • 单级互联网络

    本知识点对三种基本的单级互连网络:立方体、PM2I、混洗交换。 一、立方体单级网络 1、结构 三维立方体单级网络(...

  • 三维数组的横向/纵向输出

    哈哈,对于三维数组,可以想象成一个魔方(立方体). 这个立方体由每层->每层的每行->每层的每行的每列组成. 要实...

  • 数学漫步观后感

    从三维开始说。我们所生活的这个世界就是三维的。三维的东西就是立体的。三维里有很多图形,比如说立方体三角体长方体以及...

  • C++新手必备:基于OpenGL简单实现3d立方体

    VC++基于OpenGL简单实现3d立方体,没有添加动态的效果,只是一个三维立方体效果,有兴趣的朋友可下载参考。 ...

  • 《Unity Shader入门精要》| 读书笔记(八)

    这一章各种各样的概念比较多,很容易搞混。 第10章 高级纹理 立方体纹理 立方体纹理:三维纹理,包含了六张图像,对...

  • HDU3642(Get The Treasury)

    链接:https://vjudge.net/problem/HDU-3642思路:三维立方体体积并,考虑二维面积并...

  • JavaSE之数组

    一维数组:一条线 二维数组:一个面 三维数组:一个立方体,三维数组使用较少,这里不提及。 一维数组 数组的创建 声...

  • 超立方体

    超立方体,是四维空间中的基本图形之一,由于三维不能具体看到四维空间的物体,所以我们眼中的超立方体都是有斜线的,而...

  • 892-三维型体的表面积

    三维型体的表面积 题目 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。 每个值 v = ...

网友评论

      本文标题:WebGL-三维立方体

      本文链接:https://www.haomeiwen.com/subject/uvwuzctx.html