Я пытаюсь создать простой 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
Почему у меня нарушается вращение (вверх/вниз) при повороте на 90 градусов влево или вправо и как это исправить? ⇐ Python
Программы на Python
1765370415
Гость
Я пытаюсь создать простой 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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79841700/why-does-my-rotation-up-down-break-when-i-rotate-90-degrees-left-or-right-a[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия