如何将GLM :: VEC3(1.f,0.f,0.f)设置为枚举值

How can I set glm::vec3(1.f, 0.f, 0.f) as a value of an enum?

本文关键字:枚举 设置 GLM VEC3      更新时间:2023-10-16

我想拥有一个包含glm :: vec3的枚举。

目前,我有一个名为" Axis"的枚举,其中包含X,Y和Z。而且,每次使用它们时,我都必须将其映射到带有相应值的glm :: vec3中。

这是我的轴枚举:

enum Axis 
{
    X,
    Y,
    Z
};

这就是我当前将其转换为GLM :: vec3:

的方式
glm::vec3 angleVector;
switch (axis)
{
case X:
    angleVector = glm::vec3(1.0f, 0.0f, 0.0f);
    break;
case Y:
    angleVector = glm::vec3(0.0f, 1.0f, 0.0f);
    break;
case Z:
    angleVector = glm::vec3(0.0f, 0.0f, 1.0f);
    break;
}

这就是我要使用它的方式:

enum Axis 
{
    X = glm::vec3(1.0f, 0.0f, 0.0f),
    Y = glm::vec3(0.0f, 1.0f, 0.0f),
    Z = glm::vec3(0.0f, 0.0f, 1.0f)
};

我尝试了很多事情来获得GLM :: vec3(1.0f,0.0f,0.0f(作为我的枚举确实接受的常数,但没有任何效果。

(

这样:

static const glm::vec3 vec3x = glm::vec3(1.0f, 0.0f, 0.0f);

,然后:

enum Axis 
{
    X = vec3x
};

(

您可以使用具有静态变量的名称空间。然后,您将能够像枚举一样大致使用它。

namespace Axis
{
    static const glm::vec3 X = glm::vec3(1.0f, 0.0f, 0.0f);
    static const glm::vec3 Y = glm::vec3(0.0f, 1.0f, 0.0f);
    static const glm::vec3 Z = glm::vec3(0.0f, 0.0f, 1.0f);
};

如果要将其传递到函数,则可以创建一个类。但是,然后,您必须在传递该对象时实例化。

class Axis
{
public:
    glm::vec3 X = glm::vec3(1.0f, 0.0f, 0.0f);
    glm::vec3 Y = glm::vec3(0.0f, 1.0f, 0.0f);
    glm::vec3 Z = glm::vec3(0.0f, 0.0f, 1.0f);
};
static const Axis euclidean_space_axis;
void DoStuff(Axis axis)
{
    std::cout << "X-axis: " << axis.X.x << ", " << axis.X.y << ", " << axis.X.z << "n" <<
    std::cout << "Y-axis: " << axis.Y.x << ", " << axis.Y.y << ", " << axis.Y.z << "n" <<
    std::cout << "Z-axis: " << axis.Z.x << ", " << axis.Z.y << ", " << axis.Z.z << std::endl;
}
int main()
{
    DoStuff(euclidean_space_axis);
}

您可以使用表而不是切换:

enum Axis { X, Y, Z };
const glm::vec3 axes[] = { glm::vec3(1.0f, 0.0f, 0.0f), 
                           glm::vec3(0.0f, 1.0f, 0.0f), 
                           glm::vec3(0.0f, 0.0f, 1.0f)};

,然后

Axis axis = ... whatever ...;
glm::vec3 angleVector = axes[axis];