CG中的几何学(点,向量以及法线)【1】

原文地址:http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/points-vectors-and-normals

(鄙人语言能力不强,只能翻译成这样了,已经是极限了~请谨慎食用-。-!)

提醒:
这篇文章可能稍显枯燥乏味。如果您刚接触计算机图形学的话,请仔细阅读本部分内容。完全掌握本章的内容将为今后的计算机图形学的学习起到事半功倍的效果。
Geometry
在计算机图形学里,点,向量,矩阵和法线的重要性就如同水之于人,这也是为什么大多数的计算机图形学书籍都会以线性代数和几何学作为开始。然而,在没有能够用编程的方式在电脑屏幕上显示画面之前让我们先学一大堆数学知识——简直让人感觉无聊。如果因为对数学或者矩阵什么的东西都不感兴趣而导致您放弃学习计算机图形学,那么现在的这个系列教程将会改变你的想法。
我们会从3d渲染的基础课程开始——请尽管放心,这些课程不需要您有很丰富的线性代数或是数学知识。我们会用一种非传统的方式来教授计算机图形学(以下简称CG)的知识,让您在实践中学习并体验到快乐。比如,在介绍光线追踪器的过程中,我们只会提到一点点数学以及编程知识,这样任何人都能跟得上。写渲染器将是一个非常让人兴奋的过程,在这个过程中你不仅能够学到一些数学知识,还能够知道我们是怎么把事物显示到屏幕上的。说了那么多其实只需记住一点:点,向量以及矩阵是CG这栋建筑的砖和瓦,我们会在不同的课程中经常和他们打交道。
在这篇教程中,我们会学到CG的砖和瓦是怎么构成的以及我们能用什么方式去操作它们。当然,我们也会顺便介绍一些“俗语”。这些“俗语”已经在线性代数领域和CG领域被用了很多年。当上述领域的专家在解决它们的问题的时候,会经常使用这些俗语。因此,为了和他们顺利沟通(比如阅读专家们的代码什么的),我们得在头脑里留下这些俗语的映像。
如果你是一个纯粹的数学家,有可能你会发现这里介绍的知识和线性代数的关系不是特别大。比如,严格来说:“点(point)“和线性代数是没有关系的,因为线性代数只用向量(Vector)。我们用”点“这个概念,仅仅是因为它和CG有很强的关系,同时我们也能用线性代数中的知识来操作它们。后面我们将详细的说明【点】和【向量】这两种概念。

Vector
所以到底什么是线性代数呢?就像我们之前提到的,是数学的一个分支,主要研究【向量】。也许现在你会问,到底什么是向量,这些东西和CG到底有什么关系?为了贯彻之前的宗旨——我们只需要很少的数学知识!所以,我们不会介绍太多的细节,我们只会告诉您——向量可以用一组数来表示,仅此而已。这组数可以有任意多个数字。如果我们用n个数字来表示这个向量,那么这个向量就是一个n维向量。可以用如下的方式表示:
v = (a ,b ,c ,d ,e ,f)
a ,b ,c ,d, e, f都是实数。
我们用这种方式来表示向量是有原因的,因为这种方式可以很容易的帮我们解决CG中的问题。通常我们会用一个向量来表示CG中的位置和方向。我们也会用向量来改变物体的位置。现在,您只需要记住向量是这么写的就可以了。
Point and Vectors
点(point)和向量(vector)的概念在很多的领域都有用到,但在这里,我们将它们俩限制在CG领域。
一个【点】可以用来表明三维空间中的一个位置。而【向量】通常表示三维空间中的方向。在三维空间里面,它们有相同的表示:
V = (x ,y ,z)
x ,y , z都是实数。
数学家和物理学家头脑中的点和向量的概念比CG中的更通用,我们这里介绍的概念只在CG中适用。在CG里面,【点】是没有尺寸的。
这里写图片描述
在这里我们顺便提一嘴【同质点(homogeneous point)】。什么是同质点呢?有些时候为了数学上的计算方便,我们会为点的表示额外增加一个元素,像这样:
P = {x,y,z,w}
当我们将点和矩阵做乘法的时候,就会用到同质点。现在您不需要了解什么是点和矩阵的乘法,您只需要记住有这么一种东西叫同质点就好,后面我们会详细解释的。

A quick introduction to Transformations(极速通关【变换】这个概念)
现在您可能对于点以及向量的【变换(Transformation)】到底是个什么感到好奇。事实上这非常简单。在CG里面,我们经常对一个点进行的变换就是——移动。没错,我们需要将一个点从一个地方弄到另一个地方,这个过程就叫做变换(准确的说应该叫做移动变换)。
移动变换通常只是对原始点的一个线性移动。不过对向量来说,对她的移动变换通常没有意义,因为移动之后(中途不旋转),向量所指的方向没有发生变化。然而,如果我们对向量执行旋转变换(也就是改变向量所指的方向),这就变得有意义了。现在,我们用如下的简单公式来表示这两种变换:
P->Translate->P’
V->Rotate->V’

到现在为止我们并没有提及向量的【长度】这一概念。在CG里面,这很重要。一个长度为1的向量,我们通常说它是normalized(单位化的)。我们通常所说的将一个向量单位化就是指在保持它的方向不变的前提下,改变它的长度为1。大多数情况下,我们都会将向量单位化,不过有时候也不会这样做,因为我们会用向量的长度信息来计算某些值(比如亮点之间的距离)。

Normals【法线】
法线是用于描述一个面上某个点的朝向的向量。
这里写图片描述
通常点的法线是与面上该点所在的切面垂直的向量。在模拟阴影的过程中,法线占据着非常重要的地位。法线虽然也是一种向量,但是它们的变换方式和向量的并不同。这也是我们花时间来单独说明两者的原因。具体有何不同我们在后面会详细说明。

是时候用代码模拟概念了
我们使用C++代码来模拟这些概念,当然我们并没有严格的区分点和向量,它们都用一个叫做Vec3的类来表示:

template<typename T>
class Vec3
{
    public:
    //3种方式的构造函数
    Vec3():x(T(0)),y(T(0)),z(T(0)){}
    Vec3(const T &xx):x(xx.x),y(xx.y),z(xx.z){}
    Vec3(T xx,T yy,T zz):x(xx),y(yy),z(zz){}
    T x,y,z;
};

typedef Vec3<float> Vec3f;

Vec3<float> a;
Vec3f b;

总结
通过本章的学习,您知道了以下知识:在数学上来说,一个向量可以有任意多个元素。然而在CG领域中,我们用了特别的定义——一个向量是3D空间中的方向(因此只有3个元素)。此外,一个点用三个元素表示。我们还介绍了同质点的概念,这个概念将会在后面的教程中大放异彩。
点和向量可以通过线性变换来改变状态。典型的线性变换包括移动变换和旋转变换。我们也介绍了单位化的概念,以及单位化的意义。最后我们用C++代码模拟了上述的概念。

what’s next?
接下来我们会解释点和向量的三个数字到底是什么意思,它们表达出什么情形。这三个数字代表的是点离某个参考的距离,这个参考通常叫做【坐标系(coordinate system)】,这也是下面的文章将要讨论的主题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值