优雅的方法查找立方体的顶点

12
几乎每个OpenGL教程都让您实现绘制一个立方体。因此需要立方体的顶点。在示例代码中,我看到了一个定义每个顶点的长列表。但是我想计算立方体的顶点而不是使用预先计算的坐标的冗长列表。
一个立方体由八个顶点和十二个三角形组成。顶点由x、y和z定义。每个三角形由三个顶点的索引定义。
有没有一种优雅的方法来计算立方体的顶点和element索引?

7
生成一个立方体需要更多的代码,而仅仅写出8个顶点需要的代码则要少得多。 - Pubby
2
仅指定顶点和元素是迄今为止最简单的解决方案。 - Andreas Brinck
2
我认为这是一个非常合理的问题,我相信你可以生成顶点和顶点索引。 - Jakob
4
@YoshiHi. 后续会通过矩阵计算来完成移动和旋转。现在只需生成一个立方体的顶点和索引。请问需要翻译其他内容吗? - danijar
1
这看起来像是一个不错的 代码高尔夫 条目。 - Kos
显示剩余8条评论
2个回答

4

当我将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]));
    }));
  }));
};

0
我用以下代码(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页面进行解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接