ForrestFox

Cube Rotation

Feb 18th, 2021 (edited)
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QBasic 2.09 KB | None | 0 0
  1. SCREEN 13
  2.  
  3. ' Vertex
  4. DATA -1, 1, 1
  5. DATA  1, 1, 1
  6. DATA  1,-1, 1
  7. DATA -1,-1, 1
  8. DATA -1, 1,-1
  9. DATA  1, 1,-1
  10. DATA  1,-1,-1
  11. DATA -1,-1,-1
  12.  
  13. ' Faces
  14. DATA 1,0,3,2
  15. DATA 4,5,6,7
  16. DATA 0,1,5,4
  17. DATA 2,3,7,6
  18. DATA 5,1,2,6
  19. DATA 0,4,7,3
  20.  
  21. TYPE vec2
  22.   x AS SINGLE
  23.   y AS SINGLE
  24. END TYPE
  25.  
  26. TYPE vec3
  27.   x AS SINGLE
  28.   y AS SINGLE
  29.   z AS SINGLE
  30. END TYPE
  31.  
  32. DIM v(0 TO 7) AS vec3
  33. DIM f(0 TO 5, 0 TO 3) AS INTEGER
  34. DIM p(0 TO 3) AS vec2
  35. DIM c AS vec3, t AS vec3, r AS vec3, cam AS vec3
  36.  
  37. ' Set camera position
  38. cam.x = 0: r.x = 0
  39. cam.y = 0: r.y = 1
  40. cam.z = 3: r.z = 0
  41.  
  42. ' Read vertex and face cube data
  43. FOR i = 0 TO 7: READ v(i).x, v(i).y, v(i).z: NEXT
  44. FOR i = 0 TO 5: READ f(i, 0), f(i, 1), f(i, 2), f(i, 3): NEXT
  45.  
  46. DO
  47.  
  48. ' List faces
  49. FOR i = 0 TO 5
  50.  
  51.   ' List face items
  52.   FOR j = 0 TO 3
  53.  
  54.     ' Get vertex id from face `i`, point on face `j`
  55.     c = v(f(i, j))
  56.  
  57.     ' Rotate X Axis
  58.     ' -----------------------------------------
  59.     t.x = c.x
  60.     t.y = c.y * COS(r.x) + c.z * SIN(r.x)
  61.     t.z = c.z * COS(r.x) - c.y * SIN(r.x)
  62.     c = t
  63.  
  64.     ' Rotate Y Axis
  65.     ' -----------------------------------------
  66.     t.x = c.x * COS(r.y) + c.z * SIN(r.y)
  67.     t.y = c.y
  68.     t.z = c.z * COS(r.y) - c.x * SIN(r.y)
  69.     c = t
  70.  
  71.     ' Add camera
  72.     c.x = c.x + cam.x
  73.     c.y = c.y + cam.y
  74.     c.z = c.z + cam.z
  75.  
  76.     ' Save to p(j)
  77.     p(j).x = 160 + 100 * c.x / c.z
  78.     p(j).y = 100 - 100 * c.y / c.z
  79.  
  80.   NEXT
  81.  
  82.   ' Draw lines
  83.   FOR j = 0 TO 3
  84.  
  85.     ' Calculate face direction
  86.     ABx = p(1).x - p(0).x: ABy = p(1).y - p(0).y
  87.     ACx = p(2).x - p(0).x: ACy = p(2).y - p(0).y
  88.  
  89.     ' Face is front
  90.     IF ACx * ABy < ACy * ABx THEN
  91.  
  92.       n = (j + 1) MOD 4
  93.       LINE (p(j).x, p(j).y)-(p(n).x, p(n).y)
  94.  
  95.     END IF
  96.  
  97.   NEXT
  98.  
  99. NEXT
  100.  
  101. ' Wait key
  102. DO: i$ = INKEY$: LOOP WHILE i$ = ""
  103.  
  104. CLS
  105.  
  106. st = .05
  107.  
  108. ' Control keys
  109. IF i$ = "w" THEN r.x = r.x + st
  110. IF i$ = "s" THEN r.x = r.x - st
  111. IF i$ = "a" THEN r.y = r.y + st
  112. IF i$ = "d" THEN r.y = r.y - st
  113. IF i$ = "q" THEN r.x = r.x + st: r.y = r.y + st
  114. IF i$ = "e" THEN r.x = r.x - st: r.y = r.y - st
  115.  
  116. LOCATE 2, 2: PRINT i$
  117.  
  118. LOOP WHILE i$ <> CHR$(27)
Add Comment
Please, Sign In to add comment