本书系列

现代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. 旺财速啃H5框架之Bootstrap(五)

    在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...

  2. 关于自己写C++的一点风格

    现在,我学了很长时间的C++,但是自己就是无法精通.许多知识是入门书上没有的.现在写C++最重要的就是风格问题. 我现在的C++风格: 把自己所有的东西都放在一个名称空间下. 没有全局的函数,有的函数 ...

  3. ABP文档 - Mvc 视图

    文档目录 本节内容: 简介 AbpWebViewPage 基类 简介 ABP通过nuget包Abp.Web.Mvc集成到Mvc视图里,你可以像往常那样创建常规的视图. AbpWebViewPage 基 ...

  4. sonn_game网站开发01:写在最前面

    之前做的个人博客项目,日向博客现在已经进入后期完善阶段了.是时候开始打造一个新坑了. 然而改造个什么坑呢?构思了好几天,想了好多方案,都觉得没啥动手欲望.因为,我想做的是那种,自己能用得上,而且有一定 ...

  5. 为.NET Core项目定义Item Template

    作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...

  6. php利用root权限执行shell脚本

    vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root  ALL=(ALL)  ALL apache  ALL= ...

  7. Spring WebService入门

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...

  8. SpringMvc中的数据校验

    SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...

  9. Nginx 配置简述

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...

  10. 利用log4j+mongodb实现分布式系统中日志统一管理

    背景     在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...