向前走的方程式

2024-03-28 09:50:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我为pygame编写了一个简单的3D引擎。现在我正在尝试创建一个简单的第一人称控制器,用于在场景中移动。引擎假设一个3D网格,玩家开始面向负z轴。相机可以围绕三个轴旋转,就像它在原点一样。目前,第一人称控制器只能绕y轴旋转,即环视360度。我试着让wasd控件相对于相机所看的方向移动。你知道吗

这是我目前拥有的(自动照相机是来自我的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引擎,但是到目前为止,代码的可读性还不是很好。你知道吗

谢谢。你知道吗


Tags: 引擎selfifmathsincoskeysscene
1条回答
网友
1楼 · 发布于 2024-03-28 09:50:30

我可能会被否决,但不管怎样。你知道吗

你的代码让我想起了我以前的一次尝试。然而,在面对无数的问题之后,我发现向量对我有很大的帮助,然后我学习了矩阵,因为这些矩阵对我有很大的帮助。你知道吗

这里有一个链接,指向一个名为Vector Math for 3D computer graphics的课程,这个课程已经很不错了,但是你甚至应该进一步使用4x4矩阵。也许看起来很无聊,但一旦你明白了,你会很高兴看到逻辑变得多么简单。你知道吗

相关问题 更多 >