Torus.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package min3d.objectPrimitives;
  2. import min3d.core.Object3dContainer;
  3. import min3d.vos.Color4;
  4. import min3d.vos.Number3d;
  5. import min3d.vos.Uv;
  6. import min3d.vos.Vertex3d;
  7. /**
  8. * @author Dennis Ippel
  9. * @author Thomas Pfeiffer
  10. * @author Tim Knip
  11. *
  12. * Torus primitive.
  13. * This is an adaptation from Sandy's ActionScript 3 class which was adapted from Tim Knip's
  14. * ActionScript 2 class. All credits go to Tim Knip.
  15. * Original sources available at: http://www.suite75.net/svn/papervision3d/tim/as2/org/papervision3d/objects/Torus.as
  16. * Sandy source available at: http://code.google.com/p/sandy/source/browse/trunk/sandy/as3/trunk/src/sandy/primitive/Torus.as
  17. *
  18. */
  19. public class Torus extends Object3dContainer {
  20. private final int MIN_SEGMENTSW = 3;
  21. private final int MIN_SEGMENTSH = 2;
  22. private float largeRadius;
  23. private float smallRadius;
  24. private int segmentsW;
  25. private int segmentsH;
  26. public Torus() {
  27. this(2, 1, 12, 8, new Color4());
  28. }
  29. public Torus(Color4 color) {
  30. this(2, 1, 12, 8, color);
  31. }
  32. public Torus(float largeRadius, float smallRadius, int segmentsW, int segmentsH) {
  33. this(largeRadius, smallRadius, segmentsW, segmentsH, new Color4());
  34. }
  35. public Torus(float largeRadius, float smallRadius, int segmentsW, int segmentsH, Color4 color) {
  36. super(segmentsW * segmentsH * 2 * 3, segmentsW * segmentsH * 2);
  37. this.largeRadius = largeRadius;
  38. this.smallRadius = smallRadius;
  39. this.segmentsW = Math.max(MIN_SEGMENTSW, segmentsW);
  40. this.segmentsH = Math.max(MIN_SEGMENTSH, segmentsH);
  41. this.defaultColor(color);
  42. build();
  43. }
  44. private void build()
  45. {
  46. float r1 = largeRadius;
  47. float r2 = smallRadius;
  48. int steps1 = segmentsW;
  49. int steps2 = segmentsH;
  50. float step1r = (float) ((2.0 * Math.PI) / steps1);
  51. float step2r = (float) ((2.0 * Math.PI) / steps2);
  52. float a1a = 0;
  53. float a1b = step1r;
  54. int vcount = 0;
  55. for(float s=0; s<steps1; s++, a1a=a1b, a1b+=step1r) {
  56. float a2a = 0;
  57. float a2b = step2r;
  58. for(float s2=0; s2<steps2; s2++, a2a=a2b, a2b+=step2r) {
  59. Vertex3d v0 = getVertex(a1a, r1, a2a, r2);
  60. Vertex3d v1 = getVertex(a1b, r1, a2a, r2);
  61. Vertex3d v2 = getVertex(a1b, r1, a2b, r2);
  62. Vertex3d v3 = getVertex(a1a, r1, a2b, r2);
  63. float ux1 = s/steps1;
  64. float ux0 = (s+1)/steps1;
  65. float uy0 = s2/steps2;
  66. float uy1 = (s2+1)/steps2;
  67. vertices().addVertex(v0.position, new Uv(1-ux1, uy0), v0.normal, defaultColor());
  68. vertices().addVertex(v1.position, new Uv(1-ux0, uy0), v1.normal, defaultColor());
  69. vertices().addVertex(v2.position, new Uv(1-ux0, uy1), v2.normal, defaultColor());
  70. vertices().addVertex(v3.position, new Uv(1-ux1, uy1), v3.normal, defaultColor());
  71. faces().add(vcount, vcount+1, vcount+2);
  72. faces().add(vcount, vcount+2, vcount+3);
  73. vcount += 4;
  74. }
  75. }
  76. }
  77. private Vertex3d getVertex(float a1, float r1, float a2, float r2) {
  78. Vertex3d vertex = new Vertex3d();
  79. vertex.normal = new Number3d();
  80. float ca1 = (float)Math.cos(a1);
  81. float sa1 = (float)Math.sin(a1);
  82. float ca2 = (float)Math.cos(a2);
  83. float sa2 = (float)Math.sin(a2);
  84. float centerX = r1 * ca1;
  85. float centerZ = -r1 * sa1;
  86. vertex.normal.x = ca2 * ca1;
  87. vertex.normal.y = sa2;
  88. vertex.normal.z = -ca2 * sa1;
  89. vertex.position.x = centerX + r2 * vertex.normal.x;
  90. vertex.position.y = r2 * vertex.normal.y;
  91. vertex.position.z = centerZ + r2 * vertex.normal.z;
  92. return vertex;
  93. }
  94. }