102-⾸发URSINA中⽂⼊门指南-打开⼭河社稷图
看《哪吒之魔童降世》有个印象很深的点,就是太⼄真⼈有个法宝,叫⼭河社稷图,⾥⾯包含了⼀个完整的世界。
URSINA也是,不⽐其他⼤型3D引擎少,该有的都有,可以在⾥⾯创建⼀个完整的世界。(不过好像作者提到没有独⽴光源。)
linux公社下载站它的API⽂档也是很少,但是基本上都好懂,只要会python,都能看懂。
⽹页上就⼀页,⼀千⾏左右,作者把它命名为cheat-sheet,意思可能是说看了这个相当于作弊吧,因为并没多少内容。可以在附件查看。
还是从简单的例⼦开始吧。
1.要有窗⼝:
跑之前 安装⼀下ursina就好了。 pip install ursina
from ursina import *
app=Ursina()
app.run
导⼊ursina库,⽤Ursina这个函数实例化⼀个app的对象,调⽤run的⽅法,把窗⼝跑起来。
三⾏代码就可以显⽰⼀个空的“⼭河社稷图”了。
2.关于坐标系
xyz是我们常⽤的坐标系,例如(1,2,3)代表⼀个点⾼度是3,平⾯投影是(1,2);
但ursina使⽤的是类似于相机坐标系,z代表深度,x,y是当前平⾯。
ursina的坐标系和我们理解的坐标系有点不⼀样,y和z对调了⼀下,不过没关系,我们可以写个简单的函数进⾏转换。
def switch_yz(vects): #for ursina unusual use of coord 7.16 solve the problem
t=[]
for item in vects:
strcmp函数是哪个库t.append((item[0],item[2],item[1]))
return tnotify和notifyall
3.画⼀个基本的地平⾯电脑disabled是什么意思
好吧,得说点稍微复杂的东西了。
python入门教程appursina 核⼼⼀个概念就是Entity,他是⼀个类,英⽂翻译为实体。这⾥我按照我的理解和模式来写例⼦,因为python的语法很灵活,⽤⼀个固定的模式来写,可能会让⼤家更专注于实现本⾝。
继承这个类。
class world(Entity):
定义类的初始化⽅法
def __init__(self):
super().__init__()
调⽤⽗类的初始化⽅法,world继承了Entity这个类,如果要初始化它原有的⽅法,必先来这么⼀下。如果没来这⼀下,很多⽅法就⽤不了。⽐如,下节我们会讲到让这个世界的物体动起来,要⽤⼀个update的⽅法,就是从Entity继承来的。super()代表⽗类,init前⾯的__代表这个⽅法是私有的,python真是简洁。
在初始化⽅法⾥⾯,还可以做些初始化的事情,⽐如,给这个世界加个地平⾯。
s =100
grid = Entity(model=Grid(s, s), scale=s, lor(0, 0, .8, 1), rotation_x=90,position=(-s / 2, 0, -s / 2))
定义⼀个100×100的⽹格,原点放在(-50,-50)的地⽅(x,y)。请注意ursina 的坐标系是(x,z,y),所以原点是
position=(-s/2,0,-s/2),⽹格默认是向z⽅向⽣成的,所以绕x轴转90度,铺开就是平⾯了。
看着还有点光突突,再加个xyz 轴,有个参照。直接上⼀份完整的代码,贴上去就可以跑的。
跑之前 安装⼀下ursina就好了。 pip install ursina
from ursina import *
class world(Entity):#Entity # 定义构造⽅法
def __init__(self):
super().__init__()
s =100
grid = Entity(model=Grid(s, s), scale=s, lor(0, 0, .8, 1), rotation_x=90,
position=(-s / 2, 0, -s / 2))
vertsx = ((0, 0, 0), (10, 0, 0))
Entity(model=Mesh(vertices=vertsx, mode='line', thickness=3), an)
vertsyz = [(0, 0, 0), (0, 5, 0), (0, 0, 0), (0, 0, 10)]
self.linesyz =Entity(model=Mesh(vertices=vertsyz, mode='line', thickness=3), llow)
if __name__ == '__main__':
app = Ursina()
world()
EditorCamera()
app.run()
4.要有点,线,⾯,体
Entity(model='quad', ange, position=(0,0,1), scale=1.5, rotation=(0,0,45))
作为最基础的对象,有⼀些基本参数是必须了解的,当然它有更多的参数,可以在需要的时候model模型参数,可加载⾃定义的模型,也可以加载预制带参数模型。
⽐如要画⼀堆点:模块化的两层含义
verts = []
verts_points = Entity(model=Mesh(vertices=verts, mode='point', thickness=15), )
for i in range(100):
verts.append(Vec3(2 * s(i +unts), i / 5, 2 * math.sin(i +unts)))
del=Mesh(vertices=verts, mode='point', thickness=15)
这么写是为了后续变化的世界做准备。先准备⼀个空的列表,⽣成点,然后修改这个模型。
再画个⾯。
verts = (Vec3(5, 0.01, 2), Vec3(5, 3, 2), Vec3(5, 3, 3), Vec3(5, 0.01, 3))
obj1 =Entity(model=Quad(vertices=verts),b(0,255,0,255))
obj2 = Entity(model='cube', texture = 'brick',position=(3,3,3))
好了,基本的东西差不多都会了,摸索⼀下,就可以搞出很多有意思的花样出来。
当然前提有⼀定的python基础,这个现在也⽐较⽕,些B站或者udacity的教程,可以很快⼊门。
下次以及下下次我们聊,怎么让物体在这个世界运动,碰撞,以及和⽤户交互的⼀些内容。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论