Как построить матрицу вершин из 2 векторов? - PullRequest
0 голосов
/ 24 апреля 2019

Я пишу игровой движок на C ++, который взаимодействует с Vulkan. Чтобы я мог рисовать что-либо на экране, мне нужно написать вершины.

Движок игры предлагает немного более высокий уровень интерфейса с Vulkan, и он должен иметь возможность строить вершины из позиции Vector3 и размера Vector3.

Я не знаю, как эффективно решить эту проблему, кто-нибудь, кто может указать мне правильное направление? Спасибо !!

class SquareMatrix {
public:
  Vector3 s1v1, s1v2, s1v3, s1v4, // Top
          s2v1, s2v2, s2v3, s2v4, // Bottom
          s3v1, s3v2, s3v3, s3v4, // Left
          s4v1, s4v2, s4v3, s4v4, // Right
          s5v1, s5v2, s5v3, s5v4, // Front
          s6v1, s6v2, s6v3, s6v4; // Back
  SquareMatrix(Vector3& v1, Vector3& v2) {
    std::array<std::array<Vector3, 4>, 6> Square;
    for(int a=0; a<=6; a++) {
      for(int b = 0; b <= 4; b++) {
        // Stumped!
      }
    }
  }
};

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Эти два вектора, вероятно, представляют «Выровненную ограничивающую ось» (AABB): https://en.m.wikipedia.org/wiki/Bounding_volume

AABB - это прямоугольный кубоид (то есть 3D-версия прямоугольника) с особенностью, что его края выровнены по декартовой оси. Это означает, что мы можем определить любую AABB, используя либо центральную точку, либо половину экстента (размера) прямоугольника в трех ортогональных направлениях, либо две вершины, которые соответствуют минимальному и максимальному углам прямоугольника.

Итак, в коде лучше определить структуру AABB, которая содержит две вершины с именами, такими как minPoint и maxPoint.

Другое дело, что вам не нужно определять 24 вершины. Вам нужно всего 8 вершин. Затем необходимо определить 6 граней, каждая из которых содержит 3 целых числа для треугольников или 4 целых числа для квадратов, причем целые числа являются индексами вершин. Вулкан должен предоставить функцию рендера с двумя параметрами: список вершин (возможно, массив с плавающей точкой) и список граней (вероятно, массив целых чисел).

Надеюсь, это поможет.

0 голосов
/ 25 апреля 2019

В любом случае, первое, что вы должны сделать, это использовать массив вместо тонны полей для хранения вершин.

Я предполагаю, что, записывая вершины, вы пишете его между вызовами vkMapMemory и vkUnmapMemory (я не эксперт по Вулкану, смеется).В этом случае самый эффективный способ сделать это - использовать массив с плавающей точкой, а не массив Vertex3 s (в противном случае вам придется либо копировать по одному, либо вы должны найти выход через него).стандартная компоновка, требования к выравниванию и другие вещи, которые намного сложнее простого массива с плавающей точкой), и запишите их, используя это.Что касается редактирования массива с плавающей точкой, это довольно просто.Другой практически эквивалентный параметр - это многомерный массив чисел с плавающей точкой, и в случае, когда число вершин никогда не изменится (известно во время компиляции), это также работает (в любом случае, простой массив просто эмулирует многомерный массивв любом случае).

...