本书系列

现代3D图形编程学习

基础简介

并不像本书的其他章节,这章内容没有相关的源代码或是项目。本章,我们将讨论向量,图形渲染理论,以及OpenGL。

向量

在阅读这本书的时候,你需要熟悉代数和几何知识,但对于向量的理解并不是必要的。因为,在接下去的内容中,会对向量的基本概念作出介绍。

在面对几何或是数值相关的内容时,向量可以有很多不同的解释。在任何一种情况,向量是具有维度的。二维的向量限制在一个平面上,然而三维的向量可以在任何的物理空间。向量还可以有更高的维度,但是通常情况下,我们处理的向量的维度只在二维到四维之间。

严格的来说,向量还可以存在仅仅一维的情况。这样的向量被称为标量

在几何术语中,向量可以表示两个概念:一个空间中的位置或是一个方向。

向量的位置表示空间中一个特殊的位置。如,在下图中我们有一个向量位置A。

Figure1 vector position

向量也可以表示为方向。方向向量没有一个原点;只用来表示空间中的方向。下图中给出了不同的方向向量,其中B和D虽然画在不同的位置,但它们是相同的方向向量。

Figure2 Direction Vectors

对于几何而言,以上的表达方式已经够用了,但是向量还可以被解释成数值。这时候,一个向量表示为一个数字序列,没一个数字表示一个维度。因此,二维的向量有两个数字;三维的向量有三个数字。对于四维向量也是一样的。从数字上来说,标量仅仅是一个数字。

向量中的没一个数字都被称为要素(component)。每一个要素都有自己的名字。对于我们而言,向量的第一个要素被成为X,第二个被成为Y,第三个是Z,第四个是W。

当用文本的方式来书写向量的时候,它们通常被括号包围。因此,一个3D向量可以是(0,2,4),其中X为0,Y为2,Z为4.当他们以公式的形式进行书写的时候,表现形式为:

\[
\vec {a} = \left[
\begin{matrix}
1 \\
2 \\
3
\end{matrix}
\right]
\]

在数学公式中,向量变量会以粗体或是上面带箭头的形式出现。

当在绘制向量的时候,需要区分位置向量和方向向量。但是,它们两者的数值并没有区别。唯一的区别是你怎么使用它们,而不是怎么用数字表达它们。因此,你可以把一个点考虑成一个向量,然后执行一些操作,最后再将它考虑成一个点。

虽然向量的各个成分之间是独立的,但是数学公式操作它们的时候,它们是一个整体。在接下来的内容中,我们会通过几何和数值的方式展示一些操作。

向量加法 你可以对两个向量执行加法操作。从图形上看是这样的:

Figure3 Vector Addition

要记得的是,方向向量在不改变具体数值的情况下,可以对其进行移动。因此,如果你将两个向量放置为首位相接,向量的加法可以简单的表示成从第一个向量的尾部指向第二个向量的头。

Figure4 Vector Addition Head-to-Tail

从数值上来讲,两个向量的求和就是将两个向量的各个成分相加,

公式1. 向量相加
\[
\vec{a} + \vec{b} = \left[ \begin{matrix} a_x \\ a_y \\ a_z \end{matrix} \right] + \left[ \begin{matrix} b_x \\ b_y \\ b_z \end{matrix} \right] = \left[ \begin{matrix} a_x+b_x \\ a_y+b_y \\ a_z+b_z \end{matrix} \right]
\]

一个操作需要对向量各个成分进行,被称为分量操作(component-wise operation)。向量加法就是一个分量操作。任何一个分量操作都需要保证两个向量有相同的维度。

向量求反和减法 你可以对一个向量去反,就是逆转一个向量的方向。

Figure5 Vector Negation

从数值上来看,就是对向量中的每个成分都去反。

公式2. 向量去反

\[-\vec{a}=-\left[\begin{matrix}a_x \\ a_y \\ a_z \end{matrix} \right]=\left[\begin{matrix} -a_x \\ -a_y \\ -a_z \end{matrix} \right]\]

正如数值运算,向量的减法就是一个向量和第二个向量的反进行相加。

Figure6 Vector Subtraction

向量乘法 向量乘法操作是向量操作中为数不多的没有几何概念与之对应的操作。将两个方向或是两个位置进行相乘,并没有什么意义。但这并不是说向量的乘法没有作用。

数值上,向量的乘法,就是将对应的各个成分相乘。

公式3. 向量乘法

\[ \vec{a}*\vec{b}=\left[\begin{matrix} a_x \\ a_y \\ a_z \end{matrix}\right]*\left[\begin{matrix}b_x \\ b_y \\ b_z \end{matrix}\right]=\left[\begin{matrix} a_x*b_x \\ a_y*b_y \\ a_z*b_z \end{matrix}\right]\]

向量缩放操作 向量可以乘以一个标量。这个标量仅仅是一个数值。更具这个标量的值,这个向量可能被放大或缩小。

Figure7 Vector Scaling

数值运算上,就是将向量的各个成分和标量进行相乘。

公式4. 向量缩放操作

\[ s*\vec{a}=a*\left[\begin{matrix} a_x \\ a_y \\ a_z\end{matrix}\right]=\left[\begin{matrix} s*a_x \\ s*a_y \\ s*a_z \end{matrix}\right] \]

标量也可以和向量相加,这同样没有什么几何意义。公式如下:

公式5. 向量标量相加

\[s+\vec{a}=s+\left[\begin{matrix} a_x \\ a_y \\ a_z\end{matrix}\right]=\left[\begin{matrix}s+a_x \\ s+a_y \\ s+a_z \end{matrix}\right]\]

向量代数 理解这些向量操作之间的关系是有帮助的。

向量加法乘法遵循很多和标量加法乘法相同的规则。它们是交换率,结合率,和分配率。

公式6. 向量代数

  • 交换率:\(\vec{a}+\vec{b}=\vec{b}+\vec{a}\); \(\vec{a}*\vec{b}=\vec{b}*\vec{a}\)
  • 结合率:\(\vec{a}+\left(\vec{b}+\vec{c}\right)=\left(\vec{a}+\vec{b}\right)+\vec{c}\); \(\vec{a}*\left(\vec{b}*\vec{c}\right)=\left(\vec{a}*\vec{b}\right)*\vec{c}\)
  • 分配率:\(\vec{a}*\left(\vec{b}+\vec{c}\right)=\left(\vec{a}*\vec{b}\right)+\left(\vec{a}*\vec{c}\right)\)

向量和标量具有类似的特性。

长度. 向量也有长度,表示从起点到终点的距离。

公式7. 向量长度

\[ |\vec{a}|=\sqrt{a_x^2+a_y^2+a_z^2}\]

这里使用了毕达哥拉斯定理来计算向量的长度。这个适用于任何维度的向量,并不单单是二维或三维向量。

单位向量与标准化 一个向量的长度为一,那么这个向量是 单位向量 。在数学公式中单位向量的表示方式是在变量名上面加个^。

一个向量转变成单位向量的过程叫做 标准化 。将向量除以改向量的长度就能够得到它的长度。

公式8. 向量标准化

\[\hat a=\frac{1}{|\vec{a}|}*\vec{a}=\left[\begin{matrix} \frac{a_x}{|\vec{a}|} \\ \frac{a_x}{|\vec{a}|} \\ \frac{a_x}{|\vec{a}|} \end{matrix}\right]\]

这些并不是本书中用到的所有的向量操作。新的向量操作会在它们第一次被使用到的时候进行介绍。并且,并不像这里使用到了公式,它们中的大多数将不是针对各个成分的独立操作。

范围符号 本书中会使用标准的标识来标记一个值的具体范围。

如果一个值在0~1之间,并且可以等于0和1,那么标记为[0, 1]。放括号表示范围包括了相邻的值。

如果一个值在0~1范围,但不包括0,那么标记为(0, 1]。圆括号表示相邻的值并不包括在范围内。

如果一个值表示0和大于0的任何数值,那么标记为\([0, \infty)\),需要注意的是无穷大是不可达到的,因此它总是被排除在范围之外的。任何一个小于0的范围则标记为\((-\infty,0)\)。

现代3D图形编程学习-基础简介(1) (译)的更多相关文章

  1. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  2. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  3. 现代3D图形编程学习-关于本书(译)

    本书系列 现代3D图形编程学习 关于这本书 三维图像处理硬件很快成为了必不可少的组件.很多操作系统能够直接使用三维图像硬件,有些甚至要求需要有3D渲染能力的硬件.同时对于日益增加的手机系统,3D图像硬 ...

  4. 现代3D图形编程学习-设置三角形颜色(译)

    本书系列 现代3D图形变成学习 http://www.cnblogs.com/grass-and-moon/category/920962.html 设置颜色 这一章会对上一章中绘制的三角形进行颜色的 ...

  5. 现代3D图形编程学习-你好,三角形(译)

    你好,三角形 传统的入门教程在介绍编程语言的时候,通常从"Hello,World!"的程序开始.这样的程序拥有最简单的能够直接输出"Hello, World!" ...

  6. 现代3D图形编程学习-环境设置

    本书系列 现代3D图形编程学习 环境设置 由于本书中的例子,均是基于OpenGL实现的,因此你的工作环境需要能够运行OpenGL,为了读者能够更好的运行原文中的示例,此处简单地介绍了linux和win ...

  7. 现代3D图形编程学习--opengl使用不同的缓存对象(译者添加)

    现代3D图形编程学习系列翻译地址 http://www.cnblogs.com/grass-and-moon/category/920962.html opengl使用不同的缓存对象 在设置颜色一章中 ...

  8. 现代3D图形编程学习-关于本书

    关于这本书 三维图像处理硬件很快成为了必不可少的组件.很多操作系统能够直接使用三维图像硬件,有些甚至要求需要有3D渲染能力的硬件.同时对于日益增加的手机系统,3D图像硬件,也成为了它们的必备特征. 对 ...

  9. Qt OpenGL:学习现代3D图形编程之四,透视投影浅析

    一.非真实的世界 与之前几篇文章不同的是,这里要画12个三角形,这个12个三角形构造一个方形棱柱(这里为长方体).棱柱的每个四边形表面由两个三角形组成.这两个三角形其中的一条边重合,而且它们的六个顶点 ...

随机推荐

  1. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  2. 前端学HTTP之安全HTTP

    前面的话 HTTP的主要不足包括通信使用明文(不加密),内容可能会被窃听:不验证通信方的身份,有可能遭遇伪装:无法证明报文的完整性,有可能被篡改 基本认证和摘要认证能够使得用户识别后较安全的访问服务器 ...

  3. Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...

  4. 代码的坏味道(22)——不完美的库类(Incomplete Library Class)

    坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

  5. pt-heartbeat

    pt-heartbeat是用来监测主从延迟的情况的,众所周知,传统的通过show slave status\G命令中的Seconds_Behind_Master值来判断主从延迟并不靠谱. pt-hea ...

  6. 设计模式C#合集--工厂方法模式

    简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...

  7. 面向对象相关知识点xmind

  8. BPM体系文件管理解决方案分享

    一.方案概述 企业管理在很大程度上是通过文件化的形式表现出来,体系文件管理是管理体系存在的基础和证据,是规范企业管理活动和全体人员行为,达到管理目标的管理依据.对与公司质量.环境.职业健康安全等体系有 ...

  9. Linux学习笔记(一):常用命令

    经过统计Linux中能够识别的命令超过3000种,当然常用的命令就远远没有这么多了,按照我的习惯,我把已经学过的Linux常用命令做了以下几个方面的分割: 1.文件处理命令 2.文件搜索命令 3.帮助 ...

  10. linux压缩和解压缩命令大全

    .tar 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName ------------------------------------- ...