3D编程:第二章 A 3D/Math Primer

ab=(ax *bx)+(ay *by)+(az *bz)

这产生一个标量值,因些dot product也称为scalar product(或者inner product)。根据向量长度的定义,可以使用向量与其自身的点积的平方根来计算向量的长度。 在几何数学中,点积表示了两个向量之间的角度。公式为: a b = ||a||*||b|| * cos(θ)

θ即为向量a和b的夹角。如果向量a和b都已经标准化,点积可以简化为:

a b = cos(θ)

根据这个公式,可以总结如下几点: 如果a b  > 0,两个向量的夹角小于90度。 如果a b  < 0,两个向量的夹角大于90度。 如果a b  = 0,两个向量相互垂直。 在后面的章节中,你会发现点积在计算机图形学中有多种多样的应用。比如,在光照计算中可以用点积来计算照射表面和光源之间的角度。在第二部分,“Shader Authoring with HLSL”将会详细讲解。

Cross Product(叉积)

Cross Product是另一个非常有用的向量运算。两个向量的叉积得到一个与这两个向量都正交的第三个向量。叉积的公式为:

a × b = (ay * bz – az * by, az * bx – ax * bz, ax * by – ay * bx)

叉积可以用于计算一个triangle的法向量(也就是triangle的朝向)。

Matrix

一个m×n矩阵是一个m行,n列的二维数组。比如一个4×1矩阵,有4行1列,一个2×3矩阵有两行3列,如下所示:

在矩阵C中,指出了矩阵中每个元素对应的下标。只有一个单一的行或列的矩阵有时被称为行向量和列向量。具有相同行数和列数的矩阵称为方阵。在3D图形学中,4×4方阵应用最广泛。

Basic Matrix Operations

你可以使用矩阵执行一些基本的算术运算。在向量中,是对两个向量的逐个元素执行加减法。因些两个矩阵必要具有相同的行数和列数才可以做加减法。标量乘法同样是进行逐个元素运算,把标量与矩阵中的每个元素相乘。但是,矩阵的乘法却有点不一样。

Matrix Multiplication

对于矩阵乘法,一个具有n列的矩阵只能和一个具有n行的矩阵相乘。在所得到的矩阵中,每一个元素都是第一个矩阵的行与第二个矩阵对应的列进行dot product计算出来的。如下公式所示,如果把矩阵A的每一行作为行向量,矩阵B的每一列作为列向量,可以定义乘积矩阵元素为:

图2.3 illustrates this process。

图2.3 Matrix multiplication。

如下所示:

矩阵A是一个两行3列的矩阵,矩阵B一个3行两列的矩阵。矩阵B的行数与A的列数相同,因此可以进行矩阵乘法。相乘的结果一个2×3矩阵,计算如下:

需要注意的是矩阵乘法是不满足交换律(不能交换相乘,也无法得到相同的乘积)。事实,一般情况下定义矩阵乘法A * B,对于B * A的情况是没有定义的,比如一个3×3矩阵乘以一个2×3矩阵。

Transposition

矩阵的转置是通过把矩阵的元素依据主对角线反转得到的。对于一个方阵是很容易理解的,如下示例所述:

另外一种转置矩阵的方法是交换矩阵的行和列。这种很容易理解,特别是对于行向量和列向量,或者非方阵。例如:

Row-Major and Column-Major Order

处理矩阵时,必须考虑如何在计算机内存中存储矩阵。Direct3D以行优先的顺序存储矩阵,也就是说如果存储到一段连接内存中,是以一行一行的方式排列在内存中。这也是C语言中多维数组的存储格式。如下示例,是一个2×3矩阵以行优先顺序连接存储的形式:

时间: 2024-08-24 09:32:40

3D编程:第二章 A 3D/Math Primer的相关文章

手机上J2ME的3D编程-简单创建3D立方体(1)

编程|创建 参考文档:JSR-184 工具:Eclipse3.0+Eclipseme API:Mobile 3D Graphics API 模拟器:Sony Ericsson 分析: 在现实生活中,我们所看到的是一个3维系统.透过双眼,可以看到的是一个丰富多彩的世界.我们所用的照相机,能够拍出很多漂亮的图片.拍摄每张图片时,可以根据拍摄距离的远近可以调整所拍摄画面上的内容. 在虚拟的世界里,可以模拟真实世界.欲将虚拟世界展示出来,就要利用一个虚拟的照相机,将虚拟的世界拍摄出来. 在JSR-184

《.net编程先锋C#》第二章 理论基础-公用语言 运行环境(转)

编程 第二章 理论基础-公用语言 运行环境既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌.C#依靠由NGWS提供的运行时:因此,有必要知道运行时如何工作,以及它背后所蕴含的概念.所以,这一章分为两部分--它们是所有的概念和使用的基础.两部分的内容虽然有些重叠,但它有助于加深理解正在学习的概念. 2.1 NGWS RuntimeNGWS和NGWS Runtime为你提供了一种运行时环境.该运行时管理执行代码,并提供了使编程更容易的服务.只要你的编译器支持这种运行时,你

《OpenGL超级宝典(第5版)》——第1章,第1.4节3D编程的基本原则

1.4 3D编程的基本原则 现在,我们对实时3D的基本概念已经有了相当程度的认识.我们讨论了一些术语以及PC上的一些示例应用程序.那么,如何在自己的计算机上创建这样的图像呢?好吧,这正是本书剩余部分的任务所在.不过,读者还需要知道一些基础知识,这正是我们接下来将要讨论的. 1.4.1 并非工具包 OpenGL基本上是一种底层渲染API(应用程序接口).我们不能告诉它"在什么地方绘制什么"--我们需要自己动手,通过载入三角形,应用必要的变换和正确的纹理.着色器并在必要时应用混合模式来组合

3D编程:Diffuse Lighting(漫反射光)

Diffuse Lighting(漫反射光) 不同的材质表面反射光的方式也不同.在镜面上光的反射角度与入身角度相等.当在一只猫的眼睛里看到一束怪异的光芒,这就是光的反射性:这是由于猫的眼睛反射光的方向与光源的照射方向平行,但是方向相反.漫反射表面对光的反射在各个方向上都一样. 近似计算一个漫反射光,最简单并且最常用的模型是Lambert's cosine law(朗伯余弦定律).根据Lambert's cosine law,照射到材质表面的光照亮度,与光源方向向量和面法线的夹角的余弦成正比.光源

3D编程:Real-Time 3D Rendering with DirectX and HLSL

介绍 图形编程是视频游戏,电影和科学模拟仿真背后的魔法.你在计算机屏幕上看到的每一个爆炸,颗粒以及眩光都是使用视频卡处理的.此外,你看到的每一个像素点都是通过GPU渲染和图形编程人员软件实现的,因为现代操作系统使用GPU绘制.这是一个广泛的话题,但一直以来只属于少数领域.甚至有经验的软件开发人员,通常认为渲染是一门高深的艺术,充满了复杂的数学工具和深奥的工具.另外,现代图形学的快速发展使得图形编程变成了不断前进的目标,同时建立一个起点变得更加困难. 这就是这本书的目的.通过这本书,你会学习对实时

J2ME 3D编程——第一个3D程序

编程|程序 J2ME 3D编程--第一个3D程序(附源代码) 更多文章请访问:http://blog.csdn.net/mailbomb 参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习. 关于3D编程的资料,可以查阅我的blog. 关于代码的编译和运行说明如下: 1. 以下代码在J2ME WTK2.2下面编译通过. 2. 代码分为两个文件:First3DCanvas.java和First3D

J2ME 3D编程——第一个3D程序(附源代码)

参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习. 关于3D编程的资料,可以查阅我的blog. 关于代码的编译和运行说明如下: 1.以下代码在J2ME WTK2.2下面编译通过. 2.代码分为两个文件:First3DCanvas.java和First3DMIDlet.java. 3.使用J2ME WTK2.2建立新的工程,主MIDlet类为:first3d. First3DMIDlet 4.将

回合制网游差异化竞争凸显 3D冲击第二个春天

即时制和回合制作为RPG(角色扮演游戏)的两大分类,由于不同的战斗模式,随着市场的发展逐渐形成鲜明的的用户群体.在紧张刺激的"PK式"网游的风潮中,随着上市公司及中小型公司公布2011年的产品计划,节奏缓慢相对"和谐"的回合制游戏在网游发展的第二个十年呈现出了"风水轮流转"的趋势. 十年轮回 差异化竞争路线凸显 2010年测试的新游戏中,相关统计数据显示:3D占53.3%,2.5D占16.3%,2D占30.4%.3D技术在回合制的普遍应用,3D回

《指针的编程艺术(第二版)》一第二章 指针与变量2.1 一颗星星:表示一把钥匙

第二章 指针与变量 指针的编程艺术(第二版)2-1 一颗星星:表示一把钥匙 2-2 两颗星星:表示两把钥匙 2-3 三颗星星:表示三把钥匙 2-4 练习 如果要间接访问某一变量值,我们可使用指针来完成. 2.1 一颗星星:表示一把钥匙 指针的编程艺术(第二版)本章将介绍指针变量(pointer variable)与一般变量的关系.首先介绍的是,如何定义一个指针变量,如下所示. int x=100; int *ptr = &x; 上述语句表示下列3种含义. 1.ptr是一个指针变量. 2.ptr变