1. 矩阵初始化
- 初始化单位矩阵
- 操作矩阵
- glUniformMatrix4fv(u_matrix,1,GL_FALSE,matrix);
- 参数 u_matrix 是shader 里面的uniforma 值
- 参数1 是 几个矩阵 一个矩阵
- 参 数 GL_FALSE 在OpenGL中是以列为主序, 如果是true 那么行和列会进行交换
- 参数 matrix 自己初始化的矩阵指针.
static void initMatrix(float *matrix) {
//上面的矩阵 1的位置 是 位置数量除以5 余0
for (int i = 0; i < 16; ++i) {
if (i % 5 == 0) {
matrix[i] = 1;
} else {
matrix[i] = 0;
}
}
}
//自己建立的矩阵
float matrix[16];
//使用矩阵
glUniformMatrix4fv(u_matrix, 1, GL_FALSE, matrix);
原始:
2. 矩阵操作
右手坐标系
旋转矩阵
要旋转2d 图形 那么就需要沿着Z 轴旋转.
旋转公式
公式:
(弧度)
角度转弧度:
弧度 = 角度 * (PI / 180.0f)
//旋转
static void rotateMatrix(double angle,float *matrix){
//角度转弧度
angle = angle * (M_PI / 180.0);
matrix[0] = cos(angle);
matrix[1] = -sin(angle);
matrix[4] = sin(angle);
matrix[5] = cos(angle);
}
旋转后的图片:
缩放矩阵
缩放向量:v3(S1,S2,S3)
//缩放
static void scaleMatrix(double scale, float *matrix) {
matrix[0] = scale;
matrix[5] = scale;
}
调用
//缩放矩阵
scaleMatrix(0.5,matrix);
平移矩阵
平移向量: v3(Tx,Ty,Tz)
//平移 这里对2d 图片平移 只用了xy 如果是3d 那么可以加上z
static void transMatrix(double x, double y, float *matrix){
matrix[3] = x;
matrix[7] = y;
}
调用
//平移
transMatrix(0.5, 0, matrix);
这里应该平移1/4 因为opengl 坐标系 是-1 到1 的 4个0.5
效果
正交投影
1、2D图像绘制
2、会把图像缩放到一个矩形区域内
3、控制图像长宽比不变
应用范围: 视频渲染. 自定义比例 屏幕大小不一样. 避免图片变形丢失. 保证长宽比.等等
orthoM(float left, float right, float bottom, float top)
方法 :
//正交投影
static void orthoM(float left, float right, float bottom, float top,float *matrix){
matrix[0] = 2 / (right - left);
matrix[3] = (right + left)/(right - left) * -1;
matrix[5] = 2 / (top - bottom);
matrix[7] = (top + bottom) / (top - bottom) * -1;
matrix[10] = 1;
matrix[11] = 1;
}
在surfaceChange 中调用 :
//根据比例 看根据宽还是高进行动态缩放
//屏幕宽除以屏幕高
float screen_r = 1.0 * width / height;
//图片的宽高比
float picture_r = 1.0 * w / h;
if (screen_r > picture_r) {
//图片宽度缩放
//根据屏幕宽度和图片宽度的比值 得到图片高度缩放的比值
float r = width / (1.0 * height /h * w);
orthoM(-r, r, -1, 1, matrix);
} else {
//图片高度缩放
//根据屏幕宽度和图片宽度的比值 得到图片高度缩放的比值
float r = height / (1.0 * width / w * h);
orthoM(-1, 1, -r, r, matrix);
}
效果图: