SphereMesh constructor

SphereMesh({
  1. required double radius,
  2. int segments = 64,
  3. Material? material,
})

Represents a Sphere's geometry with a single surface.

Implementation

SphereMesh({
  required double radius,
  int segments = 64,
  Material? material,
}) {
  final vertices = <Vertex>[];
  for (var i = 0; i <= segments; i++) {
    final theta = i * (2 * math.pi) / segments;
    for (var j = 0; j <= segments; j++) {
      final phi = j * math.pi / segments;

      final x = radius * math.sin(phi) * math.cos(theta);
      final y = radius * math.cos(phi);
      final z = radius * math.sin(phi) * math.sin(theta);

      final u = theta / (2 * math.pi);
      final v = phi / math.pi;

      vertices.add(
        Vertex(position: Vector3(x, y, z), texCoord: Vector2(u, v)),
      );
    }
  }

  final indices = <int>[];
  for (var i = 0; i < segments; i++) {
    for (var j = 0; j < segments; j++) {
      final first = i * (segments + 1) + j;
      final second = first + segments + 1;

      indices.add(first);
      indices.add(second);
      indices.add(first + 1);

      indices.add(second);
      indices.add(second + 1);
      indices.add(first + 1);
    }
  }

  addSurface(vertices, indices, material: material);
}