3D图形算法PDF.pdf

上传人:xiang****la438 文档编号:133289837 上传时间:2020-05-26 格式:PDF 页数:14 大小:305.51KB
返回 下载 相关 举报
3D图形算法PDF.pdf_第1页
第1页 / 共14页
3D图形算法PDF.pdf_第2页
第2页 / 共14页
3D图形算法PDF.pdf_第3页
第3页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《3D图形算法PDF.pdf》由会员分享,可在线阅读,更多相关《3D图形算法PDF.pdf(14页珍藏版)》请在金锄头文库上搜索。

1、书 山 有 路 1 3D 简介 我们首先从坐标系统开始 你也许知道在 2D 里我们经常使用 Ren 笛卡儿坐标系统在平面上来识别点 我们使用二维 X Y X 表示水平轴坐标 Y 表 示纵轴坐标 在 3 维坐标系 我们增加了 Z 一般用它来表示深度 所以为表示 三维坐标系的一个点 我们用三个参数 X Y Z 这里有不同的笛卡儿三维系统可 以使用 但是它们都是左手螺旋或右手螺旋的 右手螺旋是右手手指的卷曲方向 指向 Z 轴正方向 而大拇指指向 X 轴正方向 左手螺旋是左手手指的卷曲方向指 向 Z 轴负方向 实际上 我们可以在任何方向上旋转这些坐标系 而且它们仍然 保持本身的特性 在计算机图形学 常

2、用坐标系为左手坐标系 所以我们也使用 它 X 正轴朝右 Y 正轴向上 Z 正轴指向屏幕里 矢量 什么是矢量 几句话 它是坐标集合 首先我们从二维矢量开始 X Y 例如矢量 P 4 5 一般 我们用 表示矢量 我们认为矢量 P 代表点 4 5 它是从原点指向 4 5 的有方向和长度的箭头 我们谈论矢量的长度指从原点到该 点的距离 二维距离计算公式是 P sqrt x 2 y 2 这里有一个有趣的事实 在 1D 点在单一的坐标轴上 平方根为它的 绝对值 让我们讨论三维矢量 例如 P 4 5 9 它的长度为 P sqrt x 2 y 2 z 2 它代表在笛卡儿 3D 空间的一个点 或从原点到该点的一

3、个箭头代表该矢 量 在有关操作一节里 我们讨论更多的知识 矩阵 开始 我们从简单的开始 我们使用二维矩阵 4 乘 4 矩阵 为什么是 4 乘 4 因为我们在三维坐标系里而且我们需要附加的行和列来完成计算工作 在 二维坐标系我们需要 3 乘 3 矩阵 着意味着我们在 3D 中有 4 个水平参数和 4 个垂 直参数 一共 16 个 例如 4x4 单位矩阵 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 因为任何其它矩阵与之相乘都不改变 所以称之为单位阵 又例如有矩 阵如下 10 7 22 45 sin a cos a 34 32 35 28 17 6 45 99 32 16 书 山

4、 有 路 2 有关矢量和矩阵的操作 我们已经介绍了一些非常简单的基本概念 那么上面的知识与三维图形 有什么关系呢 本节我们介绍 3D 变换的基本知识和其它的一些概念 它仍然是数学知 识 我们要讨论 有关矢量和矩阵操作 让我们从两个矢量和开始 x1 y1 z1 x2 y2 z2 x1 x2 y1 y2 z1 z2 很简单 现在把矢量乘于系数 k x y z kx ky kz 可以把上面的公式称为点积 如下表示 x1 y1 z1 x2 y2 z2 x1x2 y1y2 z1z2 实际上 两个矢量的点积被它们的模的乘积除 等于两个矢量夹角的余 弦 所以 cos V W V W V W 注意 并不表示指

5、数而是两个矢量的夹角 点积可以用来计算光线于平面 的夹角 我们在计算阴影一节里会详细讨论 现在讨论叉乘 x1 y1 z1 X x2 y2 z2 y1z2 z1y2 z1x2 x1z2 x1y2 y1x2 叉乘对于计算屏幕的法向量非常有用 OK 我们已经讲完了矢量的基本概念 我们开始两个矩阵的和 它与矢 量相加非常相似 这里就不讨论了 设 I 是矩阵的一行 J 是矩阵的一列 i j 是矩阵的一个元素 我们讨论与 3D 变换有关的重要的矩阵操作原理 两个矩阵相 乘 而且 M x N N x M 例如 A 4x4 矩阵相乘公式 如果 A aij 4x4 B bij 4x4 那么 A x B S a1

6、jbj1 S a1jbj2 S a1jbj3 S a1jbj4 S a2jbj1 S a2jbj2 S a2jbj3 S a2jbj4 S a3jbj1 S a3jbj2 S a3jbj3 S a3jbj4 S a4jbj1 S a4jbj2 S a4jbj3 S a4jbj4 其中 j 1 2 3 4 书 山 有 路 3 而且如果 AxB cik 4x4 那么我们可以在一行上写下 cik S4 j 1 aijbjk a1 a2 a3 x B Sum aibi1 b4 1 Sum aibi2 b4 2 Sum aibi3 b4 3 现在 我们可以试着把一些矩阵乘以单位阵来了解矩阵相乘的性质 我

7、们 把矩阵与矢量相乘结合在一起 下面有一个公式把 3D 矢量乘以一个 4x4 矩阵 得 到另外一个三维矢量 如果 B bij 4x4 那么 a1 a2 a3 x B Saibi1 b4 1 Saibi2 b4 2 Saibi3 b4 3 这就是矢量和矩阵操作公式 从这里开始 代码与数学之间的联系开始 清晰 变换 我们已经见过象这样的公式 t tx ty x y x tx y ty 这是在二维笛卡儿坐标系的平移等式 下面是缩放公式 s k x y kx ky 旋转等式 r q x y x cos q y sin q x sin q y cos q 以上都是二维公式 在三维里公式的形式仍然很相近

8、平移公式 t tx ty tz x y z x tx y ty z tz 缩放公式 s k x y z kx ky kz 旋转公式 围绕 Z 轴 r q x y z x cos q y sin q x sin q y cos q z 所以我们可以写出像在二维中同样的变换公式 我们通过乘以变换矩阵 而得到新的矢量 新矢量将指向变换点 下面是所有三维变换矩阵 平移 tx ty tz 的矩阵 1 0 0 0 0 1 0 0 0 0 1 0 tx ty tz 1 书 山 有 路 4 缩放 sx sy sz 的矩阵 sz 0 0 0 0 sy 0 0 0 0 sx 0 0 0 0 1 绕 X 轴旋转角

9、q 的矩阵 1 0 0 0 0 cos q sin q 0 0 sin q cos q 0 0 0 0 1 绕 Y 轴旋转角 q 的矩阵 cos q 0 sin q 0 0 1 0 0 sin q 0 cos q 0 0 0 0 1 绕 Z 轴旋转角 q 的矩阵 cos q sin q 0 0 sin q cos q 0 0 0 0 1 0 0 0 0 1 所以我们已经可以结束关于变换的部分 通过这些矩阵我们可以对三维 点进行任何变换 平面和法向量 平面是平坦的 无限的 指向特定方向的表面可以定义平面如下 Ax By Cz D 0 其中 A B C 称为平面的法向量 D 是平面到原点的距离 我

10、们可以通 过计算平面上的两个矢量的叉积得到平面的法向量 为得到这两个矢量 我们需 要三个点 P1 P2 P3 逆时针排列 可以得到 矢量 1 P1 P2 和 矢量 2 P3 P2 书 山 有 路 5 计算法向量为 法向量 矢量 1 X 矢量 2 把 D 移到等式的右边得到 D Ax By Cz 或 D A 1 x B 2 y C 3 z 或更简单 D Normal P1 但是为计算 A B C 分量 可以简化操作按如下等式 A y1 z2 z3 y2 z3 z1 y3 z1 z2 B z1 x2 x3 z2 x3 x1 z3 x1 x2 C x1 y2 y3 x2 y3 y1 x3 y1 y2

11、 D x1 y2z3 y3z2 x2 y3z1 y1z3 x3 y1z2 y2z1 三维变换 存储坐标 实现矩阵系统 实现三角法系统 创建变换矩阵 如何创建透视 变换对象 存储坐标 首先可以编写星空模拟代码 那么我们基本的结构是什么样 每一个对 象的描述是如何存储的 为解决这个问题 首先我们思考另一个问题 我们需要 的是什么样的坐标系 最明显的答案是 屏幕坐标系 相对于显示器的原点的 2D 坐标系 本地坐标系 相对于对象的原点的 3D 坐标系 但是我们不要忘记变换中间用到的坐标系 例如 世界坐标系 相对于 3D 世界的原点三维坐标系 对齐 视点 坐标系 世界坐标系的变换 观察者的位置在世界坐标

12、系的 原点 下面是坐标的基本结构 二维坐标 typedef struct 书 山 有 路 6 short x y 2D 三维坐标 typedef struct float x y z 3D 这里 我们定义了称为顶点的坐标结构 因为顶点一词指两个或两个以上 菱形边的 交点 我们的顶点可以简单地认为是描述不同系统的矢量 不同的坐标系的坐标 typedef struct 3D Local 3D World 3D Aligned Vertex t 实现矩阵系统 我们需要存储我们的矩阵在 4x4 浮点数矩阵中 所以当我们需要做变换 是我们定义如下矩阵 float matrix 4 4 然后我们定义一些函

13、数来拷贝临时矩阵到全局矩阵 void MAT Copy float source 4 4 float dest 4 4 int i j for i 0 i4 i for j 0 j4 j dest i j source i j 很简单 现在我们来写两个矩阵相乘的函数 同时可以理解上面的一些 有关矩阵相乘的公式代码如下 void MAT Mult float mat1 4 4 float mat2 4 4 float dest 4 4 int i j for i 0 i4 i for j 0 j4 j 书 山 有 路 7 dest i j mat1 i 0 mat2 0 j mat1 i 1 m

14、at2 1 j mat1 i 2 mat2 2 j mat1 i 3 mat2 3 j mat1 矩阵 1 mat2 矩阵 2 dest 相乘后的新矩阵 现在你明白了吗 现在我们设计矢量与矩阵相乘的公式 void VEC MultMatrix 3D Source float mat 4 4 3D Dest Dest x Source x mat 0 0 Source y mat 1 0 Source z mat 2 0 mat 3 0 Dest y Source x mat 0 1 Source y mat 1 1 Source z mat 2 1 mat 3 1 Dest z Source

15、x mat 0 2 Source y mat 1 2 Source z mat 2 2 mat 3 2 Source 源矢量 坐标 mat 变换矩阵 Dest 目标矩阵 坐标 我们已经得到了矩阵变换函数 不错吧 注意 这里的矩阵变换与我们学过的矩阵变换不同 一般的 Y TX T 为变换矩阵 这里为 Y XT 由于矩阵 T 为 4x4 矩阵 实现三角法系统 几乎每一个 C 编译器都带有有三角函数的数学库 但是我们需要简单的 三角函数时 不是每次都使用它们 正弦和余弦的计算是阶乘和除法的大量运算 为提高计算速度 我们建立自己的三角函数表 首先决定你需要的角度的个数 然后在这些地方用下面的值代替 f

16、loat SinTable 256 CosTable 256 然后使用宏定义 它会把每一个角度变成正值 并对于大于 360 度的角 度进行周期变换 然后返回需要的值 如果需要的角度数是 2 的幂次 那么我们 可以使用代替 它使程序运行更快 例如 256 所以在程序中尽量选取 2 的幂次 三角法系统 define SIN x SinTable 书 山 有 路 8 define COS x CosTable 一旦我们已经定义了需要的东西 建立初始化函数 并且在程序中调用 宏 void M3D Init int d for d 0 d256 d SinTable d sin d PI 128 0 CosTable d cos d PI 128 0 建立变换矩阵 下面使用 C 编写的变换矩阵代码 float mat1 4 4 mat2 4 4 void MAT Identity float mat 4 4 mat 0 0 1 mat 0 1 0 mat 0 2 0 mat 0 3 0 mat 1 0 0 mat 1 1 1 mat 1 2 0 mat 1 3 0 mat 2 0 0 mat 2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号