1

I'm trying to create a rotating plane in pygame. I'm converting 3d (x, y, z) coordinates to screen coordinates (x, y), and then rotating the screen coordinates. This seems to work when its rotating on both the x and y axis, but when it's rotating on only one axis (I commented out the y axis rotation) it is slanted. I can't seem to figure out why?

import pygame
import math

red = (255, 0, 0)

class Vector3:
    def __init__(self, _x, _y, _z):
        self.x = _x
        self.y = _y
        self.z = _z

class Vector2:
    def __init__(self, _x, _y):
        self.x = _x
        self.y = _y

class Plane:
    def draw(self, screen, value):
        scale = 25

        points = []
        vertices = [Vector3(0, 1, 0),
                    Vector3(1, 1, 0),
                    Vector3(1, 0, 0),
                    Vector3(0, 0, 0)]

        for vert in vertices:
            x, y = vec3to2(vert)
            points.append(Vector2(x * scale + 40, y * scale + 100))
            print((x, y))

        centerx = (points[0].x + points[1].x + points[2].x + points[3].x) / 4
        centery = (points[0].y + points[1].y + points[2].y + points[3].y) / 4

        for point in points:
            rotx, roty = vec3rot(point, math.radians(value), centerx, centery)
            point.x = rotx
            #point.y = roty

        pygame.draw.line(screen, red, (points[0].x, points[0].y), (points[1].x, points[1].y))
        pygame.draw.line(screen, red, (points[1].x, points[1].y), (points[2].x, points[2].y))
        pygame.draw.line(screen, red, (points[0].x, points[0].y), (points[3].x, points[3].y))
        pygame.draw.line(screen, red, (points[3].x, points[3].y), (points[2].x, points[2].y))

        pygame.draw.circle(screen, red, (int(centerx), int(centery)), 1)

def vec3to2(vect3):
    try:
        _x = vect3.x / vect3.z
    except ZeroDivisionError:
        _x = vect3.x

    try:
        _y = vect3.y / vect3.z
    except ZeroDivisionError:
        _y = vect3.y

    return(_x, _y)

def vec3rot(vect3, theta, centerx, centery):
    _x = centerx + (vect3.x - centerx) * math.cos(theta) - (vect3.y - centery) * math.sin(theta)
    _y = centery + (vect3.x - centerx) * math.sin(theta) + (vect3.y - centery) * math.cos(theta)

    return(_x, _y)

def main():
    pygame.init()
    screen = pygame.display.set_mode((640, 480))

    v = 0

    plane = Plane()

    running = True

    while running:
        screen.fill((0, 0, 0))
        plane.draw(screen, v)
        pygame.display.flip()
        v += 0.1
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

main()
da123
  • 11
  • 1
  • pygame already has vectors - [pygame.math.Vector2 , pygame.math.Vector3](https://www.pygame.org/docs/ref/math.html) – furas Dec 04 '19 at 02:18

0 Answers0