如何使用GLM向量关系函数?

时间:2017-10-08 22:33:36

标签: c++ glm-math

我试图创建一个std :: GLM向量集(特别是glm :: vec3)。由于C ++不知道如何执行<对向量的操作,我必须传入一个比较功能。

我可以通过创建这样的结构来编写自己的结构:

struct compareVec
{
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
    {
        return lhs.x < rhs.x && lhs.y < rhs.y && lhs.z < rhs.z;
    }
};
std::set< glm::vec3, compareVec > myset;

但是,我确定GLM包含他们自己的矢量比较函数。

我找到了以下资源,但我不确定如何使用它: https://glm.g-truc.net/0.9.4/api/a00137.html

如何将其中一个比较函数传递给我的集合?

1 个答案:

答案 0 :(得分:2)

好的,差不多了! glm :: lessThan返回一个矢量类型,而不是bool。这就是你的比较器无法工作的原因。您可以使用glm::all来获取bool。来自glm::all

的文档
  

bool glm :: all(vecType&lt; bool&gt; const&amp; v)

     

如果x的所有组件都为真,则返回true。

     

模板参数       vecType布尔向量类型。

如果这对你有意义,你必须自己决定,即使我建议不要这样做,据我所知,这将导致以下问题:

Consider:
lhs = (1,2,3)
rhs = (0,1,4)

Than:

lhs < rhs ==> false, since lhs.x and lhs.y are larger than the corresponding components of rhs
rhs < lhs ==> false, since rhs.z component is larger than lhs.z

由于两个向量都不能被排序为较少,这意味着它们是相等的。我怀疑这是你的想法(我已经警告过你了)。

如果您仍然决定使用它,这是在MSVC2010上测试的最小工作示例:

#include <set>
#include <glm/vec3.hpp>
#include <glm/detail/func_vector_relational.hpp>

struct compareVec
{
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
    {
        return glm::all(glm::lessThan(lhs, rhs));
    }
};

int main()
{

    std::set<glm::vec3, compareVec> myset;

    return 0;
}

也许这有帮助。