Holodisk model from the Fallout and Fallout 2 games.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

123 lines
4.1 KiB

  1. // dependency: https://github.com/revarbat/BOSL
  2. use <BOSL/transforms.scad>
  3. //use <BOSL/metric_screws.scad>
  4. use <BOSL/masks.scad>
  5. use <holodisk_spec.scad>
  6. use <anim.scad>
  7. include <tape.scad>
  8. use <tape_spool.scad>
  9. disk_size = get_holodisk_size();
  10. holodisk_size = get_holodisk_size();
  11. use <holodisk_frame.scad>
  12. module holodisk_mechanism() {
  13. size=get_holodisk_size();
  14. width=size.x;
  15. depth=size.y;
  16. height=size.z;
  17. plate=get_holodisk_bottom_thickness();
  18. tape_height=get_holodisk_tape_height();
  19. tape_thickness=get_holodisk_tape_thickness();
  20. spool_tape_tolerance=1;
  21. spool_inner_height=tape_height+spool_tape_tolerance;
  22. spool_inner_radius=4;
  23. spool_outer_radius=18;
  24. spool_plate_height=2;
  25. spool_plate_holes=3;
  26. spool_plate_hole_inner_rim=1;
  27. spool_plate_hole_outer_rim=4;
  28. spool1_depth=get_holodisk_spool1_socket_pos_center().y;
  29. spool2_depth=get_holodisk_spool2_socket_pos_center().y;
  30. spool3_depth=(spool1_depth+spool2_depth)/2;
  31. spool4_depth=disk_size.y*0.16;
  32. main_spools_x=get_holodisk_spool1_socket_pos_center().x;
  33. aux_spools_right_x=main_spools_x + spool_outer_radius + 1;
  34. aux_spools_left_x=main_spools_x - 13;
  35. middle_spool_in_r=2;
  36. middle_spool_out_r=7;
  37. aux_spool_plate_hole_inner_rim=2;
  38. aux_spool_plate_hole_outer_rim=2;
  39. spindle_diam=get_holodisk_spools_spindle_diam();
  40. spindle_diff_scale=1.02;
  41. tape_z=plate+spool_plate_height;
  42. module main_spool() {
  43. zrot(200*anim(ANIM_PLAYING(), ANIM_PLAYING()+1))
  44. spool(r_in=spool_inner_radius,
  45. r_out=spool_outer_radius,
  46. in_rim=spool_plate_hole_inner_rim,
  47. out_rim=spool_plate_hole_outer_rim,
  48. in_height=spool_inner_height,
  49. spindle_diam=spindle_diam, spindle_traction=true);
  50. down(plate)
  51. difference() {
  52. spindle(h=height, d=spindle_diam, traction=true);
  53. scale(spindle_diff_scale) holodisk_spool_spindle_connection_driver();
  54. }
  55. }
  56. module aux_spool() {
  57. zrot(500*anim(ANIM_PLAYING(), ANIM_PLAYING()+1))
  58. spool(r_in=middle_spool_in_r, r_out=middle_spool_out_r,
  59. in_rim=aux_spool_plate_hole_inner_rim,
  60. out_rim=aux_spool_plate_hole_outer_rim,
  61. in_height=spool_inner_height,
  62. spokes=4);
  63. }
  64. module spools() {
  65. up(plate) {
  66. right(main_spools_x) {
  67. back(spool1_depth) main_spool();
  68. back(spool2_depth) main_spool();
  69. }
  70. right(aux_spools_right_x) {
  71. back(spool3_depth) aux_spool();
  72. back(spool4_depth) aux_spool();
  73. }
  74. right(aux_spools_left_x) {
  75. back(spool4_depth) aux_spool();
  76. }
  77. }
  78. }
  79. module tapes() {
  80. spool1_tape_r = spool_outer_radius * 0.8;
  81. spool2_tape_r = spool_outer_radius * 0.5;
  82. up(plate + spool_plate_height) {
  83. // main spools
  84. right(main_spools_x) {
  85. back(spool1_depth) tape_spool(r_in=spool_inner_radius, r_out=spool1_tape_r);
  86. back(spool2_depth) tape_spool(r_in=spool_inner_radius, r_out=spool2_tape_r);
  87. }
  88. // TODO: convert to path
  89. // main 1 --> middle
  90. tape([main_spools_x + spool1_tape_r, spool1_depth, 0], [aux_spools_right_x + middle_spool_in_r, spool3_depth, 0]);
  91. // --> right corner
  92. right(aux_spools_right_x + middle_spool_in_r) tape([0, spool3_depth, 0], [0, spool4_depth, 0]);
  93. // --> left corner
  94. tape([aux_spools_left_x, spool4_depth - middle_spool_in_r, 0], [aux_spools_right_x, spool4_depth - middle_spool_in_r, 0]);
  95. // --> main 2
  96. tape([aux_spools_left_x - middle_spool_in_r, spool4_depth, 0], [main_spools_x - spool2_tape_r, spool2_depth, 0]);
  97. }
  98. }
  99. spools();
  100. tapes();
  101. }
  102. module holodisk() {
  103. holodisk_frame();
  104. holodisk_mechanism();
  105. }
  106. // test
  107. retraction=get_holodisk_size().y+10;
  108. back((1-anim(ANIM_INSERTING(), ANIM_RAISING())) * retraction) // anim insert
  109. back(anim(ANIM_CLOSING(), ANIM_END()) * retraction) // anim remove
  110. holodisk();