4309人阅读 评论(5)

# 平移变换

### 背景

I * P = P(x,y,z) 。所以我们应该从得到本身开始来调整变换矩阵得到结果矩阵右侧相加结果（…+V1, …+V2, …+V3）的最终变换矩阵。首先自身变换矩阵的样子如下：

### 源代码详解

(1)struct Matrix4f { float m[4][4]; };

(2)GLuint gWorldLocation;

(3)
Matrix4f World;
World.m[0][0] = 1.0f; World.m[0][1] = 0.0f; World.m[0][2] = 0.0f; World.m[0][3] = sinf(Scale);
World.m[1][0] = 0.0f; World.m[1][1] = 1.0f; World.m[1][2] = 0.0f; World.m[1][3] = 0.0f;
World.m[2][0] = 0.0f; World.m[2][1] = 0.0f; World.m[2][2] = 1.0f; World.m[2][3] = 0.0f;
World.m[3][0] = 0.0f; World.m[3][1] = 0.0f; World.m[3][2] = 0.0f; World.m[3][3] = 1.0f;

(4)glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &World.m[0][0]);

int a[2][3];
a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;
a[1][0] = 4;
a[1][1] = 5;
a[1][2] = 6;

1 2 3

4 5 6

(5)uniform mat4 gWorld;

(6)gl_Position = gWorld * vec4(Position, 1.0);

### 示例Demo


#include <stdio.h>
#include <string.h>

#include <math.h>
#include <GL/glew.h>
#include <GL/freeglut.h>

#include "ogldev_util.h"
#include "ogldev_math_3d.h" // 从这个教程开始要用到Metrix4x4矩阵的数据结构了

GLuint VBO;
// 平移变换一致变量的句柄引用
GLuint gWorldLocation;

static void RenderSceneCB()
{
glClear(GL_COLOR_BUFFER_BIT);

static float Scale = 0.0f;

Scale += 0.001f;

// 4x4的平移变换矩阵
Matrix4f World;

World.m[0][0] = 1.0f; World.m[0][1] = 0.0f; World.m[0][2] = 0.0f; World.m[0][3] = sinf(Scale);
World.m[1][0] = 0.0f; World.m[1][1] = 1.0f; World.m[1][2] = 0.0f; World.m[1][3] = 0.0f;
World.m[2][0] = 0.0f; World.m[2][1] = 0.0f; World.m[2][2] = 1.0f; World.m[2][3] = 0.0f;
World.m[3][0] = 0.0f; World.m[3][1] = 0.0f; World.m[3][2] = 0.0f; World.m[3][3] = 1.0f;

glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &World.m[0][0]);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

glDisableVertexAttribArray(0);

glutSwapBuffers();
}

static void InitializeGlutCallbacks()
{
glutDisplayFunc(RenderSceneCB);
glutIdleFunc(RenderSceneCB);
}

static void CreateVertexBuffer()
{
Vector3f Vertices[3];
Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}

{

exit(1);
}

const GLchar* p[1];
GLint Lengths[1];
GLint success;
if (!success) {
GLchar InfoLog[1024];
exit(1);
}

}

{

exit(1);
}

string vs, fs;

exit(1);
};

exit(1);
};

GLint Success = 0;
GLchar ErrorLog[1024] = { 0 };

if (Success == 0) {
exit(1);
}

if (!Success) {
fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);
exit(1);
}

assert(gWorldLocation != 0xFFFFFFFF);
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 06");

InitializeGlutCallbacks();

// Must be done after glut is initialized!
GLenum res = glewInit();
if (res != GLEW_OK) {
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
return 1;
}

printf("GL version: %s\n", glGetString(GL_VERSION));

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

CreateVertexBuffer();

glutMainLoop();

return 0;
}



#version 330

layout (location = 0) in vec3 Position;

// 平移变换聚矩阵一致变量
uniform mat4 gWorld;

void main()
{
// 用平移变换矩阵乘以图形顶点位置对应的4X4矩阵相乘，完成平移变换
gl_Position = gWorld * vec4(Position, 1.0);
}



#version 330

out vec4 FragColor;

void main()
{
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}



### 运行效果：

3
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：414979次
• 积分：4686
• 等级：
• 排名：第7023名
• 原创：91篇
• 转载：17篇
• 译文：30篇
• 评论：218条
关于我
人生苦短，道阻且艰；修行不易，且行且努力。

【专业兴趣】：
游戏开发，图形学，图像处理与计算机视觉，iOS平台

【专业技能】：
iOS，游戏开发

【个人主页】：信厚的独立博客
【个人项目】：个人项目
【GitHub】：jiangxh1992
【邮箱】：jiangxinhou艾特outlook点com
我的微博
时空隧道
博客专栏
 iOS沉思录 文章：49篇 阅读：77495
 一步步学OpenGL3.3+ 文章：30篇 阅读：110810
世界在看我>_<
把广告压下去