【笔记】《WebGL编程指南》学习笔记(7)

WebGL编程指南学习(7)

7. 层次模型

  • 由多个简单的部件组成的复杂模型
  • 为复杂物体(机器人手臂)建立具有层次化结构的三维模型

7.1 多个简单模型组成的复杂模型

层次结构模型

  • 当情况较为简单时,实现“部件A转动带动部件B转动”可以很直接,只要对部件B也施以部件A的旋转矩阵即可
  • 情况复杂一些时,需要考虑多个旋转矩阵。按照模型中各个部件的层次顺序,从高到低逐一绘制,并在每个关节上应用模型矩阵
例程:单关节模型

两个立方体部件组成的机器人手臂:arm1(上臂)和arm2(前臂)。使用左右方向键控制arm1(同时带动整条手臂)水平转动;使用上下方向键控制arm2绕joint1关节垂直转动

  • 几何体:用立方体表示arm,arm1和arm2共用一个立方体
  • 绘制层次模型draw()
function draw(gl, n, viewProjMatrix, u_MvpMatrix, u_NormalMatrix) {
  // Clear color and depth buffer
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  // Arm1
  var arm1Length = 10.0; // Length of arm1
  g_modelMatrix.setTranslate(0.0, -12.0, 0.0);
  g_modelMatrix.rotate(g_arm1Angle, 0.0, 1.0, 0.0);    // Rotate around the y-axis
  drawBox(gl, n, viewProjMatrix, u_MvpMatrix, u_NormalMatrix); // Draw

  // Arm2
  g_modelMatrix.translate(0.0, arm1Length, 0.0);    // Move to joint1
  g_modelMatrix.rotate(g_joint1Angle, 0.0, 0.0, 1.0);  // Rotate around the z-axis
  g_modelMatrix.scale(1.3, 1.0, 1.3); // Make it a little thicker
  drawBox(gl, n, viewProjMatrix, u_MvpMatrix, u_NormalMatrix); // Draw
}

draw()内部调用drawBox()函数,每调用一次,绘制一个部件。先调用者先绘制

**绘制单个部件的步骤是:**1. 平移;2.旋转;3.绘制

  • 绘制部件drawBox()

绘制某个部件的顺序是:1. 计算模型视图投影矩阵;2. 计算法向量变换矩阵;3. 绘制立方体

在这里插入图片描述

例程:多节点模型
  • 扩展例程,绘制一个具有多个关节的完整的机器人手臂,包括base,arm1,arm2,palm,finger1 & finger2

  • arm1和arm2的操作和之前一样;此外,可以使用x和z旋转joint2(腕关节);使用c和v键旋转finger1和finger2

  • 和上一个例子的区别在于

    • keydown()相应的按键更多
    • draw()绘制各部件的逻辑更复杂

使用栈存储当前层次的模型矩阵,有利于绘制相同层级的部件

popMatrix()pushMatrix()

也可以通过分别对每个部件设置顶点坐标,然后创建不同的缓冲区,再实际绘制的时候写入a_Position,这样做可以省去缩放、平移等模型矩阵变换操作

7.2 着色器和着色器程序对象

  • 分析initShaders()的作用

initShaders()的作用是编译GLSL ES代码,创建和初始化着色器供WebGL使用,具体步骤如下:

  1. 创建着色器对象gl.createShader()
  2. 向着色器对象中填充着色器程序的源代码gl.shaderSource()
  3. 编译着色器gl.complileShader()
  4. 创建程序对象gl.createProgram()
  5. 为程序对象分配着色器gl.attachShader()
  6. 连接程序对象gl.linkProgram()
  7. 使用程序对象gl.useProgram()

着色器对象(Shader object)与程序对象(Program object)

  • 着色器对象:管理一个着色器(顶点或片元)
  • 程序对象:管理着色器对象的容器,一个程序对象必须包含一对儿顶点和片元着色器

创建着色器对象

gl.createShader(type)
  type: gl.VERTEX_SHADER | gl.FRAGMENT_SHADER

可以使用gl.deleteShader(shader)给它删掉

指定着色器对象中的代码

gl.shaderSource(shader, source)

JavaScript中source是字符串形式的代码

编译着色器

gl.compileShader(shader)

创建程序对象

gl.createProgram()

可以使用gl.deleteProgram(program)删除之

一旦程序对象被创建以后,需要向其附上一对儿着色器:

分配着色器对象

gl.attachShader(program, shader)

可以使用gl.detachShader(program, shader)接除分配

连接程序对象

分配了两个着色器以后,还需要将顶点着色器和片元着色器连接起来

gl.linkProgram(program)

使用gl.getProgramParameters(program, pname)来检查是否连接成功

告知WebGL系统所使用的程序对象

gl.useProgram(program)

这个函数使得WebGL在回之前可以准备多个程序对象,然后在绘制的时候根据需要切换程序对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 原书名:WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL (OpenGL) 原出版社: Addison-Wesley Professional 作者: (美)Kouichi Matsuda Rodger Lea(松田浩一,罗杰.李) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121229428 上架时间:2014-6-11 出版日期:2014 年6月 开本:16开 页码:470 版次:1-1 ---------------------------------------- 目录 《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结 7 第2 章 WebGL 入门 9 Canvas 是什么? 10 使用[canvas] 标签 11 DrawRectangle.js 13 最短的WebGL 程序:清空绘图区 16 HTML 文件(HelloCanvas.html) 16 JavaScript 程序(HelloCanvas.js) 17 用示例程序做实验 22 绘制一个点(版本1) 22 HelloPoint1.html 24 HelloPoint1.js 24 着色器是什么? 25 使用着色器的WebGL 程序的结构 27 初始化着色器 29 顶点着色器 31 片元着色器 33 绘制操作 34 WebGL 坐标系统 35 用示例程序做实验 37 绘制一个点(版本2) 38 使用attribute 变量 38 示例程序(HelloPoint2.js) 39 获取attribute 变量的存储位置 41 向attribute 变量赋值 42 gl.vertexAttrib3f() 的同族函数 44 用示例程序做实验 45 通过鼠标点击绘点 46 示例程序(ClickedPoints.js) 47 注册事件响应函数 48 响应鼠标点击事件 50 用示例程序做实验 53 改变点的颜色 55 示例程序(ColoredPoints.js) 56 uniform 变量 58 获取uniform 变量的存储地址 59 向uniform 变量赋值 60 gl.uniform4f() 的同族函数 61 总结 62 第3 章 绘制和变换三角形 63 绘制多个点 64 示例程序(MultiPoint.js) 66 使用缓冲区对象 69 创建缓冲区对象(gl.createBuffer()) 70 绑定缓冲区(gl.bindBuffer()) 71 向缓冲区对象中写入数据(gl.bufferData()) 72 类型化数组 74 将缓冲区对象分配给attribute 变量(gl.vertexAttribPointer()) 75 开启attribute 变量(gl.enableVertexAttribArray()) 77 gl.drawArrays() 的第2 个和第3 个参数 78 用示例程序做实验 79 Hello Triangle 80 示例程序(HelloTriangle.js) 80 基本图形 82 用示例程序做实验 83 Hello Rectangle(HelloQuad) 84 用示例程序做实验 85 移动、旋转和缩放 86 平移 87 示例程序(TranslatedTriangle.js) 88 旋转 91 示例程序(RotatedTriangle.js) 93 变换矩阵:旋转 97 变换矩阵:平移 100 4×4 的旋转矩阵 101 示例程序(RotatedTriangle_Matrix.js) 102 平移:相同的策略 105 变换矩阵:缩放 106 总结 108 第4 章 高级变换与动画基础 109 平移,然后旋转 109 矩阵变换库:cuon-matrix.js 110 示例程序(RotatedTriangle_Matrix4.js) 111 复合变换 113 示例程序(RotatedTranslatedTriangle.js) 115 用示例程序做实验 117 动画 118 动画基础 119 示例程序(RotatingTriangle.js) 119 反复调用绘制函数(tick()) 123 按照指定的旋转角度绘制三角形(dr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值