資源簡介
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
評論
共有 條評論