glm-math 相关问题

GLM是一个C ++数学库,旨在尽可能地模仿OpenGL着色语言的数学函数和类型(向量,矩阵)。

矩阵乘法时不能使用*运算符

在我的 OpenGL“main.cpp”文件中,我构造了视图、模型和模型视图矩阵(相应的 vMat、mMat 和 mvMat),其类型为 glm::mat4,在此代码中使用: #包括 在我的 OpenGL“main.cpp”文件中,我构造了视图、模型和模型视图矩阵(相应的 vMat、mMat 和 mvMat),其类型为 glm::mat4,在此代码中使用: #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/matrix_transform.hpp> glm::mat4 vMat, mMat, mvMat; --程序-- void applyMatrices(GLFWwindow* window){ mvLoc = glGetUniformLocation(renderingProgram, "mv_matrix"); projLoc = glGetUniformLocation(renderingProgram, "proj_matrix"); glfwGetFramebufferSize(window, &width, &height); aspect = (float)width / (float)height; projMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f); // glm::mat4(1.0f) : an identity matrix vMat = glm::translate(glm::mat4(1.0f), glm::vec3(-1.0f, -1.0f, -1.0f)); mMat = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, 1.0f)); mvMat = vMat * mMat; glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvMat)); glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projMat)); } void display(GLFWwindow* window, double currentTime) { ... applyMatrices(window); ... } int main() { ... while (!glfwWindowShouldClose(window)) { display(window, glfwGetTime()); ... } ... } --程序-- 问题就在一线 mvMat = vMat * mMat; 发生矩阵乘法的地方,如果我**删除**将使程序编译成功,但如果不这样做,将会抛出许多关于GLM库的mat4类型的不同错误,例如: “隐式定义的构造函数未初始化 'float glm::vec<4, float(glm::qualifier)0u>::::x'union { T x, r, s; };“ 我已经尝试过像这样**预先**启动所有三个矩阵: glm::mat4 vMat = glm::mat4(1.0f); glm::mat4 mMat = glm::mat4(1.0f); glm::mat4 mvMat = glm::mat4(1.0f); 但这并没有改变任何事情。我查看了我的 C++ 版本 (C++ 20) 是否与 GLM 的矩阵工作不兼容,但即使更改为较旧的 C++ 版本也没有帮助。我不确定 GLM 是否正在努力与我的编译器(MinGW 版本 6.3)一起工作,但我不确定。 我认为重要的是确保您使用的编译器和 C++ 标准实际上受 GLM 支持: GCC 4.7 及更高版本 英特尔 C++ Compose XE 2013 及更高版本 Clang 3.4 及更高版本 Apple Clang 6.0 及更高版本 Visual C++ 2013 及更高版本 CUDA 9.0 及更高版本(实验性) 任何 C++11 编译器 以下是其他相关建议: 至少使用 c++11 使用 GLM 构建代码。尝试使用旧标准(如 c++11 或 c++14)而不是 c++20 来构建代码可能是个好主意。 尝试定义下面的宏,以确保类型针对 SIMD 操作(单指令、多数据)正确对齐: #define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES 确保初始化 4x4 矩阵: glm::mat4 vMat = glm::mat4(1.0f); glm::mat4 mMat = glm::mat4(1.0f); glm::mat4 mvMat = glm::mat4(1.0f);

回答 1 投票 0

将 glm::lookat 矩阵转换为四元数并返回

我正在使用 glm 创建一个相机类,并且我在使用 Lookat 函数时遇到了一些问题。我使用四元数来表示旋转,但我想使用 glm 预先编写的 Lookat 函数...

回答 5 投票 0

glm::normalize 的作用是什么?

我尝试从 C++ 源代码用 Java 编写 MD5 加载器,但我无法找出这一行在做什么: animatedJoint.m_Orient = glm::normalize(animatedJoint.m_Orient); 其中animateJoint.m_O...

回答 4 投票 0

如何使用 glm 和 C++ 将四元数转换为欧拉?

在我的项目中,我在代码中使用四元数,但我也希望能够在代码的其他部分使用欧拉角,因为它对我来说更容易使用。但是当我旋转 glm::quate 的 Y 轴时...

回答 1 投票 0

如何从 float[16] 数组创建 cglm Mat4?

我知道C++有glm::make_mat4()和#include,但CGLM中似乎没有make_mat4()函数可用。 有人可以告诉我如何创建 CGLM M...

回答 1 投票 0

获取两点之间的角度并以该角度围绕另一个点旋转一个点 - C++

我基本上是在尝试根据贝塞尔曲线中的点创建二维线。 贝塞尔曲线的所有点都放置得很好,一切看起来都井然有序。 从这些点开始,我正在创建......

回答 2 投票 0

向量上的glm运算返回不正确的值

Glm 内部使用 float 并以非常高的精度计算值。问题在于,使用此类值进行常规操作可能会返回不正确的结果。考虑这个 gdb 输出: 49 ...

回答 1 投票 0

CMakeLists.txt 中的 GLM 链接

我无法将 glm 库与我的可执行文件链接。我尝试通过链接 ${GLM_INCLUDE_DIRS}、${GLM_LIBRARIES} 和 ${GLM_LIBRARY_DIRS} cmake 变量,但它不起作用。 我如何链接库并包括...

回答 3 投票 0

glReadPixels() 返回背景颜色?

我试图通过 glReadPixels() 获取在 OpenGL 中单击的颜色: #包括 #包括 #包括 #包括 我正在尝试通过 glReadPixels() 获取在 OpenGL 中单击的颜色: #include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> const char *vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec4 aPos;\n" "uniform mat4 projection;\n" "uniform mat4 model;\n" "void main()\n" "{\n" " gl_Position = projection * model * vec4(aPos.xy, 0.0, 1.0);\n" "}\0"; const char *fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "void main()\n" "{\n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0"; int main() { if (glfwInit()) { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); } else { std::cout << "glfw failed to initialise" << std::endl; } GLFWwindow *window = glfwCreateWindow(500, 500, "Opengl Selection", NULL, NULL); glfwMakeContextCurrent(window); if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) { std::cout << "Failed to initialise glad" << std::endl; } glClearColor(0.3f, 0.2f, 0.1f, 1.0f); glViewport(0, 0, 500, 500); unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); int success; char infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); float vertices[] = { // pos // tex 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f }; unsigned int VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindVertexArray(VAO); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *) 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); glUseProgram(shaderProgram); glm::mat4 projection = glm::ortho(0.0f, 1000.0f, 1000.0f, 0.0f, -1.0f, 1.0f); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); // glm::mat4 projection = glm::ortho(0.0f, 500.0f, 500.0f, 0.0f, -1.0f, 1.0f); glm::mat4 model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f)); model = glm::scale(model, glm::vec3(100.0f, 100.0f, 0.0f)); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model)); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); glfwSetMouseButtonCallback(window, [](GLFWwindow *window, int button, int action, int mods) { if (action == GLFW_PRESS) { double xPos, yPos; glfwGetCursorPos(window, &xPos, &yPos); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); unsigned char data[4]; glReadPixels(xPos, yPos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); std::cout << (float) data[0] << " " << (float) data[1] << " " << (float) data[2] << " " << (float) data[ 3] << std::endl; } }); glfwSwapBuffers(window); glfwPollEvents(); } return 0; } 但是,无论我点击哪里,OpenGl 都会返回背景颜色。我相信我在如何在屏幕上渲染正方形方面做错了。 问题*是传递给 glfwGetCursorPos 的位置是相对于窗口的 upper-左上角,而传递给 glReadPixels 的位置是相对于窗口的 lower-左角窗户。 解决方案是将调用的 y 位置反转为 glReadPixels。 500x500 窗口中位置的值范围为 0 到 499,因此必须从 499 中减去 yPos: glReadPixels(xPos, 499 - yPos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); 现在,当 xPos 和 yPos < 50. 都返回正方形的颜色 *正如Rabbid76在评论中首先指出的那样。

回答 1 投票 0

Freetype、OpenGL 中的字符奇怪地居中

我正在尝试在按钮内渲染一些文本(这只是按钮大小的 vec2 和按钮位置的 vec2),并且我正在尝试将文本置于按钮内的中心。它适用于角色...

回答 1 投票 0

GJK碰撞检测算法的奇怪行为

在 1 幅图像中没有碰撞,但在 2 幅图像中存在碰撞 我的 GJK 算法有一个错误。我正在使用 glm 库,当我使用矩阵 GJK

回答 1 投票 0

glm::translate 如何工作?

在 OpenGl C++ 中调试视频游戏时,我打印了变换/翻译矩阵并向我展示如下内容: 1 0 0 0 0 1 0 0 0 0 1 0 tx ty tz 1 但我认为应该是: 1 0 0 吨...

回答 1 投票 0

为什么C++找不到GLM头?

我没有权限将 GLM 放入 usr/local/include 或 usr/include 中,但我需要将 GLM 用于 openGL。代码(我无法更改)会像这样查找 GLM: #包括 #

回答 3 投票 0

如何使用 Camera 类从 OpenGL 中的鼠标坐标获取世界坐标?

我正在尝试将鼠标坐标转换为OpenGL中的世界坐标,并且我正在使用learnOpenGL.com上的相机类,就是这个。我正在使用这个函数来转换光标空间...

回答 1 投票 0

如何平移点光源和旋转定向光OpenGL?

我打算用两种光实现Gouraud着色。(点光和定向光) 我想用Open的键盘回调函数平移点光源并旋转定向光源...

回答 1 投票 0

将数据从 std::vector 传递到 glsl 中的统一数组

我在着色器中有一套制服,如下所示: 统一 vec3 起源[10]; 和我的代码中的 std::vector 如下所示: std::vector 起源; 其中充满了十个 glm::vec3 元素。 是否

回答 1 投票 0

透视平截头体始终朝向中心

我正在学习 OpenGL 并实现 ShadowMaps。经过相当多的工作后,我得到了定向和聚光灯的工作,只有一件事我不明白。 对于聚光灯,我计算了

回答 1 投票 0

我需要了解矩阵乘法在这个 C++ 程序中是如何发生的

这是从 Austin Morlan 的 ECS 示例中获得的代码。 Mat44 类 { 民众: Mat44() { //@格式化程序:关闭 m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0...

回答 1 投票 0

视锥体剔除未利用 OpenGL 中的整个边界球

我的视锥体剔除正在检测被剔除的对象,即使整个对象的边界球体尚未脱离视锥体。就像它相信边界球体的半径小于...

回答 1 投票 0

(0xBAADF00D)即使我在循环中设置值

我正在尝试创建一个位置数组和法向量,排列如下: { 某物1.x,某物1.y,某物1.z,正常1.x,正常1.y,正常1.z 某物2.x,某物2.y,某物2.z,

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.