从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
游戏编程之九 设计工具之游戏引擎
游戏编程之九 设计工具之游戏引擎
100 0
|
3月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
114 4
|
6月前
|
前端开发 Android开发 开发者
移动应用开发的未来:跨平台框架与原生开发的较量
在数字时代的浪潮中,移动应用已成为我们日常生活不可或缺的一部分。随着技术的进步和用户需求的多样化,开发者面临着选择何种开发模式以满足市场的挑战。本文将深入探讨移动应用开发领域中的两大阵营——跨平台框架与原生开发,通过比较它们的优势与局限,揭示未来移动应用开发的趋势和挑战。
96 1
|
7月前
|
机器学习/深度学习 前端开发 开发者
探索移动应用开发的未来:跨平台框架与原生开发的较量
【7月更文挑战第26天】随着智能手机和平板电脑的普及,移动应用开发已经成为软件开发中增长最快的领域之一。本文将深入探讨移动应用开发的现状与未来趋势,重点对比分析跨平台框架与原生开发的优劣,以及它们如何影响开发者的选择和最终用户体验。通过案例研究和技术演进的分析,我们将揭示在快速变化的移动市场中保持竞争力的关键策略。
64 2
|
7月前
|
人工智能 Android开发 开发者
探索移动应用开发的未来:跨平台框架与原生技术的较量
随着移动设备成为我们生活中不可或缺的一部分,移动应用的开发也迎来了前所未有的挑战和机遇。本文将深入探讨移动应用开发的两大主流技术——跨平台框架与原生开发,通过对比分析它们的优势与局限性,揭示未来移动应用开发的趋势。文章还将讨论如何结合这两种技术以优化开发流程,提高应用性能和用户体验,为开发者提供实用的指导和建议。
|
7月前
|
开发框架 Dart 前端开发
移动应用开发的未来:跨平台框架与原生系统之争
【5月更文挑战第72天】本文深入探讨了移动应用开发领域的最新趋势,重点关注跨平台开发框架与原生操作系统之间的竞争。文章首先概述了移动应用的重要性及其在现代社会中不断增长的需求。随后,分析了当前流行的跨平台工具如React Native和Flutter,以及它们如何使得开发者能够用单一代码库为不同操作系统构建应用程序。此外,文中还讨论了这些工具与苹果iOS和谷歌Android等原生系统之间的比较,以及它们在性能、用户体验和市场接受度方面的差异。最后,文章预测了未来移动应用开发可能的发展方向,并提出了对开发者和企业的具体建议。
|
9月前
|
安全 Swift Android开发
构建移动应用:Swift vs Kotlin —— 两大主流语言的对决
【5月更文挑战第11天】Swift与Kotlin在移动应用开发中各有优势。Swift是iOS开发的首选,以其简洁语法、高性能和类型安全著称;而Kotlin是Android的官方推荐语言,以其与Java的无缝互操作、空安全特性和简洁代码受到青睐。两者在语法简洁性、性能和社区支持上表现优秀,但平台兼容性不同。开发者应根据项目需求和目标平台选择合适的语言。
|
9月前
|
前端开发 开发工具 Android开发
探索移动应用开发的未来:跨平台工具与原生系统之争
【4月更文挑战第19天】 在本文中,我们将深入探讨移动应用开发领域的两个关键趋势:跨平台开发工具的兴起和移动操作系统的最新进展。文章将分析如何通过使用如Flutter、React Native等流行的跨平台框架来简化开发流程并扩大应用的可及性,同时也会探讨这些解决方案与针对特定操作系统(如iOS的Swift和Android的Kotline)的原生开发之间的利弊。此外,我们还将评估移动操作系统的最新功能,包括它们如何通过增强的安全性、性能改进以及用户界面的创新来支持开发者社区。本文旨在为开发者提供一个全面的视角,帮助他们在不断变化的技术环境中做出明智的选择。
|
9月前
|
开发工具 UED 开发者
移动应用开发的未来:跨平台与原生之争
【2月更文挑战第30天】随着移动设备成为我们生活中不可或缺的一部分,移动应用开发也成为了软件工程的一个重要分支。本文将探讨移动应用开发的两大主流策略——跨平台开发和原生开发,以及它们在未来的发展趋势。
|
9月前
|
JavaScript 前端开发 安全
WebAssembly 的魅力:高效、安全、跨平台(上)
WebAssembly 的魅力:高效、安全、跨平台(上)
WebAssembly 的魅力:高效、安全、跨平台(上)