home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / gfx / 3d / irit / contrib / scripts / indycam.irt < prev    next >
Encoding:
Text File  |  1995-03-10  |  10.9 KB  |  268 lines

  1. #---------------------------------------------------------------------------
  2. # iritstate("EchoSource", FALSE);
  3. iritstate("InterCrv", FALSE);
  4. RESOLUTION = 20;
  5. BODY_WIDTH = 13.6;
  6. COLUMN_WIDTH = 1;
  7. BASE_WIDTH = BODY_WIDTH + 2 * 0.2 + 2 * COLUMN_WIDTH + 2 * 0.1;
  8. FLOOR = -3.6;
  9. EPS = 0.0001;
  10. #---------------------------------------------------------------------------
  11. roundRect = function(xMin, xMax, yMin, yMax, radius):
  12.   curve =   arc(vector(xMin,          yMax - radius, 0),
  13.             vector(xMin + radius, yMax - radius, 0),
  14.             vector(xMin + radius, yMax,          0)) +
  15.         arc(vector(xMax - radius, yMax,          0),
  16.         vector(xMax - radius, yMax - radius, 0),
  17.         vector(xMax,          yMax - radius, 0)) +
  18.         arc(vector(xMax,          yMin + radius, 0),
  19.                 vector(xMax - radius, yMin + radius, 0),
  20.         vector(xMax - radius, yMin,         0)) +
  21.         arc(vector(xMin + radius, yMin,         0),
  22.         vector(xMin + radius, yMin + radius, 0),
  23.         vector(xMin,          yMin + radius, 0)):
  24.   if(yMax - radius == yMin + radius,
  25.     return = curve, return = curve + ctlpt(E2, xMin, yMax-radius));
  26. #---------------------------------------------------------------------------
  27. makePoly = function(closedCurve):
  28.   return = gpolygon(boolone(closedCurve), off);
  29. #---------------------------------------------------------------------------
  30. continue = function(curve, length):
  31.     tMax = nth(pdomain(curve), 2):
  32.     cPt = ceval(curve, tMax):
  33.     pt = vector(coord(cPt, 1), coord(cPt, 2), coord(cPt, 3)):
  34.     return = pt + ctangent(curve, tMax) * length;
  35. #---------------------------------------------------------------------------
  36. makeBody = function(final):
  37.   middleProfile = roundRect(-2, 4, -2, 2, 2):
  38.   sideProfile   = roundRect(-2, 3, -2, 2, 2):
  39.   return = sfromcrvs(list(sideProfile   * trans(vector(0, 0,  BODY_WIDTH/2)),
  40.                       middleProfile * trans(vector(0, 0,  BODY_WIDTH/4)),
  41.                       middleProfile,
  42.                       middleProfile * trans(vector(0, 0, -BODY_WIDTH/4)),
  43.                           sideProfile   * trans(vector(0, 0, -BODY_WIDTH/2))),
  44.             4):
  45.   if(final == TRUE, 
  46.      cut = roundRect(2, 6, -2, 2, 1) * rotx(90) * trans(vector(0, -3, 0)):
  47.      cut = extrude(cut, vector(0, 6, 0)):
  48.      return = return - cut:
  49.      side = makePoly(sideProfile):
  50.      return = mergepoly(list(return,
  51.                           -side * trans(vector(0, 0,  BODY_WIDTH/2 )),
  52.                           side * trans(vector(0, 0, -BODY_WIDTH/2 )))):
  53.      color(return, GREEN), return);
  54.  
  55. #---------------------------------------------------------------------------
  56. makeCap = function():
  57.   body = makeBody(FALSE):
  58.   return = roundRect(1.25, 6.25, -2.5, 2.5, 1)
  59.        * rotx(90) * trans(vector(0.5, -4, 0)):
  60.   return = extrude(return, vector(-1, 8, 0)):
  61.   return = return * -body:
  62.   body = offset(body, -0.1, 0.1, off):
  63.   return = body * return:
  64.   color(return, RED);
  65. #---------------------------------------------------------------------------
  66. makeBase = function():
  67.   pt1 = ctlpt(E3, 0,   0.5,  0):
  68.   pt2 = ctlpt(E3, 0,   0.7,  0):
  69.   pt3 = ctlpt(E3, 0.2, 0.75, 0):
  70.   c = ctlpt(E3, 0, 0, 0) + cbezier(list(pt1, pt2, pt3)):
  71.   pt4 = continue(c, 2.5):
  72.   pt5 = ctlpt(E3, 5, 0.15, 0):
  73.   c = c + cbezier(list(pt3, pt4, pt5)):
  74.   pt6 = continue(c, 0.1):
  75.   pt7 = ctlpt(E3, 5.1, 0, 0):
  76.  
  77.   sideProfile = c + cbezier(list(pt5, pt6, pt7)) + ctlpt(E3, 0, 0, 0):
  78.   koeff = 5.7/5:
  79.   middleProfile = sideProfile * scale(vector(koeff, koeff, koeff)):
  80.  
  81.   return = sfromcrvs(list(sideProfile   * trans(vector(0, 0,  BASE_WIDTH/2)),
  82.                        middleProfile * trans(vector(0, 0,  BASE_WIDTH/4)),
  83.                        middleProfile,
  84.                        middleProfile * trans(vector(0, 0, -BASE_WIDTH/4)),
  85.                        sideProfile   * trans(vector(0, 0, -BASE_WIDTH/2))),
  86.              4):
  87.   return = return * trans(vector(-2.3, FLOOR, 0));
  88. #---------------------------------------------------------------------------
  89. makeColumn = function():
  90. # |(x, y)| = r
  91. # ((p - (x, y)) * (x, y) = 0
  92.   pX = 2.25:
  93.   pY = FLOOR + 0.1:
  94.   radius = 1.9:
  95.   a = sqr(pX) + sqr(pY):
  96.   b = -2 * sqr(radius) * pX:
  97.   c = sqr(sqr(radius)) - sqr(pY) * sqr(radius):
  98.   x = (-b + sqrt(sqr(b) - 4 * a * c)) / (2 * a):
  99.   y = sqrt(sqr(radius) - sqr(x)):
  100.   profile = ctlpt(E2,  pX, pY) +
  101.             arc(vector( x, y, 0),
  102.             vector( 0, 0, 0),
  103.             vector(-x, y, 0)) +
  104.             ctlpt(E2, -pX, pY) + 
  105.             ctlpt(E2,  pX, pY):
  106.   return = extrude(profile, vector(0, 0, 1)):
  107.   profile = makePoly(profile):
  108.   return = mergepoly(list(-profile,
  109.                        profile * trans(vector(0, 0, COLUMN_WIDTH)),
  110.                        gpolygon(return, off))):
  111.   return = return * trans(vector(0, 0, BODY_WIDTH/2 + 0.2));
  112. #---------------------------------------------------------------------------
  113. makeSide = function():
  114.   sin25 = sin(25 * PI / 180):
  115.   cos25 = cos(25 * PI / 180):
  116.   radius = (BASE_WIDTH - 0.2) / 2:
  117.   return = arc(vector(-radius * sin25, FLOOR - 0.1, radius * cos25),
  118.            vector( 0,              FLOOR - 0.1, 0),
  119.            vector( radius * sin25, FLOOR - 0.1, radius * cos25)):
  120.   return = extrude(return, vector(0, 5.7, -0.4));
  121. #---------------------------------------------------------------------------
  122. makeSupport = function():
  123.   column = makeColumn():
  124.   side = makeSide():
  125.   base = makeBase():
  126.   return = (base + column) * side:
  127.   column = column * roty(180):
  128.   side = side * roty(180):
  129.   return = (return + column) * side:
  130.   color(return, MAGENTA);
  131. #---------------------------------------------------------------------------
  132. makeLeg = function():
  133.   profile = ctlpt(E1,  2) + 
  134.             arc(vector( 2,   0, 0.8),
  135.                 vector( 1.4, 0, 0.8),
  136.                 vector( 1.4, 0, 1.4)) +
  137.             arc(vector(-1.4, 0, 1.4),
  138.                 vector(-1.4, 0, 0.8),
  139.                 vector(-2,   0, 0.8)) +
  140.             ctlpt(E1, -2) + ctlpt(E1, 2):
  141.    profile = profile * trans(vector(0, FLOOR + 0.2, BODY_WIDTH / 2 - 0.8)):
  142.    leg = extrude(profile, vector(0, -0.4, 0)):
  143.    profile = makePoly(profile):
  144.    leg = leg ^ (profile * trans(vector(0, -0.4, 0))):
  145.    return = list(leg, leg * roty(180)):
  146.    color(return, WHITE);
  147. #---------------------------------------------------------------------------
  148. makeStopper = function():
  149.   stopper = box(vector(-0.8, -1.5, 2.6), 1.6, -1.5, 0.2):
  150.   return = list(stopper, stopper * roty(180)):
  151.   color(return, YELLOW);  
  152. #---------------------------------------------------------------------------
  153. makeSpindel = function():
  154.   spindel = extrude(circle(vector(0, 0, BODY_WIDTH / 2 - 0.1), 1.5),
  155.             vector(0, 0, 0.4)):
  156.   return = list(spindel, spindel * roty(180)):
  157.   color(return, YELLOW);
  158. #---------------------------------------------------------------------------
  159. makeTube = function():
  160.  return = surfrev(ctlpt(E3, 0, EPS,  0) +
  161.               ctlpt(E3, 0, 0.5,  0) +
  162.               ctlpt(E3, 0, 0.5,  1) +
  163.               ctlpt(E3, 0, 0.8,  1) +
  164.               ctlpt(E3, 0, 0.8,  1.3) +
  165.               ctlpt(E3, 0, 0.9,  1.3) +
  166.               ctlpt(E3, 0, 0.9,  1.75) +
  167.               ctlpt(E3, 0, 0.85, 1.8) +
  168.                   ctlpt(E3, 0, EPS,  1.8)) * roty(90) * trans(vector(1.6,0,0)):
  169.   color(return, BLUE);
  170. #---------------------------------------------------------------------------
  171. makeTail = function():
  172.   return = list(
  173.     con2(vector(-1.5, 0, 0), vector(-1, 0, 0), 0.5, 0.4),
  174.     sweepsrf(circle(vector(0, 0, 0), 0.2),
  175.              ctlpt(E1, -2) + cbezier(list(ctlpt(E2, -3,  0),
  176.                                           ctlpt(E2, -5,  0),
  177.                                           ctlpt(E2, -5, FLOOR + 0.2),
  178.                                           ctlpt(E2, -7, FLOOR + 0.2))), off)):
  179.   color(return, CYAN);
  180. #---------------------------------------------------------------------------
  181. makeHolder = function():
  182.   curve = arc(vector(0, 0, 0.4),
  183.               vector(0, 0, 0),
  184.               vector(0, 0.4 * sin(120 * PI / 180), 0.4 * cos(120 * PI / 180))):
  185.   profile = ctlpt(E2,  0.1,  0.15) + 
  186.             ctlpt(E2, -0.1,  0.15) +
  187.             ctlpt(E2, -0.1, -0.15) +
  188.             ctlpt(E2,  0.1, -0.15) +
  189.             ctlpt(E2,  0.1,  0.15):
  190.   holder = sweepsrf(profile, curve, off):
  191.   holder = holder ^ makePoly(csurface(holder, ROW, 1)):
  192.   return = list(holder,
  193.                 holder * rotz(180) * trans(vector( 0.35, 0, 0)),
  194.         holder * rotz(180) * trans(vector(-0.35, 0, 0))):
  195.   return = return * trans(vector(0, FLOOR + 0.6, -BASE_WIDTH / 2 - 0.1));
  196. #---------------------------------------------------------------------------
  197. makeMicro = function():
  198.  return = surfrev(ctlpt(E3, 0, EPS,  -1.4) +
  199.               ctlpt(E3, 0, 0.15, -1.4) +
  200.               ctlpt(E3, 0, 0.2,  -0.6) +
  201.               ctlpt(E3, 0, 0.3,  -0.6) +
  202.               ctlpt(E3, 0, 0.3,   0.5) +
  203.               ctlpt(E3, 0, 0.35,  0.6) +
  204.               ctlpt(E3, 0, 0.35,  1.4) +
  205.               ctlpt(E3, 0, EPS,   1.4)) * roty(90) *
  206.                     trans(vector(0, FLOOR + 0.6, -BASE_WIDTH / 2 - 0.1)): 
  207.   color(return, BLUE);
  208. #---------------------------------------------------------------------------
  209. makeWire = function():
  210.   return = sweepsrf(circle(vector(0, 0, 0), 0.1),
  211.              ctlpt(E1, -1) + 
  212.              cbezier(list(ctlpt(E2, -1.4, 0),
  213.                           ctlpt(E2, -3, 0),
  214.                           ctlpt(E2, -5, -0.5),
  215.                           ctlpt(E2, -7, -0.5))), off):
  216.   return = return * trans(vector(0, FLOOR + 0.6, -BASE_WIDTH / 2 - 0.1)): 
  217.   color(return, CYAN);
  218. #---------------------------------------------------------------------------
  219. makeView = function():
  220.   return = roty(-130) * scale(vector(0.1, 0.1, 0.1)) * rotx(25);
  221. #---------------------------------------------------------------------------
  222. makeBack = function():
  223.   return = poly(list(vector(-BASE_WIDTH,  3 * BASE_WIDTH,  3 * BASE_WIDTH),
  224.              vector(-BASE_WIDTH,  3 * BASE_WIDTH, -3 * BASE_WIDTH),
  225.              vector(-BASE_WIDTH, -3 * BASE_WIDTH, -3 * BASE_WIDTH),
  226.              vector(-BASE_WIDTH, -3 * BASE_WIDTH,  3 * BASE_WIDTH)),
  227.              FALSE):
  228.   attrib(return, "rgb", "64,0,0");
  229. #---------------------------------------------------------------------------
  230. moveCap = function(cap, n):
  231.   body = makeBody(FALSE):
  232.   domain = pdomain(body):
  233.   path = csurface(body, COL, (nth(domain, 1) + nth(domain, 2)) / 2):
  234.   domain = pdomain(path):
  235.   endT = nth(domain, 2):
  236.   middleT = (nth(domain, 1) + endT) / 2:
  237.   p = ceval(path, middleT):
  238.   return = cap * trans(-vector(coord(p, 1), coord(p, 2), coord(p, 3))):
  239.   t = (100 - n) * middleT / 100 + n * endT/ 100:
  240.   alpha = acos(ctangent(path, t) * ctangent(path, middleT)) * 180 / PI:
  241.   return = return * roty(alpha):
  242.   p = ceval(path, t):
  243.   return = return * trans(vector(coord(p, 1), coord(p, 2), coord(p, 3)));
  244. #---------------------------------------------------------------------------
  245. iritstate("EchoSource", TRUE);
  246. #---------------------------------------------------------------------------
  247. view_mat = makeView();
  248. dark = list(makeTube(), makeMicro());
  249. camera = list(
  250.   makeBody(TRUE),
  251.   makeSupport(),
  252.   moveCap(makeCap(), 75),
  253.   makeLeg(),
  254.   makeStopper(),
  255.   makeSpindel(),
  256.   makeTail(),
  257.   makeHolder(),
  258.   makeWire(),
  259.   dark,
  260.   view_mat);
  261. view(camera, TRUE);
  262. attrib(camera, "rgb", "128,128,128");
  263. attrib(dark, "rgb", "32,32,32");
  264. snoc(makeBack(), camera);
  265. #save("/tmp/camera.dat", camera);
  266.  
  267.  
  268.