人工智能对于小小菜来说真的有难度呢,那就先慢慢消化然后再总结一下趴,就先学pygame的其它方面啦!
pygame主要适用于2D画图,但是3D也是可以满足的呢,因为3D为创造出其画面感以及真实感,就是采用的近大远小的效果
正式进入3D世界之前,我们来体验一下3D给我们的感官享受
一、3D向量
在3D空间里,更好的表示运动当然就是3D向量啦
直接在已经安装好的gameobjects里面调用vector3即可
一些基本用法如下:
from gameobjects.vector3 import *
A = Vector3(6, 8, 12)
B = Vector3(10, 16, 12)
print("A is ", A)
print("B is ", B)
print("Magnitude of A is ", A.get_magnitude())
print("A + B is ", A+B)
print("A - B is ", A-B)
print("A normalised is ", A.get_normalised())
print("A * 2 is " , A *2)
而运行该段代码之后我们只能得到数字形式上的向量表达,我们需要做的就是将它放到图画上
二、3D移动
假如一个物体要从A点到B点,那我们在知道它坐标的基础上,就可以计算他们之间的向量然后再单位化,这样得到的结果就可以用于运动了
其计算过程可为:
from gameobjects.vector3 import *
A = (-6, 2, 2)
B = (7, 5, 10)
speed = 100.
AB = Vector3.from_points(A, B)
print("AB is ", AB )
distance = AB.get_magnitude()
print("AB distance is ", distance)
heading = AB.get_normalised()
print("AB normalised is ", heading)
我们可以通过位置加上他的速度与经过的时间,得到他的下一个坐标从而绘制在屏幕上
三、3D透视
透视离不开投影,但是pygame所有的绘图函数只接受2D坐标,故我们需要将其坐标投影在2D的图面上
平行投影
就是将Z坐标舍弃掉,代码如下
def parallel_project(vector3):
return(vector3.x, vector3.y)
但这样无法得到我们期望的三D效果,无法立体
立体投影
即透视,将远处的物体缩小,代码如下:
def perspective(vector3, d):
x, y, z = vector3
return (x*d/z, -y*d/z)
观察这个函数可知道有一个参数d
d(视距)
即摄像头到3D世界物体在屏幕上的像素体现之间的距离
而在我们玩游戏时,视距就是我们的眼睛的直线距离
视野
在一个能看到的角度,即决定3D画面上能展示多少东西,故需要一个d来决定透视深度,我们可以通过fov来计算出d
from math import tan
def calculate_viewing_distance(fov, screen_width):
d = (screen_width/2.0)/tan(fov/2.0)
return d
fov角度取45-60°比较适合,而若FPS的话,fov的可能较大,而策略性游戏其角度会较小
四、3D世界
我们用一个最简单的立体投影来实现一个3D画面
就是一个简单的立方体,以不同的视角来看到,拉大或拉远摄像头,改变视距
实际上3D和2D是非常相像的,只是多了一个z坐标来判断远近,都是基于时间运动,向量运算
而实际上3D世界是有3D引擎来做这些事的(可自行百度了解)
第六篇pygame的学习就到此结束啦!