OpenGL 向量

168 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. OpenGL 环境搭建 - MacOS

之前我们探索了OpenGL中的颜色混合,今天我们一起来看一下 OpenGL中的向量内容:

向量

在 3D 笛卡尔坐标系, 基本上. ⼀一个顶点 就是XYZ 坐标空间上的⼀一个位置. ⽽而在空间中给定的一个位置 恰恰是由一个单独的 XYZ 定义的. ⽽而这这样的 XYZ 就是向量量;
在 X轴上的向量量 (1,0,0). 向量量⻓长度为1. 我们称长度为1的向量为单位向量。

向量长度(向量的模)计算公式:

11.001.png

如果一个向量不是单位向量,而我们把它缩放到1. 这个过程叫做标准化.将一个向量进行标准化就是将它的缩为1;也叫做单位化向量;

OpenGL 如何定义向量 【math3d库】

math3d库,有2个数据类型,能够表示一个三维或者四维向量。 M3Dvector3f可以表示一个三维向量(8,五,z) M3Dvector4f则可以表示一个四维向量 (x,Y,z,W). 在典型情况下,w坐标设为1。0。x,了,z值通过除以w,来进行缩放。而除以1.0则本质上不改 变x,五,z值。

//三维向量/四维向量的声明
typedef float M3DVector3f[3];
typedef float M3DVector4f[4] :
//声明一个三维向量 M3Dvector3f :类型
M3DVector3f vVector;
vvector:变量名
//声明一个四维向量井初始化一个四维向量
M3Dvector4f yvertex ={0,0,1,1}:
//声明一个三分量顶点数组,例如生成一个三角形
//M3DVector3f verts[] ={
    -0.5f,0.0f,0.0f,
    0.5f,0.0f,0.0f,
    0.0f,0.5f,0.0f
}:

向量 点乘

  • 向量可以进行 加法,减法计算.但是向量里有一个在开发中使用价值非常高的操作,叫做"点乘(dot prouct)" ,点乘只能发生在2个向量之间进行;
  • 2个(三维向量,单元向量 之间进行点乘运算将得到一个标量(不是三维向量,是一个标量〉。它表示两个向量之间的夹角;
  • 前提条件:2个向量必须为单位向量;
  • 动作:2个三维向量之间进行点乘
  • 结构:返回一个[-1,1]范围的值.这个值其实就是 夹角的cos值(余弦值)
  • 如何单位化向量? (£/ ×72•1/xY2.2/1×7z: 使用一个非零向量除以它的模(向量的长度),就可以得到方向相同的单位向量;
math3d 库中提供了关于点乘的API
//1.m3dDotProduct3 函数获得2个向量之问的点乘结果;
float m3dDotProduct3 (const M3DVector3f u, const M3DVector3f v);
//2.m3dcetAng1eBetweenvector3 即可获取2个向量之间夹角的弧度值;
float m3dGetAngleBetweenVector3 (const M3DVector3f u, const
M3DVector3f v):

向量 叉乘

向量之间的叉乘(cross product)也是在业务开发里非常有用的一个计算方式;2个向量之间叉乘就可以得到另外一个向量,新的向量会与原来2个向量定义的平面垂直。同时进行叉乘,不必为单位向量;

  • 前提:2个普通向量
  • 动作:向量与向量叉乘
  • 结果:向量(垂直于原来2个向量定义的平面的向量)
math3d 库中提供了了关于叉乘的API
//1.m3dCrossProduct3 函数获得2个向量量之间的叉乘结果得到⼀一个新的向量量
    void m3dCrossProduct3(M3DVector3f result,const M3DVector3f  u ,const
    M3DVector3f v);