问题标签 [glm-math]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1839 浏览

c++ - OpenGL 裁剪空间截锥体剔除错误结果

我在 CPU 上实现了 Clip-Space Frustum Culling。在一个简单的简化案例中,我只是创建了一个基于 4 个不同点的矩形,我将在 GL_LINES 模式下进行渲染。

但有时,在我看来,我得到了错误的结果。这是一个例子:

在这个渲染过程中,我的平截头体剔除计算检测到,所有点都将在 NDC 坐标中的正 y 坐标之外。

这是输入:

要点:

MVP(四舍五入):

以及计算(MVP * Position)

最后,通过透视划分(w-component)进行转换

如您所见,所有变换点的 y 分量都大于 1,并且应该在视锥体之外。

我已经仔细检查了我的矩阵。我还在顶点着色器中做了一个变换反馈,可以肯定的是,我在 CPU 和 GPU 上使用相同的矩阵进行计算。甚至 MVP * Point 的结果在我的 Vertex Shader 中与在 GPU 上的结果相同。我的渲染管道尽可能简单。

顶点着色器是

和片段着色器

所以顶点着色器的结果与我的 CPU 计算结果相同。但是,它们仍然是在屏幕上绘制的线条!任何想法为什么有线条?我对透视鸿沟做错了吗?

我该怎么做才能检测到这个矩形不应该被剔除,因为至少有一条线可见(在这个例子中基本上另一条线也是可见的)

如果有帮助:可见的红线是 P1 和 P2 之间的线...

[编辑]现在我通过计算相机平截头体法线和黑森法线方程来实现世界空间剔除。这适用于正确识别。遗憾的是,我确实需要在剪辑空间中进行正确的计算,因为我将使用这些点进行其他计算。有人有什么想法吗?

这是我的计算代码:

0 投票
3 回答
3324 浏览

c++ - 将相机变换应用于 OpenGL

我正在尝试为 3D OpenGL 项目创建一个 Camera 类。但是我无法弄清楚如何将相机实际应用到我的场景中。我有这些相机功能(除其他外):

它们是根据教程创建的,但我不确定它们是否有效,因为我无法测试它们。我想要做的是让 OpenGL 使用视图和投影矩阵来模拟相机。我究竟如何告诉 OpenGL 使用这些投影和视图矩阵,以便它正确地模拟与模型转换分开的相机?我知道 OpenGL 默认不接受 glm 矩阵,但我在一些教程中看到过这种类型的东西:

但是 glUniformMatrix4fv (我认为它应用了相机变换?)对我来说毫无意义。它总是与着色器有关,而我没有。我目前只有一个线框测试网格。有人可以为我提供这个问题的代码片段吗?

0 投票
2 回答
159 浏览

c++ - vec3的移位尺寸

问题

我想将三维向量的维度 x、y 和 z 移动vec3一个数字 n。

如何改进我的算法以获得最佳性能并简化逻辑?我想这个任务有一个通用的方法,是吗?

算法

例子

比如shift(2, vec3(12, 42, 30))应该给我vec3(42, 30, 12)

  • 维度 0 是 x 并保存值 12。它移动 2 到维度 2,即 z。所以 z 为 12。
  • 维度 1 是 y 并保持 42。移动 2 会导致维度 4 不存在,因此我们将其环绕,它的值变成维度 0 的值,即 x。
  • 维度 2 是 z,也环绕边缘,其值落在 y 中。
0 投票
2 回答
2376 浏览

c++ - GLM 相机 X、Y 旋转引入 Z 旋转的问题

所以我在使用 GLM 库在 OpenGL 和 C++ 中实现的相机时遇到了问题。我的目标相机类型是可以轻松探索 3D 世界的飞行相机。我已经设法让相机工作得很好,它很好而且很流畅,环顾四周,运动似乎很好而且正确。

我似乎遇到的唯一问题是沿相机的 X 和 Y 轴的旋转(向上和向下看)引入了一些围绕它的 Z 轴的旋转。这导致世界在旅行时轻微滚动。

例如......如果我在相机前面有一个方形四边形并以圆周运动移动相机,就像用你的头环顾四周一样,一旦运动完成,四边形将略微滚动如果你歪了头。

我的相机目前是一个组件,我可以将其附加到场景中的对象/实体上。每个实体都有一个“框架”,它基本上是该实体的模型矩阵。Frame 包含以下属性:

然后相机使用这些来创建适当的 viewMatrix,如下所示:

现在......这是我在 Frame 对象中的旋转 X 和 Y 方法,我猜这就是问题所在:

所以在那里的某个地方,有一个我一直在寻找试图解决的问题。我已经搞砸了几天,尝试随机的事情,但我得到相同的结果,或者 z 轴旋转是固定的,但出现了其他错误,例如不正确的 X、Y 旋转和相机移动。

我看了一下云台锁,但据我了解,这个问题对我来说似乎不太像云台锁。但我可能错了。

0 投票
1 回答
275 浏览

opengl - 使用 OpenGL 将立方体置换到原点

我在 64x64x64 立方体内绘制了一堆点,但不知道如何移动原点,以便围绕立方体的中心进行旋转。我的顶点数据存储在一维数组中,从 {(0,0,0), (0,0,1), ..., (63, 63, 63)} 开始。

这是我当前设置每帧矩阵的代码:

我试图将立方体平移 -32 到 x 和 y 方向,但没有成功。

0 投票
1 回答
290 浏览

c++ - 当提供轴和四元数时,如何使用 GLM 获得角度?

我正在使用 GLM 四元数来表示对象的方向。

基本上,我想添加从 quat 中提取轴角度的功能。我不知道这是否是我需要做的;但是这样做的一个用途是尝试在 y 轴上旋转立方体,以增加我需要首先获得旧角度的角度,对吧?所以

那应该将立方体旋转五度,对吗?

我遇到的问题是实现 getAngleOnAxis 函数。是否有可以提取角度的 GLM 函数?

我不确定我是否真的想到了正确的解决方案,所以如果有经验的人可以更简单地解释这一点,那就太好了。谢谢!

0 投票
1 回答
1181 浏览

c++ - GLM Math lib 使用 GCC 编译错误

0 投票
2 回答
36876 浏览

glm-math - 将 glm::vec4 转换为 glm::vec3

如何将 a 转换glm::vec4为 a glm::vec3

只有x, y,z是必需的-w可以删除组件。

在 GLSL 中,这可以使用.xyz[1] 来完成,但在 glm 中,这会导致编译错误:

[1] http://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations#Components

0 投票
1 回答
2785 浏览

c++ - 使用 GLM 功能放大 OpenGL 中的当前鼠标位置

我对放大 OpenGL 中当前鼠标位置的任务感到绝望。我已经尝试了很多不同的事情并阅读了其他关于此的帖子,但我无法根据我的具体问题调整可能的解决方案。据我了解,您必须获取鼠标光标的当前窗口坐标,然后将它们取消投影以获取世界坐标,最后转换为这些世界坐标。

为了找到当前的鼠标位置,每次单击鼠标右键时,我都会在 GLUT 鼠标回调函数中使用以下代码。

接下来,在设置 ModelView 和 Projection 矩阵之前,我在显示函数中取消投影当前鼠标位置,这似乎也可以正常工作:

现在翻译是麻烦开始的地方。目前我正在绘制一个具有维度(dimensionX、dimensionY、dimensionZ)的立方体并转换到该立方体的中心,因此我的缩放也发生在中心点。我通过在 z 方向(小车)平移来实现缩放:

我试图通过转换到 worldCoordinates 向量来替换到立方体中心的转换,但这不起作用。我还尝试按宽度或高度缩放矢量。我在这里错过了一些重要的步骤吗?

0 投票
1 回答
532 浏览

c++ - GLM - 向量和矩阵是否保证与 GLSL 对应的内存等效?

直觉上我会说是的,因为否则这整个“遵循 GLSL 规范”的事情并没有那么大的意义。不过,我没有在任何地方明确提到这一点。在代码中,我问是否

(当然不是 float* 使用 double 或 half 变体时,但你明白了)。