问题标签 [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 回答
8639 浏览

matrix - GLM matrix 4X4 (mat4) to array and back

I need to put a glm math library mat4 into a sqlite3 BLOB and back. What would be the most efficient approach? Serialize mat4 to bytes?, Turn mat4 to a float array? BLOB will not take a mat4 directly

adding brute force conversion of mat4 to array of floats

this has been tested to work correctly - but there should be a better way. the conversion from float[16] to mat4 is handled by glm library glm/gtc/type_ptr.hpp - works as it should. BLOB in sqlite3 will take a float array directly.

SOLVED:

the above converts the values for glm::mat4 into a float array which then can be saved in sqlite3 as a single BLOB type

0 投票
2 回答
2931 浏览

opengl - 如何使用 glm quat 防止万向节锁定

我正在尝试实现一个 opengl 相机,它可以围绕指定的世界坐标旋转相机的位置。我正在尝试使用 glm 数学库来做到这一点;我的代码如下

当我测试代码时,使用 quat Q 的旋转工作正常,但 quat R 会导致“不稳定”旋转。我究竟做错了什么?

0 投票
2 回答
6750 浏览

android - 如何在 Android NDK 应用程序中使用 GLM

我目前正在尝试将我的 OpenGL 应用程序移植到 Android 并坚持如何正确导入和构建 GLM http://glm.g-truc.net/。我在标准 C++ 应用程序中使用 GLM 没有任何问题,但是我对 NDK 还是很陌生。我已经尝试过在网上发布的所有其他解决方案,但都没有运气。这是我到目前为止所拥有的:

我正在使用最新版本的 GLM (0.9.4)

我的 .cpp 文件包含:

我的 Android.mk 文件如下所示:

**\Development\OpenGL\glm-0.4.0** 是我的 C 盘上 GLM 文件的位置

在构建时,我收到此错误:

这类似于 codemonkey 的问题https://gamedev.stackexchange.com/questions/47128/android-ndk-build-cant-find-glm-headers建议使用“APP_STL := gnustl_static”。

看来我的源文件设置正确,但是存在某种我无法识别的编译器问题。任何帮助是极大的赞赏!

0 投票
0 回答
1988 浏览

c++ - glm::vec3 添加错误,重载'[]'

当还使用返回 glm::vec3 的重载 [] 运算符时,我遇到了将多个向量加法串在一起的问题。

我已经通过“取消字符串”我的添加(将每个添加到它自己的语句中)解决了这个问题,但我真的很想知道它为什么会发生(也许我的 [] 运算符做错了?)。

NVec是一个包装类std::vector<glm::vec3>,它的 [] 重载。这样做的目的是处理越界 [] 调用(边界是它们需要的任何东西,而不是标准索引边界)。

操作员

问题代码:

faceNormals是一个NVec完整的三角形面法线,tri1是 aglm::vec3[3]i1toi6是索引。我真的按照这个顺序运行这些案例以获得我的结果。

是的。这对我来说没有任何意义。tri[0]当我将 vec3 加法串在一起[]在同一语句中使用我的运算符时,我只会得到错误(奇怪的数据)。

0 投票
2 回答
706 浏览

c++ - 使用 c++ 和 glm 转换位置数组

我有一系列职位:

我想使用三个 glm::mat4 矩阵来转换每个位置;模型、视图和投影。为了转换每个位置,我需要将每一行乘以矩阵:

请注意,我必须将每个位置转换为 vec4 才能使乘法正确。

我试过的:

但这不起作用,因为位置的索引是错误的(而且应该更多)。

我的问题是:

如何在 C++ 中循环遍历数组,对每个位置进行转换,然后在新数组中输出转换后的位置,这是最好的方法?

0 投票
1 回答
1842 浏览

c++ - GLM矩阵中的旋转方向,使用四元数

我正在研究一个 3D 渲染设置(所有数学都是使用 GLM for OpenGL 完成的),并且一切正常,除了我希望我的转换如何工作。我为每个实体创建一个矩阵,如下所示:

使用它,它通常可以正常工作,除了我不确定如何根据喜好调整它的一部分。也就是说,使用它,X 轴上的平移被翻转(例如,左为正,Z 轴上为正,但我对此的判别较小),并且 Y 轴上的旋转被翻转。

为此目的查看其他代码,似乎许多人否定了我用于方向的内容(用于相机)。我也这样做了,并且平移是正确的,但是所有旋转轴都与首选轴相反(尽管无论方向是否否定,X 上的旋转都是相同的)。

我不太确定我应该做些什么来帮助纠正这个问题,除了可能在使用前否定 X 轴平移和 Y 轴旋转,但我觉得这不是最好的方法。想法?

0 投票
1 回答
1118 浏览

c++ - GLM 可以用作 glUniformx() 中的普通旧数据吗?

由于设计薄弱,我不得不重写我的整个数学库和与数学相关的东西。相反,我发现我可以使用 GLM。如果你遇到过我之前的问题,我一直在处理骨骼动画,所以我要上传大量的mat4s、vec3、vec2s。这是我以前的顶点结构:

不幸的是,我发现我的数学库不是 POD,我试图上传整个结构,但我确实得到了奇怪的结果。我的最终骨骼矩阵定义为:

我也尝试一次上传。

我只是想知道如果我用 glm::vec3、vec2、mat4 替换我的 Vec3s、Vec2s 和 Mat4s 并直接上传整个 Vertex 结构(顶点次数)并使用以下方法为每个数据设置偏移量:

.

它会按预期工作吗?我只是不想重写整个事情,这一次我必须确保它有效,因为我不想再次面对另一个失败。

0 投票
1 回答
1896 浏览

c++ - 2D opengl 旋转导致精灵扭曲

我对使用 OpenGL ES 2.0 很陌生。我也在使用 iPhone 和 GLM 数学库。正如我所引用的,我一直在使用本教程:http: //tomdalling.com/blog/modern-opengl/03-matrices-depth-buffering-animation/但我发现很难找到 2D OpenGL 教程。

我正在尝试旋转 2D 精灵,但图像被扭曲了。例如在 0 度的旋转角度:http: //i.imgur.com/yBTN2ST.png和在 45 度的旋转角度:http: //i.imgur.com/cY5IJcg.png

在我的精灵课上


在我的顶点着色器中

我认为问题的一部分是图像在没有考虑纵横比的情况下被旋转,我不确定如何解决这个问题。

谢谢

0 投票
2 回答
1935 浏览

c++ - 从 glm::project 输出计算 z-buffer

我想根据 glm::project 的输出计算对象位置的 z 缓冲区。下面代码中 z-buffer 的计算来自https://en.wikipedia.org/wiki/Z-buffering

我试过的

问题

无论我如何旋转模型或使用哪个点,zBufferValue 的值都是 1。根据 wiki 页面,该值应介于 -1(近平面)和 1(远平面)之间。

我在计算中做错了什么?

0 投票
1 回答
372 浏览

c++ - GLM 是否与 GLload 和 GCC 兼容

我目前正在设置我的 OpenGL“框架”,并已决定使用 GLload,主要用于扩展加载,但它具有证明正确的“gl”名称空间的额外好处。因此,所有 gl* 函数都用作 gl::* 例如:

我还想使用 glm,根据我的理解,它应该像 include 一样简单,glm/glm.hpp并确保我告诉我的编译器在哪里可以找到它。但似乎它可能与 glload 不直接兼容,因为当我尝试使用它进行编译时出现以下错误。

通过查看type_int.hpp您可以看到它使用宏,首先分别使用'signed long'和'unsigned long',然后使用'highp_int_t'和'highp_uint_t'(导致此错误)。这两个重新定义的类型是“int64”和“uint64”,具体类型取决于编译器。当我使用 GCC 时,我相信这意味着我应该将这些类型视为 'signed long long' 和 'usigned long long'。

如果我注释掉这两行,一切似乎都编译得很好。当然,我相信迟早会证明我这样做会破坏某些东西。

查找类似的问题让我得到了这个答案,基本上说 glm 不支持用 构建-std=C++11,这对我来说是不可接受的;但是这个答案已经有将近两年的历史了,glm 的网站确实声称完全兼容 C++11。

作为参考,我正在使用 gcc 4.7.3 版、glm 0.9.5 版(从 gi​​thub 存储库中提取)、 glsdk 0.4.4 版的 glload(我已经删除了 glsdk 的所有其他“模块”,留下了我只是glload)。