目录

介绍

使用代码

X旋转矩阵(XY平面旋转矩阵)

Y旋转矩阵(YZ平面旋转矩阵)

Z旋转矩阵(XZ平面旋转矩阵)

XYZ旋转矩阵(XY YZ XZ平面旋转矩阵)


  • 下载演示-3.5 MB

(您需要Visual Studio来编译项目。)

介绍

本文将通过删除GPU层抽象并仅使用CPU来帮助您了解3D引擎中使用的3D数学。

而且,为什么不呢,要制作一个基于体素(voxel)3D引擎。

体素(voxel)只是空间中的一个点,就像构成材料的原子一样,这是我自己的定义,对于其他引擎,体素(voxel)定义为像素体积,就像在Minecraft/Roblox中一样,但我不使用此定义。

使用代码

首先,我们需要先问几个问题:

  • 什么是空间(space)?
  • 什么是轴(axis)?
  • 什么是维(dimension)?
  • 什么是平面(plane)?
  • 什么是三角函数(trigonometric functions)?
  • 什么是向量(vector)?
  • 什么是旋转矩阵(rotation matrix)?
  • 什么是旋转(rotation)和平移(translation)?

现在让我们为这些问题提供答案:

space是由点定义的,数学上由构成空间尺寸的唯一dimensions中的若干axes定域(plane由2轴=2D空间形成)。

Trigonometric functions是sin(θ)和cos(θ)等函数,其中θ表示围绕轴的角度并在2D平面中绘制一个圆。

rotation matrix是由trigonometric functions组成的一组方程。

vector是空间中的方向(类似于GPS),是点通过rotation matrix转换(算术运算符)的结果。
该点由旋转矩阵驱动到空间中,以便到达trigo函数内部的角度所指定的方向。

1D space用一个方向上的单线/ axis表示:----------------------------

要在此轴上移动对象,公式为:

x'=Dot.x + x 向右移动

x'=Dot.x-x 向左移动

-3  -2  -1   0  +1  +2  +3
X--|---|---|---|---|---|---|--

translation在一行,1D空间中完成,因此我们可能在X-axis<font color="#007000" face=""Segoe UI",Arial,Sans-Serif">.</font>上有1  translation。

2D space只是1D space,另一条线在X-axis的90°方向上,Y代表它:

要在此2D space中添加一个对象,我们需要为该对象的每个点设置2个坐标,然后移动该对象,我们像以前一样在x-axis上对translate添加了一个对象。

但是我们也可以围绕2 axis的中心旋转对象,为此,添加是不够的,我们需要调用专门用于rotation计算的数学运算符。

rotation是在平面2D space内完成的,因此,我们有1个rotation可能围绕两个axis的中心。

这些数学运算符被称为三角函数:sin()和cos()占用两条线之间的角度:[中心,对象的点]和x-axis的cos() 和y-axis的sin()。

在视觉上,我们在一个点0°(x = 1,y = 0),我们用+90°(+逆时针的, -表示顺时针)rotation中心,结果是x = 0,y = 1。

找到这个结果的演算是:

x' = x.cos(90) - y.sin(90)
y' = x.sin(90) + y.cos(90)

从头开始检索该方程式非常容易,这就是我所做的,而且令人惊讶的是,我已经看到该方程式是Z旋转矩阵的线性形式。

这是我的操作方式:

  • 我们有一个直径为8的2D XY圆。

  • 我们设置1个点,旋转它,然后尝试检索其新位置的方程式,一旦我们对几个不同的XY组合进行运算,我们将找到最终方程式。
  • 让我们从一个红点P(4,0)开始:

  • 现在我们旋转+ 90°(θ)的这一点,并尝试找到其新位置的方程,在视觉上找到的结果为P(0, 4):

X = sin(θ) = 1 ❌
X = cos(θ) = 0 ✔Y = cos(θ) = 0 ❌
Y = sin(θ) = 1 ❌✔
Y = 4 × sin(θ) = 4 ✔
  • 因此,对于P(4, 0)和θ= 90,我们有:
X = cos(θ)
Y = 4 × sin(θ)
  • 尝试对P(4, 0)的任何其他角度以及Y为零的不同X值(对此使用mathsisfun),您会发现相同的方程式,对于X为4x,但不会改变最终方程式:
X' = 4 × cos(θ) = X × cos(θ)
Y' = 4 × sin(θ) = X × sin(θ)
  • 现在我们将红点设置为P(0, 4):

  • 我们将此点旋转+ 90°,在视觉上结果为P(-4, 0):

X = cos(θ) = 0 ❌
X = sin(θ) = 1 ❌✔
X = 4 × -sin(θ) = -4 ✔Y = sin(θ) = 1 ❌
Y = cos(θ) = 0 ✔
  • 因此,对于P(0, 4)和θ= 90,我们有:
X = 4 × -sin(θ)
Y = cos(θ)
  • 尝试使用P(0, 4)的任何其他角度以及X值为零的不同Y值,您会发现相同的方程式,其中Y的角度为4×,但不会改变最终方程式:
X = 4 × -sin(θ) = Y × -sin(θ)
Y = 4 ×  cos(θ) = Y ×  cos(θ)
  • 现在让我们总结一下:
_____ ________________ ________________
|     |                |                |
|     |     P(X, 0)    |     P(0, Y)    |
|_____|________________|________________|
|     |                |                |
|  θ  | X = X × cos(θ) | X = Y × -sin(θ)|
|     | Y = X × sin(θ) | Y = Y ×  cos(θ)|
|_____|________________|________________|

如我们所见,不同的XY组合生成不同的方程式,因此让我们对设置为0以上的X和Y进行操作:

  • 因此,我们将红点设置为P(2, 4×√3/2):

  • 现在我们将这个点旋转+ 30°,在视觉上找到的结果是P(0, 4):

X = sin(θ) = 0.5  ❌
X = cos(θ) = √3/2 ❌Y = sin(θ) = 0.5  ❌
Y = cos(θ) = √3/2 ❌

我们有一个问题,三角函数都不起作用,因此我们需要在仍然使用sin()和cos()的同时找到解决方案。

让我们回顾一下之前找到的等式:

_____ ________________ ________________
|     |                |                |
|     |     P(X, 0)    |     P(0, Y)    |
|_____|________________|________________|
|     |                |                |
|  θ  | X = X × cos(θ) | X = Y × -sin(θ)|
|     | Y = X × sin(θ) | Y = Y ×  cos(θ)|
|_____|________________|________________|

这些是我们拥有的奇特方程,如果我们有P(X, Y),它应该是两个方程的混合:

X' = X × cos(θ) X = Y × -sin(θ)
Y' = X × sin(θ) Y = Y ×  cos(θ)X' = X × cos(θ)     Y × -sin(θ)
Y' = X × sin(θ)     Y ×  cos(θ)

让我们看看添加是否有效:

X' = X × cos(θ) + Y × -sin(θ)X × cos(θ) - Y ×  sin(θ)
Y' = X × sin(θ) + Y ×  cos(θ)X = 2 × cos(θ) - 4×√3/2 × sin(θ) = 0 ✔
Y = 2 × sin(θ) + 4×√3/2 × cos(θ) = 4 ✔

完美,此方程式有效,因此最后,XY平面上的最终方程式为:

X' = X × cos(θ) - Y × sin(θ)
Y' = X × sin(θ) + Y × cos(θ)

但是,让我们消除对P(X, 0)和P(0, Y)的疑问:

  • 对于P(4, 0),我们应用+ 90°旋转,在视觉上找到的结果为P(0, 4):
X' = 4 × cos(θ) - 0 ×  sin(θ) = 0 ✔
Y' = 4 × sin(θ) + 0 ×  cos(θ) = 4 ✔
  • 对于P(0, 4),我们应用+ 90°旋转,在视觉上找到的结果是P(-4, 0):
X' = 0 × cos(θ) - 4 ×  sin(θ) = -4 ✔
Y' = 0 × sin(θ) + 4 ×  cos(θ) =  0 ✔

很好,一切正常,您可以使用自己的XY和角度值测试此方程式,以验证其是否正常运行。

这个方程是还令人惊讶地(如前面所述)的只是线性形式Z旋转(XZ平面旋转矩阵) 矩阵,乘以点叫vector,其中Z是两者axis的中心)

Rotation matrix on z:                                 Vector:_______________ _______________ _______________       _______________
|               |               |               |     |               |
|    cos(θz)    |   -sin(θz)    |       0       |     |       x       |
|_______________|_______________|_______________|     |_______________|
|               |               |               |     |               |
|    sin(θz)    |    cos(θz)    |       0       |  ×  |       y       |
|_______________|_______________|_______________|     |_______________|
|               |               |               |     |               |
|       0       |       0       |       1       |     |       z       |
|_______________|_______________|_______________|     |_______________|

3D space是2D space与另一个叫Z轴,并在XY计平面90°上。

可能的移动是translation(加法方程)和rotation(sin和cos)。

但现在rotations的次数是3,围绕Z,围绕X和围绕Y。

因为如前所述,旋转是在2D平面上进行的,但是现在我们混合使用3x 2D space/plane:

  • X/Y,Y/Z和Z/X。

因此,我们需要收集所有rotation矩阵并使用它们。

X旋转矩阵(XY平面旋转矩阵)

_______________ _______________ _______________
|               |               |               |
|       1       |       0       |       0       |
|_______________|_______________|_______________|
|               |               |               |
|       0       |    cos(θx)    |   -sin(θx)    |
|_______________|_______________|_______________|
|               |               |               |
|       0       |    sin(θx)    |    cos(θx)    |
|_______________|_______________|_______________|

Y旋转矩阵(YZ平面旋转矩阵)

_______________ _______________ _______________
|               |               |               |
|    cos(θy)    |       0       |   -sin(θy)    |
|_______________|_______________|_______________|
|               |               |               |
|       0       |       1       |       0       |
|_______________|_______________|_______________|
|               |               |               |
|    sin(θy)    |       0       |    cos(θy)    |
|_______________|_______________|_______________|

Z旋转矩阵(XZ平面旋转矩阵)

_______________ _______________ _______________
|               |               |               |
|    cos(θz)    |   -sin(θz)    |       0       |
|_______________|_______________|_______________|
|               |               |               |
|    sin(θz)    |    cos(θz)    |       0       |
|_______________|_______________|_______________|
|               |               |               |
|       0       |       0       |       1       |
|_______________|_______________|_______________|

但是我们有一个问题,如果这样做,我们将无法一起围绕XYZ axis旋转一个对象,它是一个axis 上的rotation ,其他角度设置为“零”,因为它们不在所选矩阵中。

为了解决这个问题,我们需要通过将XYZ矩阵相乘来形成1个单个矩阵(mul的顺序问题)。

XYZ旋转矩阵(XY YZ XZ平面旋转矩阵)

______________________________ ______________________________ ____________________
|                              |                              |                    |
|      cos(θy) × cos(θz)       |      cos(θy) × -sin(θz)      |      -sin(θy)      |
|______________________________|______________________________|____________________|
|                              |                              |                    |
| -sin(θx) × sin(θy) × cos(θz) | sin(θx) × sin(θy) × sin(θz)  | -sin(θx) × cos(θy) |
|    + cos(θx) × sin(θz)       |     + cos(θx) × cos(θz)      |                    |
|______________________________|______________________________|____________________|
|                              |                              |                    |
| cos(θx) × sin(θy) × cos(θz)  | cos(θx) × sin(θy) × -sin(θz) | cos(θx) × cos(θy)  |
|    + sin(θx) × sin(θz)       |    + sin(θx) × cos(θz)       |                    |
|______________________________|______________________________|____________________|

现在,我们只需要将这个rotation matrix(基于对象的角度)乘以物体的vector点,就可以在XYZ axes周围对物体进行rotate。

Obj Vec:    Rotation Matrix:_____     ______________________________ ______________________________ ____________________
|     |   |                              |                              |                    |
|  x  |   |      cos(θy) × cos(θz)       |      cos(θy) × -sin(θz)      |      -sin(θy)      |
|_____|   |______________________________|______________________________|____________________|
|     |   |                              |                              |                    |
|  y  | × | -sin(θx) × sin(θy) × cos(θz) | sin(θx) × sin(θy) × sin(θz)  | -sin(θx) × cos(θy) |
|     |   |    + cos(θx) × sin(θz)       |     + cos(θx) × cos(θz)      |                    |
|_____|   |______________________________|______________________________|____________________|
|     |   |                              |                              |                    |
|  z  |   | cos(θx) × sin(θy) × cos(θz)  | cos(θx) × sin(θy) × -sin(θz) | cos(θx) × cos(θy)  |
|     |   |    + sin(θx) × sin(θz)       |    + sin(θx) × cos(θz)       |                    |
|_____|   |______________________________|______________________________|____________________|

现在快要完成了,我们需要创建一个摄像机以能够导航到场景中。

相机由3 vectors定义:Forward,Right 和Up:

X  Y  Z
Right/Left       (1, 0, 0)
Up/Down          (0, 1, 0)
Forward/Backward (0, 0,-1)

然后,将这3个vectors分别乘以rotation matrix(基于相机的角度),因为我们需要它们中的每一个都能够移动相机Forward/Backward/Right/Left/Up/Down。

并且,将结果添加到对象向量。

例如:如果按W,使用Forward vector
        如果按S,使用-Forward vector
        如果按D,使用Right   vector

Object Vector:           Forward Vector:    __________________       __________________
|                  |     |                  |
|         x        |     |         x        |
|__________________|     |__________________|
|                  |     |                  |
|         y        |  +  |         y        |
|__________________|     |__________________|
|                  |     |                  |
|         z        |     |         z        |
|__________________|     |__________________|Object Vector:           Forward Vector:         __________________       __________________
|                  |     |                  |
|         x        |     |         x        |
|__________________|     |__________________|
|                  |     |                  |
|         y        |  -  |         y        |
|__________________|     |__________________|
|                  |     |                  |
|         z        |     |         z        |
|__________________|     |__________________|Object Vector:           Right Vector:__________________       __________________
|                  |     |                  |
|         x        |     |         x        |
|__________________|     |__________________|
|                  |     |                  |
|         y        |  +  |         y        |
|__________________|     |__________________|
|                  |     |                  |
|         z        |     |         z        |
|__________________|     |__________________|

最后,我们将另一个rotation matrix(基于相机的角度)与来自对象的每个vector点相乘,以便能够根据相机角度移动对象(通过鼠标移动进行修改)。

学习3D图形引擎中使用的基本数学相关推荐

  1. 如何学习3D建模中的3DMAX放样建模?零基础的你知道吗?

    3D之所以称为3D,就是将一个二维形体对象作为沿某个路径的剖面,而形成复杂的三维对象.同一路径上可在不同的段给予不同的形体.而这种转换的路径就称之为放样建模!今天,就来为大家介绍一下,3DMAX基础建 ...

  2. 3D游戏中的数学运用

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:[119706192]本文链接地址: 3D游戏中的数学运用 [01]3D游戏数学简介 总导:游戏中会使用 ...

  3. 活动报名丨英伟达AI Lab科学家、GET3D一作高俊:从图像中学习3D对象的生成建模...

    12月12日(周一)上午9:00「青源Live第57期丨英伟达AI Lab科学家.GET3D一作高俊:从图像中学习3D对象的生成建模」将在线举办,多伦多大学博士生.英伟达AI Lab研究科学家高俊做报 ...

  4. 线上分享会预告之深度学习在3D场景中的应用

    大家好.上周我们迎来了第一期的线上分享,三维模型检索技术介绍,此次分享是一次接力形式的分享,每周都将有一位主讲人分享,希望更多的小伙伴加入我们一起分享,也是给自己一个机会锻炼.这里先预告一下,线上直播 ...

  5. 「建模学习」游戏中的场景建模,原来是靠3D扫描建模技术完成?

    在AAA游戏和大型影视项目中,需要大量的.建筑.场景.道具乃至角色模型,依靠传统建模流程制作周期长,费时费力.如何提高效率,降低成本,优化工作流程? 国际模型新趋势-一3D扫描建模技术,正在为游戏.影 ...

  6. 机器人控制系统学习和研究中数学的重要性

    其实具备科学思维的方式非常非常难,很多情况下脑海中并非客观事实,而是充满了幻觉. 如果在各种AI工具中问及这样的问题,会得到类似如下回复: 机器人控制系统学习和研究中数学的重要性主要体现在以下几个方面 ...

  7. 在D3D中绘制一个三角形的一个完整过程(学习3D游戏笔记一)

    本笔记是基于Microsfot DirectX 9.0 SDK Update的SimpleSample生成的框架. 在3D场景中,所有的对象和模型均由三角形构成;而三角形由三个顶点构成;每个顶点不仅包 ...

  8. 【学习OpenGL】(三)——3D空间中的点与线

    一.3D空间中的点 #include <gl/glut.h> #include <math.h>#define GL_PI 3.1415fstatic GLfloat xRot ...

  9. 3D建模中的BIP骨骼镜像对称画是什么东西?

    "对称"这个词想必大家从小就学习过,小学数学里学习过堆成图形,比如圆.正三角形.等腰三角形等等.那么今天我们要引进一个新的3D建模中的词汇"BIP骨骼镜像对称画" ...

最新文章

  1. 精选26个Python实用技巧,想秀技能先Get这份技术列表!
  2. 简单比较搜索引擎与推荐系统
  3. SuperMap iDesktop 8C 进行地图SQL查询并显示结果操作示例
  4. element vue 纵向滑动条_【求助】vue element搭建的后台,侧边栏如何设置滚动条?...
  5. sql:CallableStatement执行存储过程
  6. 计算机二级证书在学校哪里领取,计算机二级证书去哪里领取
  7. redis笔记——redis事务及锁应用
  8. 360剑灵洪门崛起服务器维护,剑灵洪门崛起————【维护】8月1日更新维护公告...
  9. php nodelist,了解NodeList、HTMLCollection以及NamedNodeMap的使用(代码)
  10. python AES加密解密
  11. 2017.10.26 星际贸易 思考记录
  12. MySQL 字符集支持
  13. 菜鸟学Linux - 用户与用户组基础
  14. 这个技巧,让你更从容地使用Mac电脑~
  15. Qunee学习开发体会
  16. java 实现饼状图_怎么用JAVA 开发的圆饼图
  17. 如何下载电驴网站Verycd上的资源
  18. java sasl例子_Java Subject.doAs方法代碼示例
  19. 【大神】用ESP32自制WiFi版高清语音电话产品WiPhone,WiPhone电话应用电话小车
  20. 苹果电脑如何开启文件保险箱功能?

热门文章

  1. python考试pass or fail_Pytest官方教程-12-skip及xfail: 处理不能成功的测试用例
  2. 无法读取内存属于错误吗_索佳全站仪错误信息讲解
  3. c++读取excel_Python读取并提取xlsx数据+去趋势和高通滤波与低通滤波
  4. python 判断div 之间的内容是否为空_python实现数据结构与算法之双端队列实现
  5. 分式混合运算20道题_FAG剖分式调心滚子轴承的性能
  6. zbbix服务器搭建_zabbix服务器的搭建
  7. 电商大促首焦背景素材|大火C4D元素
  8. 专属设计师的专业领域导航网站
  9. UI设计实用素材|扁平化设计的模板
  10. Linux 如何隔离CPU核心 isolcpus=0-2