持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
- Swift Optional
- Swift Enum
- iOS开发 做一个三角形
- Swfit 指针类型
- Swift 属性(下)
- Swift 属性
- Swift 小结
- Swift 类与结构体(下)
- Swift 类的生命周期
- Swift 类的初始化器
- Swift 类与结构体
- OpenGL 压缩纹理
- OpenGL 隧道坐标计算
- 0penGL 像素格式及数据类型
- OpenGL 纹理对象
- OpenGL 纹理
- OpenGL 模型变化
- OpenGL 视图
- OpenGL 矩阵
- OpenGL 向量
- OpenGL 颜色混合
- OpenGL 深度测试的潜在风险
- OpenGL 浅析深度测试
- OpenGL 浅析隐藏面消除
- OpenGL 图元连接方式
- 记WKWebView与HTML完成交互两三事
- OpenGL 渲染流程图解析
- OpenGL 控制你的正方形
- OpenGL 专业名词解释
- OpenGL 环境搭建 - MacOS
之前我们探索了OpenGL中的颜色混合,今天我们一起来看一下 OpenGL中的向量内容:
向量
在 3D 笛卡尔坐标系, 基本上. ⼀一个顶点 就是XYZ 坐标空间上的⼀一个位置. ⽽而在空间中给定的一个位置 恰恰是由一个单独的 XYZ 定义的. ⽽而这这样的 XYZ 就是向量量;
在 X轴上的向量量 (1,0,0). 向量量⻓长度为1. 我们称长度为1的向量为单位向量。
向量长度(向量的模)计算公式:
如果一个向量不是单位向量,而我们把它缩放到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);