3D数学基础(二)| 向量

白玉无冰

共 1701字,需浏览 4分钟

 · 2021-12-29

3D数学基础:图形与游戏开发

前言

这是白玉无冰记录3D数学第二篇章,向量!往期目录如下:

9154dafefdac4e2c12fad89a47be0bbb.webp

在写之前,白玉无冰一直在思考如何去讲述向量,思来想去,还是以实际问题例子出发,去讲这个神奇的向量!

本文不打算讲过多的定义和推导,更多地以例子出发去探讨。如果需要更深入地理解,可参考文末给出的参考书籍与资料。

64a7dce5db77fdb081040e19a8ab4801.webp开始

基本定义

向量(vector)描述了方向和大小。向量也有自己的运算规则,向量的加减法与数乘的意义见下图。

3aeb4cc5144c6636622efeaac3429516.webp向量加法与数乘

除了向量间的加法,向量之间还存在着两种乘法:

  • 点乘(Dot Product)
  • 叉乘(Cross Product)
537744869ddf5d2f7a87b636bc0685aa.webp向量点乘与叉乘

向量反射

已知:

  • 入射向量
  • 单位法线量
  • 入射角与反射角相同

求:

  • 反射向量
654a04914454b38d36141edb4385a123.webp向量反射

反复横跳的瞄准线这篇文章也用到了反射向量的计算。

88e7182187f8ff1df840b25d42245249.webp反复横跳的瞄准线

旋转2D角色

已知:

  • 角色位置和朝向
  • 目标位置

求:

  • 角色往哪个方向旋转多少度可朝向目标位置
51b6cbdde21db98b0f2f0b1251aab2de.webp旋转2D角色

概况来说,求角度用点乘,求旋转方向用叉乘。

8694dbd08034676d0ea2b5d4eeba1ff6.webp旋转2D角色求解

在 Cocos Creator 中的 Vec2 使用 signAngle 的逻辑也是如此。

// class Vec2
/**
* @en Get angle in radian between this and vector with direction.
* @zh 获取当前向量和指定向量之间的有符号角度。

* 有符号角度的取值范围为 (-180, 180],当前向量可以通过逆时针旋转有符号角度与指定向量同向。

* @param other specified vector
* @return The signed angle between the current vector and the specified vector (in radians); if there is a zero vector in the current vector and the specified vector, 0 is returned.
*/

public signAngle (other: Vec2) {
    const angle = this.angle(other);
    return this.cross(other) < 0 ? -angle : angle;
}

判断多边形凹凸点

已知:

  • 多边形的顶点坐标(逆时针,简易多边形)

求:

  • 判断每个点的凹凸性
2365f00020303f9eb7e310e15bce7edd.webp凹凸多边形

巧用向量叉乘即可求解。

多边形裁剪图片中的切耳法用到了这个判断。

判断三角形内的点

已知:

  • 三角形三个点
  • 其中一个共面的点

求:

  • 该点是否在三角形内

判断点是否在三角形内,可以通过叉乘计算点与线的位置关系判断出。

82d40d83f4f5230bf7428a9ffb5a479f.webp点是否在三角形内

GAMES 103-02 中提到,也可用法向量判断。

842b7f3c3529eebbaa52a7d7dd1a4dd8.webp点是否在三角形内

前后左右

已知:

  • 各个飞机的坐标和黑色飞机的朝向。

求:

  • 其他飞机与黑色飞机前后左右的关系?
7baa59b161ce8ad90682f8789ee0fdab.webp前后左右

解答:

  • 点乘 -> 前后
  • 叉乘 -> 左右
1eb7545d61935da0281ed8d3115ef4d3.webp前后左右

折纸效果

【折纸效果!(2D)】中也涉及一些向量计算,这里搬运过来,详细讲解可点击文章链接查看。

85788b110bde0cb9501d3ff38af42cb0.webp折纸效果

分割多边形的点。向量间的点积正好可以帮助我们判断夹角问题。

b8e906f9cc17a1c4d75d4cd7af942f7f.webp分割

求对称点同样可以运用向量计算。

  1. 求出该顶点与中点的向量
  2. 求出该点在触摸方向的单位向量的投影(点乘),这正好是距离的一半
  3. 求出对称点坐标(距离乘方向向量+起始点坐标)
848e5c17f6ec569014820b1b5b9a619c.webp求对称点

【3D折纸效果】同样也使用到向量相关的知识。

5395dcdb60e7471398dff47fc4115947.webp效果预览

使用向量叉乘判断网格点在触摸轴的左边还是右边。

fc5660da7d26dc452dabcb6574dd2714.webp向量叉乘

矢量和平面

本段摘自《游戏编程精粹2》中的2.2章节。

已知:

  • 起点 终点
  • 平面单位法线向量 和面上的一个点
daddbcc8b3b6daeb887fdbe99224fece.webp矢量和平面

求:相对于面的高度(点乘)

ecd7b4aefc9374948b588a9713a98abe.webp相对于面的高度

求:直接与平面相交点(投影到法向量,相似三角形)

761541a99b09893b240fb8a82cea841e.webp直接与平面相交点

求:到交点的距离(两种方法)

ddeda1b12430c1ad5812a6ee0e3653d1.webp到交点的距离

计算反射点

82a5323d6737b2e3addb20deab8f8394.webp计算反射点

向量空间

本部分内容摘自《3D游戏与计算机图形学中的数学方法》1.4节,记录是为了更好的忘记。

69dba9b6ed0afe9d17861bb5a48b811d.webp向量空间

向量的基

ac86513ac4f7425f8d8a46c1051809d3.webp向量的基

加上相互垂直条件,正交基

627fcfa6991d5a7cf36618a82f7bd15d.webp正交基

再加上单位长度限制,正交规范基。

7a862e087dfda164313f22a73ec4481c.webp正交规范基

自然数

讲到向量,这里再扯点其他和向量相关的。

自然数也可以分解成正交基向量表示。互质的自然数,正好与向量垂直对应。

a93868bbac24243d33f5d100bb2075e0.webp自然数分解结束

预期白玉无冰下一篇记录关于矩阵的笔记📒。

4c85102d0182ece003a2d5ce018850bb.webp


参考资料

  • 《3D数学基础:图形与游戏开发》
  • 《Fundamentals of Computer Graphics, Fourth Edition》
  • 《游戏编程算法与技巧》
  • http://games-cn.org/
  • 《游戏编程精粹2》
  • 《3D游戏与计算机图形学中的数学方法》
  • 《数学女孩2》

更多精彩欢迎关注微信公众号


往期系列:


浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报