日食的形成,python3D编程:材质
程序员文章站
2022-03-05 10:32:47
...
前面的课程中,太阳只是以光源的身份出现,现在我们希望太阳走上前台,让我们能够看到。不过,这就有了一个问题:月亮是靠反射光源的光才让我们看到,但太阳不是这样,它本身就发光。为了进行这种设置,我们引入3D开发中的下一个概念:材质。
材质
材质也是模型表面的一种特性,它和纹理不同,纹理只是图片,材质则定义的是质感,比如反光率、发光情况,等等。
材质+纹理+光源,三者共同决定了三维模型看起来的样子。
材质包括五种属性:
- 环境光漫反射率(Ambient)
- 方向光(环境光之外的其它三种光)漫反射率(Diffuse)
- 方向光镜面反射率(Specular)
- 闪光程度(Shininess):光斑大小
- 发光率(Emission)
通过精细地调整这几个参数,可以让模型呈现不同的材质特点。未设置材质的模型,看起来基本就像是石膏制造的:没有镜面反射、不发光、环境光和方向光全部都以漫反射的形式发出来。这种特点还是比较适合月亮的材质。
至于太阳,我们也不关心它的反射情况,只是设置它的发光。
sunMaterial = panda3d.core.Material()
sunMaterial.setEmission((1, 1, 1, 1))
self.sun.setMaterial(sunMaterial)
我们设置太阳发光率在RGB三种颜色都是100%(1)
日食的原理
为了观察日食,我们让太阳和光源一起运动。正如我们从天文知识了解的,新月状态下才会发生日食,即月亮遮挡太阳。
在地球上,由于观察角度的不同,日食并不经常出现。但在3D模型中,我们可以在每次新月都看到日食。通过设置日月大小比例的细微变化,我们可以选择看到日环食和日全食两种模式。
# 环食
self.sun.setScale(3.1)
# 全食
# self.sun.setScale(2.5)
运动控制
既然我们的关注点是日食,我们就希望在日食发生的时候,运动速度慢一些,过了之后,速度可以快一点。我们用日月距离作为速度调整的依据。
a= self.sun.getPos()
b= self.moon.getPos()
x= (a[0]-b[0])**2+(a[1]-b[1])**2+(a[2]-b[2])**2
if x<1610:
speed= 0.2
elif x<1760:
speed= 2
else:
speed= 20
speed= 20
确定了速度之后,我们来计算角度,这次,就不能使用task.time了,因为task.time是一个全局时间,只适合匀速运动。我们使用globalClock.getDt()函数,可以取到每次的间隔时间,对于变速运动是非常合适的。
delta = globalClock.getDt()
self.angle+= delta * speed