如何解决尝试在y轴上旋转相机时图像偏斜
我一直在尝试使3D渲染正常工作,但是当相机在y轴上旋转时,图像会偏斜,而不是显示左右移动,而在x轴上旋转时,图像会向上移动并令人信服地下降。 Z旋转是唯一看起来正确的旋转。我刚刚开始尝试此操作,所以我经验不足,非常感谢您的帮助。
import pygame
import numpy as np
from math import *
import sys
# X,Y,Z
points = [[-1,1,1],[1,-1,[-1,-1],]
# locx,locy,locz
camera_pos = [0,-5]
# rotx,roty,rotz (2pi = 360*)
camera_rot = [0,0]
# px,py
resolution = [500,500]
# sx,sy
sensor = [1,1]
# f
focal = 1
# s
skew = 0
clock = pygame.time.Clock()
screen = pygame.display.set_mode((500,500))
def to_perspective(X,Z):
a = [[(focal * resolution[0])/(2*sensor[0]),skew,0],[0,(focal*resolution[1])/(2*sensor[1]),1]]
A = np.array(a)
b = [[1,cos(camera_rot[0]),-sin(camera_rot[0]),sin(camera_rot[0]),1]]
B = np.array(b)
c = [[cos(camera_rot[1]),sin(camera_rot[1]),[-sin(camera_rot[1]),cos(camera_rot[1]),1]]
C = np.array(c)
d = [[cos(camera_rot[2]),-sin(camera_rot[2]),[sin(camera_rot[2]),cos(camera_rot[2]),1]]
D = np.array(d)
e = [[1,-camera_pos[0]],-camera_pos[1]],-camera_pos[2]],1]]
E = np.array(e)
F = np.array([[X],[Y],[Z],[1]])
orthographic = A.dot(B.dot(C.dot(D.dot(E.dot(F)))))
x = orthographic[0][0]
y = orthographic[1][0]
z = orthographic[2][0]
np_orth = np.array(orthographic)
g = [[1/z,1/z,1]]
G = np.array(g)
perspective = G.dot(np_orth)
try:
_return = [int(perspective[0][0]),int(perspective[1][0])]
return _return
except ValueError:
return False
except OverflowError:
print(perspective)
return False
speed = 0.001
pygame.mouse.set_visible(0)
pygame.event.set_grab(True)
while True:
dt = clock.tick(120)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
sys.exit()
key_states = pygame.key.get_pressed()
if key_states[pygame.K_a]:
camera_pos[0] -= speed*dt
if key_states[pygame.K_d]:
camera_pos[0] += speed*dt
if key_states[pygame.K_w]:
camera_pos[2] += speed*dt
if key_states[pygame.K_s]:
camera_pos[2] -= speed*dt
if key_states[pygame.K_q]:
camera_pos[1] += speed*dt
if key_states[pygame.K_e]:
camera_pos[1] -= speed*dt
move = pygame.mouse.get_rel()
camera_rot[1] += move[0] * 0.001
camera_rot[0] += move[1] * 0.001
screen.fill((255,255,255))
point_pos = []
for i in points:
place = to_perspective(i[0],i[1],i[2])
if place is not False:
place[0] += 250
place[1] += 250
point_pos += [place]
pygame.draw.circle(screen,(0,0),place,5)
#print(place)
#print(camera_pos)
for i in point_pos:
for j in point_pos:
if i != j:
pygame.draw.line(screen,(i[0],i[1]),(j[0],j[1]))
pygame.display.update()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。