Элегантный способ найти вершины куба

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

Куб состоит из восьми вершин и двенадцати треугольников. Вершины определяются через x, y и z. Каждый треугольник определяется индексом трех вершин.

Есть ли элегантный способ вычисления вершин и индексов element куба?


person danijar    schedule 19.12.2012    source источник
comment
Для создания куба требуется больше кода, чем для того, чтобы просто выписать 8 вершин.   -  person Pubby    schedule 19.12.2012
comment
Простое указание вершин и элементов - безусловно, самое простое решение.   -  person Andreas Brinck    schedule 19.12.2012
comment
Грустно это возглавить, но, возможно, вы правы.   -  person danijar    schedule 19.12.2012
comment
@Pubby Я думаю, что он пытается динамически генерировать вершины для таких вещей, как перемещение вершин.   -  person ihsoy ih    schedule 19.12.2012
comment
Я думаю, что это очень правильный вопрос, и я уверен, что вы можете сгенерировать вершины и индексы вершин.   -  person Jakob    schedule 19.12.2012
comment
@YoshiHi. Движение и вращение выполняются позже с помощью матричного вычисления. Это просто создание вершин и индексов куба.   -  person danijar    schedule 19.12.2012
comment
Похоже, это хорошая запись для кода гольфа.   -  person Kos    schedule 19.12.2012
comment
Также: решение будет зависеть от того, хотите ли вы создать только 8 вершин (только позицию) или 24 вершины (дублированные позиции, чтобы также обрабатывать векторы нормалей или координаты текстуры).   -  person Kos    schedule 19.12.2012
comment
Я хочу сгенерировать 8 вершин и определить треугольники по индексам. Никаких нормалей или текстурных координат.   -  person danijar    schedule 19.12.2012
comment
Мне кажется, что если масштабирование / вращение / перемещение выполняется позже, создание вершин куба (центрированных в начале координат и выровненных по осям) должно быть просто тривиальным _1 _...   -  person twalberg    schedule 19.12.2012
comment
Речь идет не только о вершинах, но и об индексах треугольников.   -  person danijar    schedule 19.12.2012
comment
@Kos. Вот codegolf.stackexchange.com/questions/ 9331 /   -  person danijar    schedule 29.12.2012
comment
@Kos. Извините, я удалил его позже, потому что это не подходящее определение задачи.   -  person danijar    schedule 30.12.2012
comment
С каких это пор 8 вершин? 24 из-за нормалей ...   -  person PawelP    schedule 11.10.2014


Ответы (2)


Когда я «портировал» проект csg.js на Java Я нашел симпатичный код, который генерирует куб с выбранной центральной точкой и радиусом. (Я знаю, что это JS, но все равно)

// Construct an axis-aligned solid cuboid. Optional parameters are `center` and
// `radius`, which default to `[0, 0, 0]` and `[1, 1, 1]`. The radius can be
// specified using a single number or a list of three numbers, one for each axis.
// 
// Example code:
// 
//     var cube = CSG.cube({
//       center: [0, 0, 0],
//       radius: 1
//     });
CSG.cube = function(options) {
  options = options || {};
  var c = new CSG.Vector(options.center || [0, 0, 0]);
  var r = !options.radius ? [1, 1, 1] : options.radius.length ?
           options.radius : [options.radius, options.radius, options.radius];
  return CSG.fromPolygons([
    [[0, 4, 6, 2], [-1, 0, 0]],
    [[1, 3, 7, 5], [+1, 0, 0]],
    [[0, 1, 5, 4], [0, -1, 0]],
    [[2, 6, 7, 3], [0, +1, 0]],
    [[0, 2, 3, 1], [0, 0, -1]],
    [[4, 5, 7, 6], [0, 0, +1]]
  ].map(function(info) {
    return new CSG.Polygon(info[0].map(function(i) {
      var pos = new CSG.Vector(
        c.x + r[0] * (2 * !!(i & 1) - 1),
        c.y + r[1] * (2 * !!(i & 2) - 1),
        c.z + r[2] * (2 * !!(i & 4) - 1)
      );
      return new CSG.Vertex(pos, new CSG.Vector(info[1]));
    }));
  }));
};
person Sorceror    schedule 19.12.2012
comment
Спасибо, именно то, что я искал! - person Ray Hulha; 25.05.2013

Я решил эту проблему с помощью этого фрагмента кода (C #):

public CubeShape(Coord3 startPos, int size) {
    int l = size / 2;
    verts = new Coord3[8];
    for (int i = 0; i < 8; i++) {
        verts[i] = new Coord3(
            (i & 4) != 0 ? l : -l,
            (i & 2) != 0 ? l : -l,
            (i & 1) != 0 ? l : -l) + startPos;
    }

    tris = new Tris[12];
    int vertCount = 0;
    void AddVert(int one, int two, int three) =>
        tris[vertCount++] = new Tris(verts[one], verts[two], verts[three]);
        
    for (int i = 0; i < 3; i++) {
        int v1 = 1 << i;
        int v2 = v1 == 4 ? 1 : v1 << 1;
        AddVert(0, v1, v2);
        AddVert(v1 + v2, v2, v1);
        AddVert(7, 7 - v2, 7 - v1);
        AddVert(7 - (v1 + v2), 7 - v1, 7 - v2);
    }
}

Если вы хотите больше понять, что происходит, вы можете проверить страницу github, которую я написал что объясняет его.

person Catonif    schedule 15.12.2020