欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

明月当空照,python3D编程初阶:坐标、模型、纹理与光

程序员文章站 2022-03-20 11:38:26
...

Panda3D是由迪士尼参与维护的一个3d游戏引擎,本意是面向商业用户的,所以它的性能是很不错的,使用也很方便。Panda3D支持通过c++或python的开发。
安装Panda3D的最好办法就是直接去官方网站(panda3d.org)下载对应的安装包。
明月当空照,python3D编程初阶:坐标、模型、纹理与光

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)

这样两行代码,就可以给这个球星加上月亮的纹理。
明月当空照,python3D编程初阶:坐标、模型、纹理与光

纹理文件的本身是这样的:
明月当空照,python3D编程初阶:坐标、模型、纹理与光

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

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

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

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

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

有了光源,月亮看起来就更加真实了。
明月当空照,python3D编程初阶:坐标、模型、纹理与光