Как я могу установить glm :: vec3 (1.f, 0.f, 0.f) в качестве значения перечисления? - PullRequest
1 голос
/ 02 мая 2019

Я хочу иметь enum, который содержит glm :: vec3 "constants".

В настоящее время у меня есть enum под названием "Axis", который содержит 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 ]

2 голосов
/ 02 мая 2019

Вместо этого вы можете использовать пространство имен со статическими переменными. Тогда вы сможете использовать его примерно так же, как с перечислением.

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 голос
/ 02 мая 2019

Вы можете использовать таблицу вместо переключения:

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...