glm-math 相关问题

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

在opengl中计算相机到立方体平面的距离

我正在尝试让透明度混合在我的立方体上正常工作,但我遇到了一些障碍。我已经通过简单地以正确的顺序绘制多个立方体来混合它们......

回答 1 投票 0

在 OpenGL 相机类中计算滚动

我正在尝试向 OpenGL 相机添加卷轴,但是当我使用 之前的 Stackoverflow 问题是相机滚动,但是滚动会影响偏航和俯仰方向。 我应该什么时候申请...

回答 1 投票 0

如何在OpenGL中设置特定比例?

我正在使用 C++ 和 OpenGL。但我需要将对象缩放到一定比例。对于游戏引擎来说。 我的目标只是设置而不是更改比例。 #定义GLFW_INCLUDE_NONE #包括 我正在使用 C++ 和 OpenGL。但我需要将对象缩放到一定比例。对于游戏引擎来说。 我的目标只是设置比例而不是更改。 #define GLFW_INCLUDE_NONE #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <GLFW/glfw3.h> #include <Glad/glad.h> #include "vendor/ImGui/imgui.h" #include "vendor/ImGui/backends/imgui_impl_glfw.h" #include "vendor/ImGui/backends/imgui_impl_opengl3.h" #include <stdio.h> #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 void error_callback(int error, const char* description) { fprintf(stderr, "Error: %s\n", description); } const char* vertexShaderSource = "#version 330 core\n" "layout(location = 0) in vec3 aPos;\n" "uniform mat4 projection;\n" "void main()\n" "{\n" " gl_Position = projection * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\0"; const char* fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "uniform vec2 wsize;\n" "void main()\n" "{\n" " vec2 position = gl_FragCoord.xy;\n" " FragColor = vec4(position.x/wsize.x, position.x/position.y/wsize.x,position.y/wsize.y, 1.0f);\n" "}\n\0"; float aspectRatio; glm::mat4 projection; void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); aspectRatio = (float)width / (float)height; projection = glm::ortho(-aspectRatio, aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f); } int main() { if (!glfwInit()) { // Initialization failed } glfwSetErrorCallback(error_callback); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(640, 480, "GL YA!", NULL, NULL); if (!window) { // Window or context creation failed } glfwMakeContextCurrent(window); gladLoadGL(); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); float vertices[9 * 2] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, }; glfwSwapInterval(1); GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glDeleteShader(vertexShader); glDeleteShader(fragmentShader); GLuint VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); GLuint VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; io.ConfigDockingWithShift = false; ImGui::StyleColorsDark(); const char* glsl_version = "#version 100"; ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init(glsl_version); float x = 0; float y = 0; float z = 0; while (!glfwWindowShouldClose(window)) { int width, height; glfwGetFramebufferSize(window, &width, &height); framebuffer_size_callback(window, width, height); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode); ImGui::Begin("Hello OpenGL!"); ImGui::InputFloat("X", &x); ImGui::InputFloat("Y", &y); ImGui::InputFloat("Z", &z); ImGui::End(); ImGui::Render(); glViewport(0, 0, width, height); glClear(GL_COLOR_BUFFER_BIT); //Square glUseProgram(shaderProgram); GLint wsize = glGetUniformLocation(shaderProgram, "wsize"); glUniform2f(wsize, width, height); /* glm::mat4 transform = glm::mat4(1.0f); // Start with an identity matrix transform = glm::translate(transform, glm::vec3(x, y, z)); // Move the triangle along the x and y axes for (int i = 0; i < 9 * 2; i += 3) { glm::vec4 vertex = transform * glm::vec4(vertices[i], vertices[i + 1], vertices[i + 2], 1.0f); vertices[i] = vertex.x; vertices[i + 1] = vertex.y; vertices[i + 2] = vertex.z; } */ float currentX = 0.0f; float currentY = 0.0f; float currentZ = 0.0f; for (int i = 0; i < 9 * 2; i += 3) { currentX += vertices[i]; currentY += vertices[i + 1]; currentZ += vertices[i + 2]; } currentX /= 9; currentY /= 9; currentZ /= 9; float tx = x - currentX; float ty = y - currentY; float tz = z - currentZ; for (int i = 0; i < 9 * 2; i += 3) { vertices[i] += tx; vertices[i + 1] += ty; vertices[i + 2] += tz; } for (int i = 0; i < 9 * 2; i += 3) { vertices[i] += x; vertices[i + 1] += y; vertices[i + 2] += z; } glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 6); //ImGui ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); } 我不知道该怎么办。我想要一个精确的变量来设置,而不是改变大小。 我正在寻找使用 glm 的解决方案,稍后我会将所有内容放入类中。 如果您有网格的顶点数据并且想要缩放对象而不迭代网格数据,那么解决方案是让着色器为您完成此操作。 为此,我们只需要在顶点着色器中引入一个uniform变量即可。 在应用变换之前,我们首先必须缩放顶点位置,例如 //vertex shader in vec3 aPos; //position coords uniform vec3 uScale; //scale factor uniform mat4 uProjection; //mvp matrix int main() { gl_Position = uProjection * vec4(aPos * uScale, 1.0); }

回答 1 投票 0

GLM如何实现四元数交叉和归一化?

我正在尝试遵循 TheCherno 在 Rust 中的光线追踪系列(目前在第 6 集),但我遇到了数学障碍。我不确定如何处理这段代码: if (delta.x!= 0.0...

回答 1 投票 0

如何为定制结构配置VAO和VBO

我正在尝试建造一个酒吧。 首先我声明一个结构 结构体顶点格式 { glm::vec3 个位置; glm::vec3 正常; glm::vec2 texCoord; 顶点格式(glm::ve...

回答 1 投票 0

为什么三角形绕非垂直于三角形平面的轴旋转时会变形?

我正在编写一个小 vulkan 应用程序,我正在尝试测试三角形旋转。 这些是我的三角形的位置(左侧的 vec3)和颜色(右侧的 vec4): obj.顶点 = { {{-0.5,-...

回答 1 投票 0

用鼠标按钮旋转相机而不重置?

我想使用鼠标按钮使相机旋转。 相机旋转得很好,但问题出在鼠标按钮上。当我释放鼠标按钮并再次按下时,旋转会重置...

回答 1 投票 0

OpenGL场景渲染失败?

我需要在 OpenGL 中创建一盏带有杆子和支架的灯。我需要对对象的每个顶点使用至少 2 个原始形状和不同的颜色。 由于某种原因,没有任何渲染。什么是...

回答 1 投票 0

防止光标移动到GLFW窗口边界之外?

我使用 OpenGL 和 C,窗口使用 GLFW。我已启用 glfwSetInputMode(window.self, GLFW_CURSOR, GLFW_CURSOR_DISABLED); 但光标没有锁定,并移到窗口之外,

回答 1 投票 0

Vulkan 深度缓冲区为 0 或 1。绝不会介于两者之间

我遇到深度缓冲区/测试不起作用的问题。当我检查 RenderDoc 时,我发现渲染对象时深度缓冲区始终为 1:深度示例。我期待...

回答 2 投票 0

Glmm 图看起来很重要,但摘要不重要

我使用glmer()来分析二项式数据并通过ggplot将它们绘制出来。 该图似乎在 x-asix 变量 A 和组变量 B 下都存在显着差异,但summary() 显示...

回答 0 投票 0

3d 中的四元数旋转未按预期工作

我试图了解四元数的工作原理以及在三个维度上实现任意旋转的正确方法是什么。 我使用 Vulkan 和 glm 进行渲染和 3D 数学运算。 ...

回答 0 投票 0

有没有办法在世界空间的一个轴心点上旋转多个模型矩阵?

我正在将 OpenGL 与 GLFW 结合使用,并且我正在尝试旋转多个对象,每个对象都在同一轴心点上具有各自的模型矩阵。我的兔子有三个不同的模型,一个身体,一个......

回答 0 投票 0

当 glVertexAttribPointer() 和 glEnableVertexAttribArray() 调用被移动到另一个函数时没有绘制?

完整代码(工作正常): #include "shapes.h" // ... GLuint vao; GLuint ebo; // 创建并绑定 EBO 和 VAO 缓冲区 // 应该在任何绘图之前调用这个函数 void 准备...

回答 1 投票 0

根据片段着色器,UBO的内容都是一样的

我有一个像这样初始化的 UBO: glGenBuffers(1, &sphereUBO); glBindBuffer(GL_UNIFORM_BUFFER, sphereUBO); glBufferData(GL_UNIFORM_BUFFER, sizeof(SphereUBO) * sphereData.size(), nullptr,

回答 0 投票 0

相机围绕原点而不是自身旋转[关闭]

我正在尝试在 openGL 中启动 3D,但我的相机始终围绕坐标原点旋转!这是我的代码:对于每个模型,我调用的每个帧: 模型[i])->绘制(currentShader, projectionMatrix * ...

回答 0 投票 0

Opengl透视投影中,NearPlane距离可以通过FOV计算出来吗?

当 FOV 和距离一定时,FarPlane 的半径可以通过 tan 计算出来。众所周知,最终的局限值在 -1 和 1 之间,所以根据 radius/1 = far_distance/near_distance...

回答 0 投票 0

glBufferData() 不更新主函数之外的缓冲区?

在我的代码中,我有一个名为 CompileRawBufferData() 的函数,该函数将我的自定义类数组编译成缓冲区可以读取的原始数据。 VBufferObjects 数组实际上只是...

回答 1 投票 0

在 OpenGL 中查看对象

在 2d 平面中,我可以通过计算它们的 x 和 y 位置差的 atan2 并将对象旋转该角度来获得另一个对象。在 3d 空间中,我想我需要计算角度...

回答 1 投票 0

带有 GLSL 的 OpenGL 4.5 中的无限网格问题

我一直在玩弄无限网格,使用 OpenGL 4.5 中的着色器,遵循这里的教程。由于本教程是为 Vulkan 和更高版本的 GLSL(我使用的是 450 核)编写的,...

回答 2 投票 0

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