Advertisement
aaaranes

ARTS 1 - 3D Cube Source Code

May 25th, 2024
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.69 KB | Source Code | 0 0
  1. # Framework to use to have a window for showing the figure
  2. import pygame
  3. import math
  4.  
  5. # WINDOWS SIZE PARAMETERS
  6. WIDTH = 800
  7. HEIGHT = 600
  8. SCALE = 100
  9.  
  10. angle = 0.025    # Speed of rotation
  11.  
  12. # CONSTANTS
  13. WHITE = (255,255,255)
  14. RED = (255,0,0)
  15. GREEN = (0,255,0)
  16. BLUE = (0,0,255)
  17. BLACK = (0,0,0)
  18. PINK = (255,105,180)
  19. ORANGE = (255,165,0)
  20. YELLOW = (255,255,0)
  21. CYAN = (0,255,255)
  22.  
  23.  
  24. # Variables
  25. SCREEN_CENTER = (WIDTH/2,HEIGHT/2)
  26. x_rot: bool = False
  27. y_rot: bool = False
  28. z_rot: bool = False
  29. nx_rot: bool = False
  30. ny_rot: bool = False
  31. nz_rot: bool = False
  32. first_boot: bool = True
  33.  
  34.  
  35. # Module created for matrix operations for the 3D renderer
  36.  
  37. def matMult(mat1, mat2):
  38.     # Check for the sizes if they match (nxm) X (mxp) = nxp
  39.     mat3 = []
  40.     #print(mat1, mat2)
  41.     if (len(mat1[0]) == len(mat2)):
  42.         for i in range(len(mat1)):
  43.             temp = []
  44.             total = 0
  45.             for j in range(len(mat1[0])):
  46.                 total += mat2[j][0] * mat1[i][j]
  47.  
  48.             temp.append(total)
  49.             mat3.append(temp)
  50.     else:
  51.         print("Invalid Matrix size")
  52.         return None
  53.     return mat3
  54.  
  55. # Figure vertices
  56. cube = [
  57.     [[-1],[1],[-1]],
  58.     [[1],[1],[-1]],
  59.     [[1],[-1],[-1]],
  60.     [[-1],[-1],[-1]],
  61.     [[1],[1],[1]],
  62.     [[-1],[1],[1]],
  63.     [[-1],[-1],[1]],
  64.     [[1],[-1],[1]]
  65. ]
  66.  
  67. # Projection Matrix
  68. projectionMat = [
  69.     [1,0,0],
  70.     [0,1,0],
  71.     [0,0,0]
  72. ]
  73.  
  74. # Identity matrix
  75. identity = [
  76.     [1,0,0],
  77.     [0,1,0],
  78.     [0,0,1]
  79. ]
  80.  
  81. # Setup pygame
  82. pygame.init()
  83. screen = pygame.display.set_mode((WIDTH,HEIGHT))
  84. clock = pygame.time.Clock()
  85. running = True
  86.  
  87. # for i in range(8):
  88. #     # Events
  89. #     rotatedPoint = mat.matMult(identity,cube[i])
  90. # Main program loop
  91. while running:
  92.     # Render the cube vertices
  93.     # X-axis Matrix Rotation
  94.     rotateX = [
  95.         [1,0,0],
  96.         [0, math.cos(angle), -math.sin(angle)],
  97.         [0, math.sin(angle), math.cos(angle)]
  98.     ]
  99.  
  100.     rotateNX = [
  101.         [1,0,0],
  102.         [0, math.cos(-angle), -math.sin(-angle)],
  103.         [0, math.sin(-angle), math.cos(-angle)]
  104.     ]
  105.  
  106.     # Y-axis Matrix Rotation
  107.     rotateNY = [
  108.         [math.cos(-angle), 0, math.sin(-angle)],
  109.         [0, 1, 0],
  110.         [-math.sin(-angle), 0, math.cos(-angle)]
  111.     ]
  112.  
  113.     rotateY = [
  114.         [math.cos(angle), 0, math.sin(angle)],
  115.         [0, 1, 0],
  116.         [-math.sin(angle), 0, math.cos(angle)]
  117.     ]
  118.  
  119.     # Z-axis Matrix Rotation
  120.     rotateZ = [
  121.         [math.cos(angle), -math.sin(angle),0],
  122.         [math.sin(angle), math.cos(angle), 0],
  123.         [0,0,1]
  124.     ]
  125.  
  126.     rotateNZ = [
  127.         [math.cos(-angle), -math.sin(-angle),0],
  128.         [math.sin(-angle), math.cos(-angle), 0],
  129.         [0,0,1]
  130.     ]
  131.  
  132.     for event in pygame.event.get():
  133.         if event.type == pygame.QUIT:
  134.             running = False
  135.         if event.type == pygame.KEYDOWN:
  136.             if event.key == pygame.K_ESCAPE:
  137.                 running = False
  138.             if event.key == pygame.K_a:
  139.                 ny_rot = True
  140.             if event.key == pygame.K_d:
  141.                 y_rot = True
  142.             if event.key == pygame.K_w:
  143.                 nx_rot = True
  144.             if event.key == pygame.K_s:
  145.                 x_rot = True
  146.             if event.key == pygame.K_e:
  147.                 z_rot = True
  148.             if event.key == pygame.K_q:
  149.                 nz_rot = True
  150.         if event.type == pygame.KEYUP:
  151.             if event.key == pygame.K_a:
  152.                 ny_rot = False
  153.             if event.key == pygame.K_d:
  154.                 y_rot = False
  155.             if event.key == pygame.K_w:
  156.                 nx_rot = False
  157.             if event.key == pygame.K_s:
  158.                 x_rot = False
  159.             if event.key == pygame.K_e:
  160.                 z_rot = False
  161.             if event.key == pygame.K_q:
  162.                 nz_rot = False
  163.  
  164.     projectedPoints = []
  165.     z_points = []
  166.     for i in range(8):
  167.         rotatedPoint = matMult(identity,cube[i])
  168.        
  169.         screen.fill(WHITE)
  170.         if x_rot:
  171.             rotatedPoint = matMult(rotateX,rotatedPoint)
  172.         if nx_rot:
  173.             rotatedPoint = matMult(rotateNX,rotatedPoint)
  174.         if y_rot:
  175.             rotatedPoint = matMult(rotateY,rotatedPoint)
  176.         if ny_rot:
  177.             rotatedPoint = matMult(rotateNY,rotatedPoint)
  178.         if z_rot:
  179.             rotatedPoint = matMult(rotateZ,rotatedPoint)
  180.         if nz_rot:
  181.             rotatedPoint = matMult(rotateNZ,rotatedPoint)
  182.  
  183.         cube[i] = rotatedPoint
  184.         z = rotatedPoint[2][0]
  185.         #print(z)
  186.         z_points.append(z)
  187.         projectedPoint = matMult(projectionMat,rotatedPoint)
  188.         # projectedPoint = mat.rotateMult(projectionMat,cube[i])
  189.         x = projectedPoint[0][0]*SCALE + SCREEN_CENTER[0]
  190.         y = projectedPoint[1][0]*SCALE + SCREEN_CENTER[1]
  191.         # pygame.draw.circle(screen, GREEN, (x,y), 5)
  192.         projectedPoints.append((x,y))
  193.  
  194.     for j in range(len(projectedPoints)):
  195.         pygame.draw.circle(screen, GREEN, projectedPoints[j], 5)
  196.  
  197.     # Render the cube edges
  198.     pygame.draw.line(screen, BLACK, projectedPoints[0], projectedPoints[1])
  199.     pygame.draw.line(screen, BLACK, projectedPoints[1], projectedPoints[2])
  200.     pygame.draw.line(screen, BLACK, projectedPoints[2], projectedPoints[3])
  201.     pygame.draw.line(screen, BLACK, projectedPoints[3], projectedPoints[0])
  202.     pygame.draw.line(screen, BLACK, projectedPoints[0], projectedPoints[5])
  203.     pygame.draw.line(screen, BLACK, projectedPoints[4], projectedPoints[5])
  204.     pygame.draw.line(screen, BLACK, projectedPoints[5], projectedPoints[6])
  205.     pygame.draw.line(screen, BLACK, projectedPoints[6], projectedPoints[7])
  206.     pygame.draw.line(screen, BLACK, projectedPoints[7], projectedPoints[4])
  207.     pygame.draw.line(screen, BLACK, projectedPoints[4], projectedPoints[1])
  208.     pygame.draw.line(screen, BLACK, projectedPoints[3], projectedPoints[6])
  209.     pygame.draw.line(screen, BLACK, projectedPoints[2], projectedPoints[7])
  210.  
  211.     if (z_points[0] > z_points[5]):
  212.         pygame.draw.polygon(screen, RED, [projectedPoints[0], projectedPoints[1], projectedPoints[2], projectedPoints[3]])
  213.  
  214.         if (z_points[0] > z_points[4]):
  215.             pygame.draw.polygon(screen, ORANGE, [projectedPoints[0], projectedPoints[5], projectedPoints[6], projectedPoints[3]])
  216.             pygame.draw.polygon(screen, CYAN, [projectedPoints[7], projectedPoints[4], projectedPoints[1], projectedPoints[2]])
  217.         else:
  218.             pygame.draw.polygon(screen, CYAN, [projectedPoints[7], projectedPoints[4], projectedPoints[1], projectedPoints[2]])
  219.             pygame.draw.polygon(screen, ORANGE, [projectedPoints[0], projectedPoints[5], projectedPoints[6], projectedPoints[3]])
  220.  
  221.         pygame.draw.polygon(screen, PINK, [projectedPoints[5], projectedPoints[6], projectedPoints[7], projectedPoints[4]])
  222.     else:
  223.         pygame.draw.polygon(screen, PINK, [projectedPoints[5], projectedPoints[6], projectedPoints[7], projectedPoints[4]])
  224.  
  225.         if (z_points[0] > z_points[4]):
  226.             pygame.draw.polygon(screen, ORANGE, [projectedPoints[0], projectedPoints[5], projectedPoints[6], projectedPoints[3]])
  227.             pygame.draw.polygon(screen, CYAN, [projectedPoints[7], projectedPoints[4], projectedPoints[1], projectedPoints[2]])
  228.         else:
  229.             pygame.draw.polygon(screen, CYAN, [projectedPoints[7], projectedPoints[4], projectedPoints[1], projectedPoints[2]])
  230.             pygame.draw.polygon(screen, ORANGE, [projectedPoints[0], projectedPoints[5], projectedPoints[6], projectedPoints[3]])
  231.            
  232.         pygame.draw.polygon(screen, RED, [projectedPoints[0], projectedPoints[1], projectedPoints[2], projectedPoints[3]])
  233.        
  234.     first_boot = False
  235.     # Show changes
  236.     pygame.display.flip()
  237.     clock.tick(60)
  238.  
  239.  
  240.  
  241. pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement