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

日食的形成,python3D编程:材质

程序员文章站 2022-03-05 10:32:47
...

前面的课程中,太阳只是以光源的身份出现,现在我们希望太阳走上前台,让我们能够看到。不过,这就有了一个问题:月亮是靠反射光源的光才让我们看到,但太阳不是这样,它本身就发光。为了进行这种设置,我们引入3D开发中的下一个概念:材质。
日食的形成,python3D编程:材质

材质

材质也是模型表面的一种特性,它和纹理不同,纹理只是图片,材质则定义的是质感,比如反光率、发光情况,等等。
材质+纹理+光源,三者共同决定了三维模型看起来的样子。
材质包括五种属性:

  • 环境光漫反射率(Ambient)
  • 方向光(环境光之外的其它三种光)漫反射率(Diffuse)
  • 方向光镜面反射率(Specular)
  • 闪光程度(Shininess):光斑大小
  • 发光率(Emission)

通过精细地调整这几个参数,可以让模型呈现不同的材质特点。未设置材质的模型,看起来基本就像是石膏制造的:没有镜面反射、不发光、环境光和方向光全部都以漫反射的形式发出来。这种特点还是比较适合月亮的材质。
至于太阳,我们也不关心它的反射情况,只是设置它的发光。

sunMaterial = panda3d.core.Material()
sunMaterial.setEmission((1, 1, 1, 1))
self.sun.setMaterial(sunMaterial)

我们设置太阳发光率在RGB三种颜色都是100%(1)

日食的原理

为了观察日食,我们让太阳和光源一起运动。正如我们从天文知识了解的,新月状态下才会发生日食,即月亮遮挡太阳。
日食的形成,python3D编程:材质

在地球上,由于观察角度的不同,日食并不经常出现。但在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