python之pygame3D画面(六)

人工智能对于小小菜来说真的有难度呢,那就先慢慢消化然后再总结一下趴,就先学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的学习就到此结束啦!

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值