资源简介
OGLWSADQE进行旋转缩放平移简单操作
分析:
放大: 当摄像机沿Z轴靠近物体,则物体显示会变大,反之则小
左右平移: 摄像机往左移,则看到的物体往右移
旋转: 以相机到物体的距离为半径进行旋转
当旋转后,再平移,比如相机到了b位置,再平移,以绿线为向量进行平移. 已知相机到物体的向量,已知相机的向上up向量0,1,0,可以叉乘得到垂直的绿线向量,再以此向量进行平移即可.
旋转后的放大缩小,则以相机到物体的向量进行平移.
代码如下:
定义两个全局变量:
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f); // 相机位置
glm::vec
代码片段和文件信息
#define GLEW_STATIC
#include
#include
#include
#include
#include
#include
#include “Shader.h“
#pragma comment(lib “SOIL.lib“)
#pragma comment (lib “opengl32.lib“)
#pragma comment (lib “glew32s.lib“)
#pragma comment (lib “glfw3.lib“)
#pragma comment (lib “glfw3dll.lib“)
#pragma comment (lib “glew32mxs.lib“)
#pragma comment (lib “assimp.lib“)
#define WIDTH 800
#define HEIGH 600
GLfloat g_nX = 0;
GLfloat g_nY = 0;
GLfloat g_nZ = 0;
glm::vec3 cameraPos = glm::vec3(0.0f 0.0f 3.0f);
glm::vec3 cameraTarg = glm::vec3(0.0f 0.0f 0.0f);
//glm::mat4 view; // 视图矩阵
GLfloat fRotateAngle = 0.0f;
void keyFun(GLFWwindow* pWnd int nKey int nScanCode int nAction int nMode);
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR 3);
glfwWindowHint(GLFW_OPENGL_PROFILE GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE GL_FALSE);
GLFWwindow* pWnd = glfwCreateWindow(WIDTH HEIGH “OGL Geometry Shader“ nullptr nullptr);
glfwMakeContextCurrent(pWnd);
glfwSetKeyCallback(pWnd keyFun);
glewExperimental = GL_TRUE;
glewInit();
glViewport(0 0 WIDTH HEIGH);
GLfloat fPoint[] = {
0.0f 0.0f 0.0f 1.0f 0.0f 0.0f
0.5f -0.6f 0.0f 0.0f 1.0f 0.0f
0.5f 0.5f 0.0f 0.0f 0.0f 1.0f
-0.5f 0.6f 0.0f 0.0f 1.0f 1.0f
-0.2f -0.5f 0.0f 0.0f 0.4f 1.0f
- 0.8f 0.3f 0.0f 1.0f 0.30f 1.0f };
GLuint nVAO nVBO;
glGenVertexArrays(1 &nVAO);
glBindVertexArray(nVAO);
{
glGenBuffers(1 &nVBO);
glBindBuffer(GL_ARRAY_BUFFER nVBO);
{
glBufferData(GL_ARRAY_BUFFER sizeof(fPoint) fPoint GL_STATIC_DRAW);
glEnableVertexAttribArray(0); // vertex
glVertexAttribPointer(0 3 GL_FLOAT GL_FALSE 6* sizeof(GLfloat) (GLvoid*)0);
glEnableVertexAttribArray(1); // color
glVertexAttribPointer(1 3 GL_FLOAT GL_FALSE 6* sizeof(GLfloat) (GLvoid*)(3 * sizeof(GL_FLOAT)));
}
glBindBuffer(GL_ARRAY_BUFFER 0);
}
glBindVertexArray(0);
glEnable(GL_PROGRAM_POINT_SIZE);
//Shader shader(“./Shader/vertex.vx“ “./Shader/geo.geo“ “./Shader/frag.fg“);
Shader shader(“./Shader/vertex.vx“ “./Shader/frag.fg“);
shader.userShaderProg();
glm::mat4 model; // 模型矩阵
glm::mat4 view; // 视图矩阵
// 后移(观察点与物体在同一平面) 否则无法显示物体
view = glm::translate(view glm::vec3(0.0f 0.0f -3.0f));
// 投影矩阵 视角 宽高比 近 远截面
glm::mat4 proj = glm::perspective(45.0f GLfloat(WIDTH / HEIGH) 0.1f 100.0f);
// 获取Shader中 uniform 变量位置
GLint nModelLoc = glGetUniformLocation(shader.getProg() “model“);
GLint nViewLoc = glGetUniformLocation(shader.getProg() “view“);
GLint nProjLoc = glGetUniformLocation(shader.getProg() “projection“);
// 将矩阵传至Shader
glUniformMatrix4fv(nModelLoc 1 GL_FALSE glm::value_ptr(model));
glUnifo
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1333 2017-03-01 16:50 OGLGeometryShader.sln
文件 5892 2017-03-04 00:14 OGLGeometryShader\main.cpp
文件 7496 2017-03-01 17:03 OGLGeometryShader\OGLGeometryShader.vcxproj
文件 1154 2017-03-01 17:03 OGLGeometryShader\OGLGeometryShader.vcxproj.filters
文件 143 2017-03-03 10:33 OGLGeometryShader\Shader\frag.fg
文件 527 2017-03-02 15:53 OGLGeometryShader\Shader\geo.geo
文件 383 2017-03-02 17:22 OGLGeometryShader\Shader\vertex.vx
文件 6071 2017-03-02 15:14 OGLGeometryShader\Shader.cpp
文件 498 2017-03-02 15:57 OGLGeometryShader\Shader.h
目录 0 2017-03-03 10:33 OGLGeometryShader\Shader
目录 0 2017-03-04 00:16 OGLGeometryShader
文件 51604 2017-03-04 00:07 2017-03-04_000734.jpg
文件 45175 2017-03-04 00:18 Drawing1.dwg
文件 58072 2017-03-04 00:03 ogl.gif
----------- --------- ---------- ----- ----
178348 14
评论
共有 条评论