日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL 坐标变换

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL 坐标变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考資料:

  • 正射投影:https://www.cnblogs.com/hackpig/p/5790379.html
  • 透射投影:https://blog.csdn.net/linuxheik/article/details/78969526

坐標變換

在頂點著色器定義一個頂點變換矩陣,與輸入的頂點向量相乘,得到新的頂點位置

#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord;out vec2 TexCoord;uniform mat4 transform;void main() {gl_Position = transform * vec4(aPos, 1.0f);TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y); }

其中uniform mat4 transform 就是一個全局變換矩陣,它可以用glm庫函數來賦值:

// create transformationsglm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix firsttransform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));// get matrix's uniform location and set matrixourShader.use();unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));

坐標空間

OpenGL一共有5個坐標系,通過5個坐標系的變換,將一個物體的局部坐標下的形狀最終變換到屏幕坐標下。這幾個坐標系都有明確的物理含義:

其中需要注意以下裁剪坐標:
裁剪坐標有兩種方式正射投影和透視投影,透視投影能模仿人眼看遠方的效果但是正射投影不能。正射投影將一個長方體裁剪區映射到設備坐標,但是透視投影將一個視椎體區域映射到設備坐標。
放兩張圖,具體原理可以看上面參考資料:
正視投影

透視投影

坐標空間變換代碼:

#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord;out vec2 TexCoord;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {gl_Position = projection * view * model * vec4(aPos, 1.0f);TexCoord = vec2(aTexCoord.x, aTexCoord.y); }``` //意矩陣相乘的順序```cpp glm::mat4 model = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix firstglm::mat4 view = glm::mat4(1.0f);glm::mat4 projection = glm::mat4(1.0f);model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.5f, 1.0f, 0.0f));view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);// retrieve the matrix uniform locationsunsigned int modelLoc = glGetUniformLocation(ourShader.ID, "model");unsigned int viewLoc = glGetUniformLocation(ourShader.ID, "view");// pass them to the shaders (3 different ways)glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(viewLoc, 1, GL_FALSE, &view[0][0]);// note: currently we set the projection matrix each frame, but since the projection matrix rarely changes it's often best practice to set it outside the main loop only once.ourShader.setMat4("projection", projection);

其它

通過使用不同的空間坐標系,在屏幕上展現多個同一張圖像

glBindVertexArray(VAO); for(unsigned int i = 0; i < 10; i++) {glm::mat4 model;model = glm::translate(model, cubePositions[i]);float angle = 20.0f * i; model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));ourShader.setMat4("model", model);glDrawArrays(GL_TRIANGLES, 0, 36); }

總結

以上是生活随笔為你收集整理的OpenGL 坐标变换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。