如何将glm :: vec3(1.f,0.f,0.f)设置为枚举的值?

时间:2019-05-02 11:04:54

标签: c++ enums

我想要一个包含glm :: vec3“ constants”的枚举。

当前,我有一个名为“轴”的枚举,其中包含X,Y和Z。每次使用它们时,都必须将它们与开关盒映射为具有相应值的glm :: vec3。

这是我的Axis枚举:

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

希望您能在那里帮助我。 谢谢

如果这可能是转发,对不起,我搜索了但没有发现任何东西。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可以使用表格代替切换:

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