微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试在y轴上旋转相机时图像偏斜

如何解决尝试在y轴上旋转相机时图像偏斜

我一直在尝试使3D渲染正常工作,但是当相机在y轴上旋转时,图像会偏斜,而不是显示左右移动,而在x轴上旋转时,图像会向上移动并令人信服地下降。 Z旋转是唯一看起来正确的旋转。我刚刚开始尝试此操作,所以我经验不足,非常感谢您的帮助。

Python代码(p退出

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 举报,一经查实,本站将立刻删除。