向前走的方程式

时间:2017-09-10 20:23:54

标签: python 3d pygame

我为pygame写了一个简单的3D引擎。现在我试图创建一个简单的第一人称控制器来移动场景。引擎呈现3D网格,玩家开始面向负z轴。相机可以围绕三个轴旋转,就像它在原点一样。目前,第一人控制器只能绕y轴旋转 - 即环视360度左右。我试图让wasd控件相对于相机正朝着哪个方向移动。

这是我目前所拥有的(self.camera是我的3D引擎中的相机对象,具有x,y,z(位置)和x_rot,y_rot,z_rot(旋转)属性:

import python3d as p3d
import pygame
import math

class first_person_controller:
    def __init__(self,scene,camera,end_func):
        pygame.event.set_grab(True)
        pygame.mouse.set_visible(False)
        self.scene = scene
        self.camera = camera
        self.end_func = end_func

    def fps_control(self):
        keys = pygame.key.get_pressed()
        relative = pygame.mouse.get_rel()
        self.camera.change_camera_rot([0,relative[0]/1000*-1,0])
        if keys[pygame.K_w]:
            self.camera.z += math.cos(self.camera.y_rot) * 5 * -1
            self.camera.x += math.sin(self.camera.y_rot) * 5 * -1
        if keys[pygame.K_s]:
            self.camera.z += math.cos(self.camera.y_rot) * 5
            self.camera.x += math.sin(self.camera.y_rot) * 5
        if keys[pygame.K_a]:
            self.camera.z += math.cos(self.camera.y_rot + math.radians(90)) * 5 * -1
            self.camera.x += math.sin(self.camera.y_rot + math.radians(90)) * 5 * -1
        if keys[pygame.K_d]:
            self.camera.z += math.cos(self.camera.y_rot + math.radians(90)) * 5
            self.camera.x += math.sin(self.camera.y_rot + math.radians(90)) * 5
        if keys[pygame.K_ESCAPE]:
            self.end_func()
        if keys[pygame.K_c]:
            self.camera.y = 0
        elif not keys[pygame.K_c]:
            self.camera.y = 5

这应该适合普通的pygame循环,如:

while True:
   clear screen
   fps_control()
   render scene

然而,当实施时,第一人称控制器偏离正轨,并且至少看起来不是直线行走。我无法判断这是因为我的数学还是我的引擎。

如果有人能告诉我哪个是问题 - 三角法或3D引擎,如果它的三角法表示更好的方程式,那就太棒了。

如果它有帮助,here是3D引擎,但截至目前,代码不具备可读性。

感谢。

1 个答案:

答案 0 :(得分:2)

我可能会被投票支持,但无论如何。

您的代码让我想起了我自己的3D引擎的早期尝试。然而,面对众多问题之后,我认为Vectors会帮助我很多,然后我学习了Matrices,因为这些帮助 TONS MORE

这是一个名为Vector Math for 3D computer graphics的课程的链接,它已经很棒,但是你甚至可以通过使用4x4矩阵更进一步。可能看起来很无聊,但是你会很高兴看到一旦你得到它就会变得多么容易。