1 package org.simantics.g3d.shape;
\r
3 import java.util.ArrayList;
\r
4 import java.util.List;
\r
6 import javax.vecmath.AxisAngle4d;
\r
7 import javax.vecmath.Vector3d;
\r
9 import org.simantics.g3d.math.MathTools;
\r
11 public class Sphere {
\r
13 public static Mesh create(double radius, int s, int p) {
\r
14 if (s < 3 || p < 3 || radius < MathTools.NEAR_ZERO)
\r
15 throw new IllegalArgumentException();
\r
16 List<Vector3d> vertices = new ArrayList<Vector3d>((s-2)*p + 2);
\r
17 List<Vector3d> normals = new ArrayList<Vector3d>(vertices.size());
\r
18 List<Integer> indices = new ArrayList<Integer>(((s-3)*p*2 + p * 2)*3);
\r
19 Vector3d v = new Vector3d(0.0,-radius,0.0);
\r
20 Vector3d vp = new Vector3d();
\r
21 for (int ip = 0; ip < p; ip++) {
\r
23 vertices.add(new Vector3d(0.0,-radius,0.0));
\r
24 } else if (ip == p - 1) {
\r
25 vertices.add(new Vector3d(0.0, radius,0.0));
\r
26 int off = 1 + (ip-2)*s;
\r
27 for (int is = 0; is < s; is++) {
\r
28 indices.add(vertices.size() - 1);
\r
29 indices.add(is+off);
\r
31 indices.add(is+off+1);
\r
38 AxisAngle4d aa = new AxisAngle4d(1, 0, 0, ((double)ip/(double)(p-1))*Math.PI);
\r
39 MathTools.rotate(MathTools.getQuat(aa), v, vp);
\r
40 for (int is = 0; is < s; is++) {
\r
41 aa = new AxisAngle4d(0, 1, 0, ((double)is/(double)s)*Math.PI*2);
\r
42 Vector3d vs = new Vector3d();
\r
43 MathTools.rotate(MathTools.getQuat(aa), vp, vs);
\r
47 for (int is = 0; is < s; is++) {
\r
56 int off = 1 + (ip-1)*s;
\r
57 for (int is = 0; is < s-1; is++) {
\r
58 indices.add(off + is - s);
\r
59 indices.add(off + is+1);
\r
60 indices.add(off + is);
\r
63 indices.add(off + is - s);
\r
64 indices.add(off + is + 1 - s);
\r
65 indices.add(off + is + 1);
\r
68 indices.add(off - 1);
\r
70 indices.add(off + s - 1);
\r
72 indices.add(off -1);
\r
73 indices.add(off - s);
\r
79 for (int i = 0; i < vertices.size(); i++) {
\r
80 Vector3d n = new Vector3d(vertices.get(i));
\r
85 return new Mesh(vertices,normals,indices);
\r
89 public static void main(String arg[]) {
\r
90 Mesh s1 = create(1.0, 3, 3);
\r
91 Mesh s2 = create(1.0, 4, 4);
\r
92 System.out.println("debug " + s1 + " " + s2);
\r