我为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引擎,但是到目前为止,代码的可读性还不是很好。你知道吗
谢谢。你知道吗
我可能会被否决,但不管怎样。你知道吗
你的代码让我想起了我以前的一次尝试。然而,在面对无数的问题之后,我发现向量对我有很大的帮助,然后我学习了矩阵,因为这些矩阵对我有很大的帮助。你知道吗
这里有一个链接,指向一个名为Vector Math for 3D computer graphics的课程,这个课程已经很不错了,但是你甚至应该进一步使用4x4矩阵。也许看起来很无聊,但一旦你明白了,你会很高兴看到逻辑变得多么简单。你知道吗
相关问题 更多 >
编程相关推荐