`
izuoyan
  • 浏览: 9222225 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从零实现3D图像引擎:(7)矩阵函数库

阅读更多

1. 数学分析

1) 矩阵到底是什么,用它来干嘛?

千万不要把矩阵想复杂了,说白了,他和算盘是一类东西,矩阵根本就没有实际意义,他就是个数学工具而已,就好像敲算盘,珠子上上下下的按照一定的规律去拨弄,就能得到结果一样,矩阵是数学家们发明的一个工具,这个工具也有一系列规则,通过这些规则也可以计算出一些结果,只不过他不像算盘是用来做数字加减乘除用的,他是用来求解方程组的。学习完了矩阵的运算规则,就可以发现,所有对向量、点坐标的变换都可以通过矩阵运算来完成,这也是为什么3D图像的运算与矩阵息息相关了。

比如方程组:

x + 2y = 3

4x + 5y = 6

就可以用三个矩阵来表示他们。

系数矩阵:A =

|1 2 |

| 4 5 |

变量矩阵:B =

| x |

| y |

常量矩阵:C =

| 3 |

| 6 |

所以上面的方程组也可以写成是:A * B = C

所以解方程组的问题也变成了求B。后面我会介绍到矩阵的逆,就会说到如何用A和C矩阵来求B。

2) 单位矩阵

定义:矩阵的主对角线所有元素都是1,其余都是0。用I表示。

如:

| 1 0 |

| 0 1 |

或:

| 1 0 0 |

| 0 1 0 |

| 0 0 1 |

单位矩阵的重要用途是因为他满足下面的公式:

A* I = I * A = A

3) 零矩阵

非常简单:

| 0 0 |

| 0 0 |

所有元素都是零。

4) 矩阵加法和减法

两个矩阵的相应元素相加或相减即可。

5)矩阵的转置

将矩阵的行和列元素交换,就是转置,比如A =

| 0 1 2 |

| 3 4 5 |

的转置为 A' =

| 0 3 |

| 1 4 |

|2 5 |

6) 矩阵与标量相乘

每个元素都乘以标量即可。

7) 矩阵与矩阵相乘

并不是任意两个矩阵都可以相乘的,矩阵A和矩阵B相乘,只有它们的内维数相等,才有意义。

比如,A是m×nj矩阵,那么B必须是n×r矩阵。

运算法则是:A*B=C,那么Cij = A中第i行的向量与B中第j列的向量的点积。

比如A =

| 0 1 |

| 2 3 |

B =

| 0 1 2 |

| 3 4 5 |

那么C =

| (0,1).(0,3) (0,1).(1,4) (0,1).(2,5) |

| (2,3).(0,3) (2,3).(1,4) (2,3).(2,5) | =

| (0*0+1*3) (0*1+1*4) (0*2+1*5) |

| (2*0+3*3) (2*1+3*4) (2*2+3*5) | =

| 3 45 |

| 9 14 19 |

8) 矩阵运算定律

1. A + B = B + A

2. A + (B + C) = (A + B) + C

3. A * (B * C) = (A * B) * C

4. A * (B + C) = A * B + A * C

5. k * (A + B) = k * A+ k * B

6. (A + B) * C = A * C + B * C

7. A * I = I * A = A

注意:矩阵一般不满足乘法交换律,即 A * B 一般不等于 B * A

9) 矩阵的行列式

行列式来源:每一个方形矩阵可以和一个成为矩阵的行列式的实数相对应,这个数值将可以告诉我们矩阵是否是奇异的。

矩阵A的行列式表示为det(A)

在实际应用中,我们需要通过求行列式来求矩阵的逆,所以行列式的意义非常重大。

具体如何通过上面的来源来推导出求行列式的公式,在任何一本线性代数数上都有,我就省略了。公式如下:

对于n×n矩阵A,

det(A) = a11 (当n=1)

det(A) = a11 * A11 + a12 * A12 + ... + a1n * A1n (当n>1时)

其中A1j = (-1)的1+j次方 * detA(M1j) (其中j = 1, ... , n)

为第一行元素的余子式

说点具体的吧,2×2矩阵

| a b |

| c d |

的行列式为det(A) = a*d - b*c

3×3矩阵

| a00 a01 a02 |

| a10 a11 a12 |

| a20 a21 a22 |

的行列式为det(A) = a00*a11*a22 + a01*a12*a20 + a02*a10*a21 - a02*a11*a20 - a01*a10*a22 - a00*a12*a21

这个公式是使用克莱姆法则求出的,为什么上面我介绍余子式,因为使用克莱姆法则来求3×3矩阵的行列式要进行9次乘法和5次加法。但如果我们使用余子式来求行列式,则可以减少两次乘法:

det(A) = a00*(a11*a22 - a21*a12) - a01*(a10*a22 - a20*a12) - a02*(a10*a21 - a20*a11)

10) 矩阵的逆

定义:对于矩阵A,有矩阵A-1,使得A * A-1 = I,则A-1为矩阵A的逆。其实这个A-1就是A的乘法逆元。

数学上还有这种说法:如果一个n×n矩阵,如果不存在乘法逆元,则称这个矩阵是奇异的。

他的作用十分重要,比如上面说的方程组:

A * B = C,求矩阵B

那么通过将方程两边同时乘以A-1,则:

(A-1 * A) * B = A-1 * C

B = A-1 * C,这样就可以求得B了。

2. 代码实现

1) 我提供了1×3、1×4、3×3、4×4矩阵,因为对于2D点或向量,可以使用齐次坐标在3×3矩阵中存放,同理,对于3D点或向量可以使用齐次坐标在4×4矩阵中存放,所以只需要写上面这4种矩阵的运算函数,就可以满足所有的3D矩阵变换了。这次我把以前写的向量的结构体也做了修改,因为向量、点,通常可以表示为一个1×3或1×4矩阵,所以我把他们的内存结构修改为和矩阵的相同,以便直接强制转换。

下面是矩阵结构体的定义:

下面是对原向量和点的结构体的修改:

2) 矩阵操作函数实现

3. 代码下载

完整项目代码下载:>>点击进入下载页<<

分享到:
评论

相关推荐

    3d引擎源代码

    7. **物理引擎**:虽然不是所有3D引擎都内置物理引擎,但许多引擎会集成或支持与物理引擎(如Bullet或PhysX)的接口,用于模拟碰撞和重力。 8. **用户界面(UI)**:3D引擎通常也需要提供2D UI元素,如菜单、提示和...

    在VB6.0和DX9中实现3D图象编程

    VB6.0是Microsoft Visual Basic的一个老版本,虽然它不支持原生的3D图形功能,但可以通过与其他库如DirectX结合来实现3D图像编程。 DirectX 9是微软开发的一套应用程序接口(API),主要用于多媒体,尤其是游戏和...

    flex-3D图像环绕虚拟现实代码

    本篇文章将深入探讨如何利用Flex实现3D图像环绕和180度摄影机镜头变换效果,为3D图像演示开发提供有价值的参考。 首先,我们需要理解Flex的核心——ActionScript 3.0。这是一种强大的面向对象的编程语言,支持高级...

    VB做的几何3D引擎

    3. **矩阵运算**:3D变换,如平移、旋转和缩放,通常通过矩阵运算实现。VB可能需要利用数学库或自定义函数来处理这些计算。 4. **投影**:将3D空间中的物体投影到2D屏幕上,包括透视投影和平行投影。 5. **光照和...

    TypeScript图形渲染实战:基于WebGL的3D架构与实现_源代码+视频.zip

    通过实际操作,你可以学习如何从零开始构建一个3D渲染引擎,从加载模型、处理输入到优化性能。 总结来说,这个资源包是一个宝贵的起点,无论你是对3D图形编程感兴趣,还是希望提升TypeScript的实践技能,都可以从中...

    矩阵运算的内库

    在实际项目中,例如在游戏引擎中处理3D图形变换,或者在机器学习库中构建神经网络模型,矩阵运算的内库都能发挥巨大作用。对于VS2008用户,只需确保库的兼容性,通过复制粘贴代码或者使用迁移工具,就可以将该内库...

    实验五_(源程序2).rar_OPenGl实现_opengl模型_opengl矩阵_physicale1d

    在“实验五_(源程序2).rar_OPenGl实现_opengl模型_opengl矩阵_physicale1d”这个实验中,我们将深入探讨OpenGL如何处理矩阵变换、模型视图变换以及投影变换,这些都是在3D图形渲染中不可或缺的基础。 1. **OpenGL...

    DirectX3D|DirectX3D支持库

    这个"DirectX3D支持库"可能是一个包含了一系列用于DirectX3D编程的工具、库文件和文档的集合。 首先,DirectX3D的核心部分是Direct3D,它是DirectX的一个子组件,专注于3D图形处理。Direct3D允许程序员直接与硬件...

    基于opencv与wechat_qrcode实现的JS版二维码图像识别库.zip

    Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像...

    薄荷引擎,基础Java的3D游戏引擎。创建方块沙盒游戏,创建渲染.zip

    OpenGL是一个强大的跨语言、跨平台的图形库,用于绘制2D和3D图像;JavaFX则提供了丰富的UI组件和多媒体支持,可以用来创建桌面应用和富互联网应用。 3. **数学与几何**:3D游戏中的物体旋转、平移和缩放等操作需要...

    3D_pygame3D_Pygame_3d_

    然而,Pygame并不直接支持3D图形,但通过一些技巧和扩展,我们可以利用Pygame构建简单的3D渲染引擎。这个项目,"3D_pygame3D_Pygame_3d_",显然就是这样一个尝试,它旨在使用Pygame实现3D图形的基本功能。 首先,让...

    JavaScript3D实例

    `3DEngine.js`是核心3D引擎脚本,它实现了3D图形的基本功能,如矩阵运算、几何体构建、纹理映射、光照计算等。这个文件包含了一系列的类和方法,用于创建、操作和显示3D对象。3D引擎通常会有如`init()`函数来初始化...

    带有Pygame、Numpy、Numba的Python软件3D引擎(对象渲染器)_Python_下载.zip

    在3D渲染引擎中,Numba可以优化那些计算密集型的函数,例如顶点着色、纹理映射、深度测试等,通过动态编译将Python代码转化为C或CUDA代码,实现硬件级别的加速。 这个软件3D引擎很可能实现了基本的3D对象渲染,包括...

    rokonengine使用WebGL2WebAssembly的混合3D引擎

    gl-matrix是一个JavaScript库,提供了一系列用于3D数学计算的函数,包括向量操作、矩阵变换等,对于3D图形编程至关重要。glmw实现了同样的功能,但因其C语言基础,可以更高效地在WebAssembly中运行。 在JavaScript...

    C3D:用C编写的OpenGL 3D游戏引擎

    OpenGL是一个跨平台的API,用于生成2D、3D图像,广泛应用于游戏开发、科学可视化和虚拟现实等领域。C3D通过C语言的简洁性和效率,为开发者提供了构建3D游戏的基础框架。 1. **C语言基础**: C3D的源代码是用C语言...

    Introduction to 3D Game Programming with DirectX 9.0(中文版)

    - 这些函数通常在DirectX的D3DX库中实现。 **平面** - **D3DX平面**: DirectX中用于表示平面的类。 - **点和平面的空间关系**: 可以通过点到平面的距离来判断点和平面的位置关系。 - **创建平面**: 创建平面需要...

    3D大图切换效果

    2. **模型创建**:3D图像的构建通常从基础几何形状开始,如立方体、球体或锥体,然后通过编辑顶点、边缘和面来塑造所需的形状。在大图切换效果中,可能需要将图片包裹在一个3D模型上,例如一个立方体的六个面上。 3...

    Python库 | smpr3d-0.0.1.tar.gz

    2. **渲染引擎**:一个强大的3D库必然包括渲染引擎,它负责将3D模型转换成2D图像,处理光照、纹理映射、深度缓冲等视觉效果。smpr3d可能集成了OpenGL或Pygame等库,以实现高效的3D渲染。 3. **交互性**:在许多应用...

    3D图片效果

    "工具"则可能指代了用于创建3D图像的各种软件和库,如建模软件Blender、WebGL框架Three.js,或者是游戏引擎Unreal Engine或Unity。 【压缩包子文件的文件名称列表】"jsad4"可能是压缩包内的一个文件,但由于缺乏...

    演示ms3d动画的例子

    3. **3D矩阵运算**:`matrix.c`包含用于处理3D空间变换的函数,如旋转、平移和缩放。这些矩阵运算对于正确地定位和绘制3D对象至关重要。 4. **图像处理**:`image.c`可能用于加载和处理2D纹理,这是3D模型上应用...

Global site tag (gtag.js) - Google Analytics