OpenGL + OpenGL ES +Metal 系列文章汇总

  • 计算机图形学第一准则:看上去是对的就是对的,简单记为近似原则
  • OpenGL是基于3D的,屏幕是2D的
  • OpenGL中使用的是列向量

左手系&右手系

  • OpenGL更多的是基于左手系
  • 线性代数更多是基于右手系
  • 3D图形学中常用坐标系
    • 世界坐标系:系统的绝对坐标系
    • 物体坐标系:物体产生关联
    • 摄像机坐标系/照相机坐标系
    • 惯性坐标系:物体坐标系转换为世界坐标系的 “半途”,目的是为了减少复杂度,是一个过渡
  • eg:以下情景基于什么坐标系?
    • 书在我的西边还是北边?==> 东南西北 – 世界坐标系
    • 计算机在我的前面还是后面?==> 上下左右 – 物体坐标系
    • 从一个房间移动到另一个房间 ==> 寻路型 – 世界坐标系
    • 你能看见我的计算机吗? ==> 摄像机坐标系

向量

  • 存储 – 数组

  • 图形学中:最多到4维

    • 2D:x、y
    • 3D:x、y、z
    • 4D:x、y、z、w
  • 零向量:没有方向,没有长度 即 模 = 0

  • 负向量 = (-1).向量, 将向量中的每个数都乘以 -1

    • 几何意义:得到一个与原向量大小相等,方向相反的向量
  • 向量大小计算 即 模的计算 = 向量中所有数的平方和,再求根号

    • 2D向量几何意义:直角三角形最长边的边长
  • 标量与向量的运算总结

    • 标量不能与向量进行加减运算
    • 标量与向量可以相乘,且满足交换律,不需要写乘号
    • 向量可以除以标量,即相当于向量乘以一个标量的倒数 即 v(向量)/k = v 乘以 1/k
    • 标量与向量的乘除 优先级高于 加减
    • 标量不能除以向量,且向量不能除以另一个向量
    • 乘法的特殊情况:负向量,即 向量 乘以 标量-1
    • 几何意义: 以因子(k 即 标量)缩放向量的长度,如果k<0, 向量的方向就会相反
      • 当k = -1时,向量仅翻转,得到大小相等,方向相反的向量
      • 当k = -2时,向量是先翻转,再放大,即-2可以看成(-1)乘以2
  • 向量标准化

    • 向量标准化 = 向量 / 向量的模,且向量 != 0
    • 标准化向量 :是向量长度 = 1,不等于单位向量,单位向量是主对角线数为1,其他全为0,单位向量是标准化向量
  • 向量的加减总结

    • 向量不能与标量或者维度不同的向量相加减
    • 向量加法满足交换律
    • 向量减法不满足交换律,只有当 a=b 时, a-b = b-a
    • 向量加法几何意义:平移向量
  • 向量的距离公式

    • 向量a与向量b的距离公式 = ||b-a|| = b与a对应位置数差的平方和,再求根号
    • 几何意义:两点间的距离
  • 向量的点乘总结

    • 满足交换律,因为点乘结果是一个标量
    • 几何意义:两向量的夹角,即 a · b = |a||b|cosα ==> α = arccos(a·b / |a||b|),当a、b是单位向量时, α = arccos(a·b)
a·b 夹角α a和b
> 0 (0°,90°) 方向基本相同
= 0 90° 正交
<0 (90°,108°) 方向基本相反
  • 根据已知的向量v和向量n,且v2平行于n,v1垂直于n,求向量v2和向量v1

    • v2平行于n: v2 = n(|v2| / |n|)
    • cosα = |v2| / |v| ==> |v2| = cosα·|v|
    • 将|v2|代入v2 ==> v2 = n(cosα·|v| / |n|)
    • 分子分母同时乘以|n| ==> v2 = n(cosα·|v|·|n| / |n|²)
    • 根据a · b = |a||b|cosα ==> v2 = n(v·n / |n|²),此时求得v2
    • 根据v2求v1,因为v1 + v2 = |v| ==> v1 = |v| - v2
    • 将v2公式代入v1 ==> v1 = |v| - n(v·n / |n|²)
  • 向量叉乘总结【常用】

    • 向量叉乘运算规则如下
    • 向量的叉乘优先级高于点乘
    • 几何意义
      • a × b = c,c垂直于a和b构成的平面,即c是该平面的法线,分别与a,b都垂直
      • a × b = c,即|c| = |a||b|cosα
    • 叉乘既不满足交换律,也不满足结合律
    • 任何向量与自己叉乘等于零向量,即 向量a × 向量a = 0

矩阵

  • 矩阵在OpenGL中推荐使用一维数组存储

  • 方阵:行=列的矩阵

  • 向量可以当做1*n(行向量) / n*1(列向量)的矩阵使用

  • 标量和矩阵的乘法:将矩阵中的每个数都乘以标量

  • 矩阵与矩阵相乘,即 A₃*₂ * B₂*₄ = C₃*₄,A的列数必须匹配B的行数(记法图示如下)

  • 矩阵乘法总结

    • 当S是单位矩阵且乘法有意义,任意矩阵M乘以方阵S,,那么得到的结果就是原矩阵,即MI = IM = M
    • 矩阵乘法不满足交换律,即AB != BA
    • 矩阵乘法满足结合律,前提是ABC的维数使其乘法有意义,即 (AB)C = A(BC)
    • 矩阵乘法也满足与标量/向量的结合律,即(kA)B = k(AB) = A(kB); (vA)B = v(AB)
    • 矩阵乘积的转置 相当于 先转置矩阵,然后以相反顺序相乘,即(AB)ᵀ = BᵀAᵀ
  • 向量与矩阵乘法总结

    • 行向量左乘矩阵,结果是行向量
    • 列向量右乘矩阵,结果实列向量
    • 结果向量中每个元素都是原向量与矩阵中单独行/列的点积
    • 矩阵-向量成法满足对向量加法的分配律,即 (v+w)M = vM + wM,其中v,w是向量,M是矩阵
  • 基向量:单位向量

    • p、q、r 定义分别指向+x,+y,+z⽅方向的单位向量量,v = xp+yq+zr

    • 矩阵M对应到坐标轴的单位向量如图所示

    • 矩阵的每一行都能解释为转换后的基向量

  • 矩阵的几何意义

    • 方阵的行能被解释为坐标的基向量
    • 为了将向量从原坐标变换到新坐标,需要用向量乘以一个矩阵
    • 线性变换:从原坐标系到基向量定义的新坐标系的变化
    • 零向量乘以任何矩阵仍是零向量

2D下的旋转矩阵公式推演

核心动画CoreAnimation中苹果官方文档有提到

  • 2D下的旋转时围绕原心旋转的

  • 三角函数表

三角函数/角度 0(0°) π/2(90°) π(180°) 3π/2(270°) 2π(360°)
sinα 0 1 0 -1 0
cosα 1 0 -1 0 1
tanα 0 不存在 0 不存在 0
cotα 不存在 0 不存在 0 不存在

旋转时向量的变化与三角函数值的关系

  • 旋转变化如图所示

  • 向量与三角函数值的关系

3D下的旋转矩阵公式推演

  • 3D下的旋转时围绕某个轴旋转的,当围绕哪个轴,哪个轴的矩阵中所对应的行和列就用基向量表示

    • 围绕x轴旋转,x轴不会发生变化,所以x对应的矩阵行用基向量表示,图示如下

    • q向量的值变化过程为: +y(起始) ==> +z ==> -y ==> -z
      1 0 0
      0 0 1
      0 1 0
      0 0 -1
      0 -1 0

    • r向量的值变化过程:+z(起始) ==> -y ==> -z ==> +y
      0 0 1
      0 -1 0
      0 0 -1
      0 1 0

    p、r变化过程图示为

    与三角函数的关系如图所示

  • 围绕Y、围绕Z与围绕x类似

    • 围绕Y轴时R的矩阵:010表示的是基向量,围绕谁懂,谁就必须由基向量表示
    • 围绕Y轴时R的矩阵:001表示的是基向量

缩放与平移矩阵公式推演

  • 2D缩放:基向量p和q分别乘以标量k
  • 平移:在哪个轴平移,将这个轴的对应的值与平移距离相加

3D数学基础 简要归纳相关推荐

  1. 《3D数学基础》1.8 混合积

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  2. 《3D数学基础》系列视频 1.5 向量的夹角

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  3. 《3D数学基础系列视频》1.1向量基本概念

    今天带来的是系列最新视频,关于向量的内容 本次视频,主要讲解一下向量的基本概念. 国内网盘: http://pan.baidu.com/s/1c0ldm5U 苹果iTunes U注册代码: 1班:EF ...

  4. 3d数学基础学习总结

    3d数学基础目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 ...

  5. 《3D数学基础》实践1 向量类代码分析

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  6. 3D Math Primer for Graphics and Game Development -- 图形与游戏开发(3D数学基础) (简介)...

    3D Math Primer for Graphics and Game Development //z 2014-04-28 13:18:20 L.247'38500 BG57IV3@XCL T20 ...

  7. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  8. 3D数学基础——Rotator类的C++实现

    Rotator类的C++实现 FRotator类用来以欧拉角形式保存方位,使用pitch-yaw-roll进行约定,类的定义如下: #pragma once #include "FVecto ...

  9. 3D数学基础及坐标系统

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较

    矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...

最新文章

  1. Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
  2. 【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )
  3. 面对滚滚而来好政策 安防行业该如何发展
  4. 我们是如何做DevOps的?
  5. DevOps组织如何选取拓扑结构以提升协作效能
  6. adam算法效果差原因_信电学院本科生提出AI新算法:速度比肩Adam,性能媲美SGD,ICLR领域主席赞不绝口...
  7. java canvas旋转_在HTML5 Canvas上将图像旋转90度
  8. 严重: Catalina.stop: java.net.ConnectException: Connection refused: connect
  9. PAT甲级1013 (图,DFS举例详解)
  10. Chrome插件开发(chrome-extension)
  11. uni-app 小程序引入字体图标
  12. winrar压缩软件免费版
  13. laya龙骨换装_Laya的骨骼换装
  14. [NeRF]学习笔记(持续更新中)
  15. 第一行代码-第二版(郭霖著)笔记十(Service)
  16. CISCO WLC的配置备份与导入
  17. 帝国CMS7.5仿千图网图片素材下载模板升级版
  18. web前端大作业:旅游网页主题网站设计——武汉旅游网页设计(11页)HTML+CSS+JavaScript
  19. mysql 内存调整_mySQL内存及虚拟内存优化设置
  20. 操作系统教程(第六版)骆斌 第五章文件管理课后习题答案

热门文章

  1. 御剑情缘服务器维护吗,御剑情缘常见问题 解决方法分享
  2. 计算机科学导论课后感,关于《计算机科学导论》课程教学的思考
  3. 计算机科学导论第8章答案,第8章计算机科学导论.ppt
  4. 易语言之今日头条新闻收集源码
  5. 程序员常用不常见很难得的地址大全
  6. CodeProject上的一些摘抄
  7. 数据分析师初级—中级—高级,每个阶段都需要学习什么?
  8. html绘制小球并跟随鼠标移动,Canvas跟随鼠标炫彩小球的实现
  9. cad解除块的快捷命令_cad退出块编辑_cad常用快捷键命令表_cad打印快捷键
  10. 针对我国——国产数据库进行分析