Эмулятор солнечной системы. Исчезают планеты, появляется белый шар

Я делаю эмулятор Солнечной системы. Вод код:

    
import sys
from panda3d.core import *
import direct.directbase.DirectStart
import numpy as np
import phyz as p
from direct.task import Task
import time
global bliz
bliz = 1000
base.cam.setPos(0, -40000 / bliz, 0)
base.cam.lookAt(0, 0, 0)
base.camLens.setNearFar(1, 1000000)
base.set_background_color(0, 0, 0, 1)  # цвет фона окна
base.setFrameRateMeter(True) 
base.accept('escape', sys.exit)
room = loader.loadModel("textures/планеты/планета.obj")
room.reparentTo(render)

class planet:
    def __init__(self, m, R, V, coord, texture):
        print("инициализация планеты начата")
        global bliz
        self.m = m
        self.R = R
        self.V = V
        self.coord = coord
        self.texture = loader.loadTexture(texture)
        self.model = loader.loadModel("textures/планеты/планета.obj")
        self.model.setTexture(self.texture)
        self.model.setScale(R/bliz)
        self.model.setPos(self.coord.vect[0], self.coord.vect[1], self.coord.vect[2])
        self.model.reparentTo(room)
        print("инициализация планеты закончена")
    def dvij(self):
        global bliz
        F = p.gravity(self.m, sun.m, self.coord, sun.coord)
        self.V = p.delta_V(self.m, self.V, F)
        self.coord = p.delta_coord(self.coord, self.V)
        self.model.setPos(self.coord.vect[0]/bliz, self.coord.vect[1]/bliz, self.coord.vect[2]/bliz)
class sputnik:
    def __init__(self, m, R, V, coord, texture, planet):
        print("инициализация спутника начата")
        global bliz
        self.planet = planet
        self.m = m
        self.R = R
        self.V = V
        self.coord = coord
        self.texture = loader.loadTexture(texture)
        self.model = loader.loadModel("textures/планеты/планета.obj")
        self.model.setTexture(self.texture)
        self.model.setScale(R/bliz)
        self.model.setPos(self.coord.vect[0], self.coord.vect[1], self.coord.vect[2])
        self.model.reparentTo(room)
        print("инициализация спутника закончена")
    def dvij(self):
        F1 = p.gravity(self.m, self.planet.m, self.coord, self.planet.coord)
        F2 = p.gravity(self.m, sun.m, self.coord, sun.coord)
        F = F1 + F2
        self.V = p.delta_V(self.m, self.V, F)
        self.coord = p.delta_coord(self.coord, self.V)
        self.model.setPos(self.coord.vect[0]/bliz, self.coord.vect[1]/bliz, self.coord.vect[2]/bliz)

class sunclass:
    def __init__(self, m, R, coord, texture):
        print("инициализация звезды начата")
        global bliz
        self.m = m
        self.R = R
        self.coord = coord
        self.texture = loader.loadTexture(texture)
        self.model = loader.loadModel("textures/планеты/планета.obj")
        self.model.setTexture(self.texture)
        self.model.setScale(R/bliz)
        self.model.setPos(self.coord.vect[0], self.coord.vect[1], self.coord.vect[2])
        self.model.reparentTo(render)
#        self.lightpivot = render.attachNewNode("lightpivot")
#        self.lightpivot.setPos(0, 0, 0)
#        self.plight = PointLight('plight')
#        self.plight.setColor((30, 30, 20, 1))
#        self.plnp = self.lightpivot.attachNewNode(self.plight)
#        self.plnp.setPos(0, 0, 0)
#        room.setLight(self.plnp)
#        self.model.reparentTo(self.plnp)
#        
#        room.setShaderAuto()
#
#        self.shaderenable = 1
        print("инициализация звезды закончена")
    

sun = sunclass(1.9891*(10**25), 400, p.vector3D([0, 0, 0]), 'textures/планеты/текстуры планет/солнце/13913_Sun_diff.jpg')
zemla = planet(5.97 * (10 ** 24), 100, p.vector3D([0, 0, 10000]), p.vector3D([10000, 0, 0]), 'textures/планеты/текстуры планет/земля/Diffuse_2K.png')
loon = sputnik(7.35 * (10 ** 15), 50, p.vector3D([8000, 0, 5000]), p.vector3D([8000, 0, 0]), 'textures/планеты/текстуры планет/луна/Bump_2K.png', zemla)

time.sleep(1)

def update(task):
        zemla.dvij()
        loon.dvij()
        return task.cont
taskMgr.add(update, 'update')
base.run()

Файл физики (phyz.py):


import math
G = 6.67 * (10**(-17))
class vector3D:
    vect = [0, 0, 0]
    def __init__(self, vect):
        if list == type(vect):
            self.vect = vect
        else:
            print("!!!WARNING!!!", vect, "isn't a vector (it must be list). The default null vector is taken as the value")
    def __add__(self, vect2):
        vector_rezult = [None, None, None]
        vector_rezult[0] = self.vect[0] + vect2.vect[0]
        vector_rezult[1] = self.vect[1] + vect2.vect[1]
        vector_rezult[2] = self.vect[2] + vect2.vect[2]
        return vector3D(vector_rezult)
    def __sub__(self, vect2):
        vector_rezult = [None, None, None]
        vector_rezult[0] = self.vect[0] - vect2.vect[0]
        vector_rezult[1] = self.vect[1] - vect2.vect[1]
        vector_rezult[2] = self.vect[2] - vect2.vect[2]
        return vector3D(vector_rezult)
    def __mul__(self, chislo):
        vector_rezult = [None, None, None]
        vector_rezult[0] = self.vect[0] * chislo
        vector_rezult[1] = self.vect[1] * chislo
        vector_rezult[2] = self.vect[2] * chislo
        return vector3D(vector_rezult)
    def __truediv__(self, chislo):
        vector_rezult = [None, None, None]
        vector_rezult[0] = self.vect[0] / chislo
        vector_rezult[1] = self.vect[1] / chislo
        vector_rezult[2] = self.vect[2] / chislo
        return vector3D(vector_rezult)
    
    def leng(self):
        rezult = math.sqrt(self.vect[0]**2 + self.vect[1]**2 + self.vect[2]**2)
        return rezult
    
def gravity(m1, m2, coord1, coord2):
    R = coord2 - coord1
    r = R.leng()
    F = (m1 * m2 * G)/(r**3)
    F = R*F
    return F
def delta_V(m, V, F):
    a = F / m
    V = V + a
    return V
def delta_coord(coord, V):
    new_coord = coord + V / 1000
    return new_coord

Глобальная переменная bliz (основной файл) является неким коэффициентом, отвечающим за размер всей системы, не влияя на пропорции и внешний вид. Но при bliz = 1000 и более, Земля и Луна исчезают, а вместо Солнца оказывается огромный белый шар. Внутри этого шара остаётся Солнце, но меньше, чем должно быть. А планет так и не видно. С чем это может быть связано? Я думал, что накапливаются ошибки float, но откуда появляется белый шар? И как это исправить?


Ответы (1 шт):

Автор решения: filkar2005

Ааа, ну я и идиот. Зачем-то прикрепляю всё к модели (room = loader.loadModel("textures/планеты/планета.obj")), а не к точке (room = render.attachNewNode("room")), эта модель и вылазит, при слишком маленьком масштабе.

→ Ссылка