Вращение над списком в Pygame - PullRequest
2 голосов
/ 20 марта 2019

Если я смогу получить некоторую помощь, я опубликую больше этого кода.Это немного странно.Я взял это из видео и немного почистил.По сути, он фиксирует все x координаты в cam.pos[0], все y координаты в cam.pos[1] и все z координаты в cam.pos[2].В моей трехмерной среде есть несколько десятков кубов, из которых я могу двигаться, далеко, выше, ниже, влево и вправо.Но я не могу повернуться.Это моя попытка штопора:

while True:
 dt = clock.tick()/1000
 rot = clock.tick()/1000
 r = rot*36
 for event in pygame.event.get():
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_x:
             cam.pos[0] = cam.pos[0]*np.cos(r)-cam.pos[1]*np.sin(r)
             cam.pos[1] = cam.pos[0]*np.sin(r)-cam.pos[1]*np.cos(r)
             cam.pos[2] = cam.pos[2]
     if event.type == pygame.QUIT: pygame.quit(); sys.exit()
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_ESCAPE: pygame.quit(); sys.exit()

     cam.events(event)
 screen.fill((0,0,0))
 face_list = []; face_color = []; depth = []
 for obj in cubes:

     vert_list = []; screen_coords = []
     for x,y,z in obj.verts:
         x-=cam.pos[0]; y-=cam.pos[1]; z-=cam.pos[2]

Я могу опубликовать больше, если кому-то интересно.Он не возвращает никаких ошибок, но и не является штопором.Спасибо.

По какой-то причине удаление кода не работает.Вы можете посмотреть его здесь: python_flyer

Вы можете видеть, что я внес изменения:

datax = cam.pos[0]
datay = cam.pos[1]
for i in range(datax):
for j in range(datay):
cam.pos[0] = i * np.cos(r) - j * np.sin(r)
cam.pos[1] = i * np.sin(r) - j * np.cos(r)

Ошибка теперь:

for i in range(datax):
TypeError: 'float' object cannot be interpreted as an integer

Я называю это прогрессом

1 Ответ

1 голос
/ 20 марта 2019

Знайте, после строки

cam.pos[0] = cam.pos[0]*np.cos(r)-cam.pos[1]*np.sin(r)

значение в cam.pos[0] изменено. Итак, результат

cam.pos[1] = cam.pos[0]*np.sin(r)-cam.pos[1]*np.cos(r)

зависит от вычисления первого выражения.

Сохранить содержимое cam.pos в локальных переменных до вычисления поворота.
Далее формула вращения неверна. См. Матрица вращения - в двух измерениях :

x` = x * cos(theta) - y * sin(theta)
y` = x * sin(theta) + y * cos(theta)
* * 1 022, например,
x, y, z = cam.pos    
cam.pos[0] = x * np.cos(r) - y * np.sin(r)
cam.pos[1] = x * np.sin(r) + y * np.cos(r)
cam.pos[2] = z   

Не звоните clock.tick() дважды подряд. Эта функция возвращает количество миллисекунд, прошедших с момента предыдущего вызова. Таким образом, второй вызов всегда вернет 0.0.

Положение вашей камеры (0, 0, -5). Если эта позиция повернута вокруг оси z любым ангелом, то результат все еще (0, 0, -5). Поверните его вокруг оси Y.

Попробуйте следующий код, который оживит вашу сцену:

while True:
    ticks = clock.tick()
    dt = ticks/1000
    rot = ticks/1000

    r = rot
    x, y, z = cam.pos    
    cam.pos[0] = x * np.cos(r) - z * np.sin(r)
    cam.pos[1] = y 
    cam.pos[2] = x * np.sin(r) + z * np.cos(r)   
...