Почему у меня нарушается вращение (вверх/вниз) при повороте на 90 градусов влево или вправо и как это исправить?Python

Программы на Python
Ответить
Гость
 Почему у меня нарушается вращение (вверх/вниз) при повороте на 90 градусов влево или вправо и как это исправить?

Сообщение Гость »

Я пытаюсь создать простой 3D-рендерер в CMU Graphics, используя матрицы вращения. Когда я поворачиваю камеру на 90 градусов (влево или вправо) и пытаюсь повернуть (вверх/вниз), она выполняет «бочку», когда должна изменить шаг.
Камера сначала выравнивается по оси Z, затем при вращении вверх/вниз вращается вокруг оси X, но когда я поворачиваюсь так, чтобы камера была выровнена по оси X, она все равно вращается вокруг оси X, хотя должна вращаться вокруг оси Z.
Вот мой код:
from cmu_graphics import *
import numpy as np
import math as m

SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400

move_speed = 0.1

rxyza = np.array([2.5, 2, 2])
rxyzb = np.array([2, 2.5, 2])
rxyzc = np.array([2, 2, 2.5])

app.cxyz = np.array([3.0, 2.0, 1.0])

app.B = np.identity(3)
beta = m.radians(5)
R1 = np.array([[1, 0, 0], [0, m.cos(beta), -m.sin(beta)], [0, m.sin(beta), m.cos(beta)]])
R2 = np.array([[m.cos(beta), 0, -m.sin(beta)], [0, 1, 0], [m.sin(beta), 0, m.cos(beta)]])
R3 = np.array([[m.cos(beta), -m.sin(beta), 0], [m.sin(beta), m.cos(beta), 0], [0, 0, 1]])

app.triangles = Group()

def onMouseDrag(mouseX, mouseY): # on mouse move
pass

def onMousePress(mouseX, mouseY): # on mouse down
pass

def onMouseHold(mouseX, mouseY): # while key down
pass

def onMouseRelease(mouseX, mouseY):
pass

def onKeyDown(keys): # on key down
pass

def onKeyHold(keys): # while key down
# move camera
if "w" in keys:
app.cxyz += app.B[:, 2] * move_speed
if "a" in keys:
app.cxyz -= app.B[:, 0] * move_speed
if "s" in keys:
app.cxyz -= app.B[:, 2] * move_speed
if "d" in keys:
app.cxyz += app.B[:, 0] * move_speed
if "q" in keys:
app.cxyz[1] += move_speed
if "e" in keys:
app.cxyz[1] -= move_speed

# rotate camera
if "up" in keys:
app.B = R1.T @ app.B
if "left" in keys:
app.B = R2 @ app.B
if "down" in keys:
app.B = R1 @ app.B
if "right" in keys:
app.B = R2.T @ app.B

def onKeyRelease(key):
pass

app.frame = 0

def onStep(): # on frame (30 fps)
app.triangles.clear()

p1 = app.B.T @ (rxyza - app.cxyz)
p2 = app.B.T @ (rxyzb - app.cxyz)
p3 = app.B.T @ (rxyzc - app.cxyz)

if p1[2] > 0 and p2[2] > 0 and p3[2] > 0: # all points are in front of the camera
scale = 500
points_2d = []
for p in [p1, p2, p3]:
x = int(SCREEN_WIDTH / 2 + (p[0] / p[2]) * scale)
y = int(SCREEN_HEIGHT / 2 - (p[1] / p[2]) * scale)
points_2d.append((x, y))

app.triangles.add(Polygon(points_2d[0][0], points_2d[0][1], points_2d[1][0], points_2d[1][1], points_2d[2][0], points_2d[2][1], fill = None, border = "black"))
app.frame += 1

cmu_graphics.run()


Подробнее здесь: https://stackoverflow.com/questions/798 ... or-right-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»