3784人阅读 评论(2)

# 旋转变换

### 源代码详解

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

World.m[1][0]=sinf(Scale);World.m[1][1]=cosf(Scale);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;

### 示例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"

GLuint VBO;
GLuint gWorldLocation;

static void RenderSceneCB()
{
glClear(GL_COLOR_BUFFER_BIT);

static float Scale = 0.0f;

Scale += 0.001f;

// 旋转变换矩阵
Matrix4f World;

World.m[0][0] = cosf(Scale); World.m[0][1] = -sinf(Scale); World.m[0][2] = 0.0f; World.m[0][3] = 0.0f;
World.m[1][0] = sinf(Scale); World.m[1][1] = cosf(Scale);  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 07");

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()
{
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网站的观点或立场
个人资料
• 访问：414975次
• 积分：4686
• 等级：
• 排名：第7023名
• 原创：91篇
• 转载：17篇
• 译文：30篇
• 评论：218条
关于我
人生苦短，道阻且艰；修行不易，且行且努力。

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

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

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