12

ほぼすべての OpenGL チュートリアルで、立方体の描画を実装できます。したがって、立方体の頂点が必要です。サンプル コードでは、すべての頂点を定義する長いリストを見ました。しかし、事前計算された座標の非常に長いリストを使用するのではなく、立方体の頂点を計算したいと思います。

立方体は、8 つの頂点と 12 の三角形で構成されます。頂点は、x、y、および z によって定義されます。三角形は、3 つの頂点のインデックスによってそれぞれ定義されます。

立方体の頂点と要素インデックスを計算するエレガントな方法はありますか?

4

2 に答える 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]));
    }));
  }));
};
于 2012-12-19T14:43:21.553 に答える