Panda3D是由迪士尼参与维护的一个3d游戏引擎,本意是面向商业用户的,所以它的性能是很不错的,使用也很方便。Panda3D支持通过c++或python的开发。

安装Panda3D的最好办法就是直接去官方网站(panda3d.org)下载对应的安装包。

python 模拟v8引擎 python 3d引擎_python

3D开发并不难,只是有一些基本概念必须掌握,我们将一边学习3D开发,一般复习天文知识。今天先介绍这几个概念:坐标、模型、纹理与光。

坐标

二维系统中也有坐标,2根轴;3D下当然就是三维坐标,3根轴。panda3D中的坐标原则是屏幕的水平方向是X轴,垂直方向是Z轴,而穿透屏幕的方向是Y轴。这样设计与直接的观感还是接近的,当我们理解面对的是三维物体时,会倾向于把XY屏幕水平放置,而Z轴竖直。

模型

我们先看一个简单的模型:球。
其实球并不简单,一个球是由很多小平面拼接而成的,只是它的观感给人以简单的感觉。
载入一个球的模型,并把它放到世界中显示:

self.moon = loader.loadModel("sphere")
self.moon.reparentTo(render)
self.moon.setPos(0,20,3)

setPos函数,把球放在一个三维坐标上(0,20,3)。为什么放在这里,与相机的默认位置有关,放在这里可以让我们不用动相机就能看到它。相机同样是3D编程的核心概念,我们后面的课程中再讲。
只需这样三行核心代码(完整代码8行),再加上足够的想象力,就可以让我们看到这轮明月了。

纹理

其实只是一个石膏模型,怎么能说它是月亮呢?给它加一个贴图就会好一些。贴图,在3D编程中被称作纹理。

self.moon_tex = loader.loadTexture("moon_1k_tex.jpg")
self.moon.setTexture(self.moon_tex, 1)

这样两行代码,就可以给这个球星加上月亮的纹理。

python 模拟v8引擎 python 3d引擎_python 模拟v8引擎_02

纹理文件的本身是这样的:

python 模拟v8引擎 python 3d引擎_3d_03

它是按照球形的规则贴在模型上的,这个规则是由模型指定的。制作模型是更加复杂的事,我们先学会怎么用它们就好了。

加上纹理之后的月亮,仍然显得不那么立体。我们看到的物体,其实是物体表面的反光形成的。而三维立体的感觉,正是来自三维物体不同位置上反光的差别。前面的例子中没有设置光源,使用了panda3d中默认的光源,那是平淡的背景光,在这样的光线效果下,很难表现出立体效果。
panda3d内置4种光源:

  • 点光源:它的原型是电灯泡,特点是有位置,无方向。
  • 平行光源:它的原型是太阳光,特点是无位置,有方向。
  • 聚光灯光源:它的原型是探照灯,特点是有位置,有方向。
  • 背景光:它的原型是漫反射光,特点是无位置,无方向。

正如我们已经看到的,背景光无法体现立体效果,在3D编程中一般来说只能作为一种补光存在,在没有其它光源照射的地方,靠背景光进行补光。如果没有背景光,看起来就是全黑的,这正好符合我们的天文研究。
让我们把这里最恰当的光源——太阳光加上,再来看看效果。
用下面这三行代码,即可加上平行光:

sunlight = panda3d.core.DirectionalLight('plight')
self.light = render.attachNewNode(sunlight)
render.setLight(self.light)

有了光源,月亮看起来就更加真实了。

python 模拟v8引擎 python 3d引擎_3d_04