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

How do I use GLM Vector Relational Functions?

我正在尝试创建一个 std::set 的 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

如何将这些比较函数之一传递给我的集合?

好的,差不多了! glm::lessThan returns 是向量类型,不是 bool。这就是为什么您的比较器不起作用的原因。您可以在其上使用 glm::all 来获取布尔值。来自 glm::all

的文档

bool glm::all ( vecType< bool > const & v )

Returns true if all components of x are true.

Template Parameters vecType Boolean vector types.

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

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;
}

也许这有帮助。

通过优先处理 vec 的早期组件,我们可以避免 (1,2,3) 和 (0,1,4) 彼此小于对方。我们想要的是与此功能相同的东西:

lh.x != rh.x ? 
    lh.x < rh.x
: lh.y != rh.y ? 
    lh.y < rh.y 
:   lh.z < rh.z

我相信这应该可以作为 compareVec:

struct compareVec {
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
    {
        glm::vec3 nequ = glm::notEqual(lhs, rhs);
        return glm::lessThan(lhs, rhs)[nequ[0] ? 0 : nequ[1] ? : 1 : 2];
    }
};

我找不到 returns 第一个索引为真的 glm 函数,所以我只使用了 nequ[0] ? 0 : nequ[1]? : 1 : 2