从0开发游戏引擎之游戏引擎底层数学库实现

简介: 矩阵相乘: 先说什么是行什么是列,横着的就是行,竖着的就是列。可以看一下图片1.1,别弄过了。不然一会计算一起全都弄饭了算起来就全错。 计算说的简单点就是每一行乘上每一列,然后把算出来的结果保存到一个新的矩阵对应的n行m列中。

这篇文章主要是讲了矩阵的相乘、旋转、平移、缩放、绕轴翻转、求逆、求转置等运算。


矩阵一共写了两套,一个是给2D元素使用的,一套是给3D对象使用的,这里为了减少篇幅,只写4*4的矩阵的运算,原理和3*3矩阵一直,相比之下比3*3矩阵困难,理解了4*4的运算自然也就理解3*3的运算了。


矩阵相乘:  先说什么是行什么是列,横着的就是行,竖着的就是列。可以看一下图片1.1,别弄过了。不然一会计算一起全都弄饭了算起来就全错。   计算说的简单点就是每一行乘上每一列,然后把算出来的结果保存到一个新的矩阵对应的n行m列中。其实这个可以从结果出发反着看比较容易能看懂,比如说我要计算mat[0][0]这个mat的第0行第0列怎么算? 就是让


a[0][0]*b[0][0]+


a[0][1]*b[1][0]+


a[0][2]*b[2][0]+


a[0][3]*b[3][0] 得到的结果就是mat[0][0]想要的结果


程序1.1


Matrix3D Matrix3D::operator*(Matrix3D &mat)
{
  Matrix3D temp;
  for (int i = 0; i < 4; i++)
  {
    for (int j = 0; j < 4; j++)
    {
      temp.m[i][j] =
        m[i][0] * mat.m[0][j] +
        m[i][1] * mat.m[1][j] +
        m[i][2] * mat.m[2][j] +
        m[i][3] * mat.m[3][j];
    }
  }
  return temp;
}



3db0244802a64d05a81aad1d5d844424.jpg


矩阵绕X轴旋转:直接套用图1.2 公式就可以:


ff6c9d607350467e99933d6b33f458df.jpg


但是大家一定会有疑问,公式里不是这样的呀?为什么行列正好反过来了,这是因为OpenGL虽然用的是行矩阵,但是是列主序。相当于存空间信息的时候要以列主序的方式去存。


下文有具体解释什么是行主序,什么是列主序列,这里就不展开讲这个了。


https://www.jianshu.com/p/bfc8327eaad3


程序1.2


void Matrix3D::XRotate(float angle)
{
  m[1][1] =cos(GL_PI/180*angle) ; m[1][2] =sin(GL_PI/180*angle) ;
  m[2][1] =-sin(GL_PI/180*angle); m[2][2] =cos(GL_PI/180*angle) ;
}


矩阵绕Y轴旋转:同上直接套图1.3公式,空间信息存成列主序列:


6e98e15d1a1a4e4490544ab22b80b8bd.jpg


程序1.3


void Matrix3D::YRotate(float angle)
{
  m[0][0] =cos(GL_PI/180*angle); m[0][2] =-sin(GL_PI/180*angle) ;
  m[2][0] = sin(GL_PI / 180 * angle); m[2][2] =cos(GL_PI/180*angle);
}


矩阵绕Z轴旋转:同上直接套图1.4公式,空间信息存成列主序列:


1237eb9a33064ece907383e017dfd1e3.jpg

相关文章
|
人工智能 安全 Unix
游戏编程之九 设计工具之游戏引擎
游戏编程之九 设计工具之游戏引擎
84 0
|
6天前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
19 4
ly~
|
1月前
|
存储 缓存 算法
如何使用 C 语言实现高效的图形渲染?
使用 C 语言实现高效图形渲染可从选择图形库、优化数据结构与算法及利用硬件加速等方面着手。推荐使用 OpenGL 或 SDL 进行图形绘制。OpenGL 功能强大,支持 2D 和 3D 图形,需熟悉其绘图流程;SDL 则提供简单易用的接口。优化方面,合理选择数据结构如数组、哈希表等,使用高效算法如 LOD 可提升渲染速度。利用 GPU 加速和多线程渲染亦能显著提高效率。此外,纹理映射和管理也是关键,适当加载和缓存纹理,减少不必要的绘制操作如视口裁剪和背面剔除,均可增强渲染性能。
ly~
59 5
|
6月前
|
数据可视化 vr&ar 开发工具
Unity游戏开发引擎是什么?有哪些优点
Unity引擎是一款由Unity Technologies开发的跨平台游戏开发引擎,广泛用于创建2D和3D游戏以及其他交互式内容,如虚拟现实(VR)和增强现实(AR)应用程序。
118 3
|
6月前
|
开发框架 Linux API
初步探索Pyglet库:打造轻量级多媒体与游戏开发利器
初步探索Pyglet库:打造轻量级多媒体与游戏开发利器
87 0
|
6月前
|
Linux API 开发者
SDL库入门:掌握跨平台游戏开发和多媒体编程(一)
SDL库入门:掌握跨平台游戏开发和多媒体编程
651 1
|
6月前
|
编解码 网络协议 编译器
SDL库入门:掌握跨平台游戏开发和多媒体编程(二)
SDL库入门:掌握跨平台游戏开发和多媒体编程
344 0
BXA
|
程序员 C++ 开发者
使用C++特性构建游戏引擎
游戏引擎是用来设计、开发和构建计算机游戏的软件框架。它们由一些基本的工具和程序构成,可帮助游戏设计师和开发者轻松地创建、管理和优化游戏。基本上,游戏引擎是实现游戏的所有技术的一个集合
BXA
165 0
从0开发游戏引擎之游戏引擎底层数学库实现
从0开发游戏引擎之游戏引擎底层数学库实现
|
定位技术
从0开发游戏引擎之 序言(引擎内主要模块)
从0开发游戏引擎之 序言(引擎内主要模块)
下一篇
无影云桌面