Исчезновение сильно увеличенной модели при небольшом отдалении камеры

Я делаю эмулятор Солнечной системы с помощью Panda3D. Панду я встретил буквально месяц назад, документацию пока прочёл только наполовину (с английским не очень дружу), поэтому очень плохо в ней разбираюсь. Вначале было всё замечательно. Но когда я стал всё делать в реальном размере (взяв единицу пандовского расстояния за метр), Солнце стало исчезать при небольшом отдалении камеры от него (в сравнении с размерами Солнца) Вот код:

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

base.cam.setPos(0, -27459009, 0)
base.cam.lookAt(0, 0, 0)
base.camLens.setNearFar(1, 1000000000)
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("инициализация планеты начата")
        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)
        self.model.setPos(self.coord.vect[0], self.coord.vect[1], self.coord.vect[2])
        self.model.reparentTo(room)
        print("инициализация планеты закончена")
    def dvij(self):
        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], self.coord.vect[1], self.coord.vect[2])

class sputnik:
    def __init__(self, m, R, V, coord, texture, planet):
        print("инициализация спутника начата")
        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)
        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], self.coord.vect[1], self.coord.vect[2])

class sunclass:
    def __init__(self, m, R, coord, texture):
        print("инициализация звезды начата")
        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)
        self.model.setPos(self.coord.vect[0], self.coord.vect[1], self.coord.vect[2])

        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**30), 10000000, p.vector3D([0, 0, 0]), 'textures/планеты/текстуры планет/солнце/13913_Sun_diff.jpg')
zemla = planet(5.97 * (10**20), 100, p.vector3D([40000, 50000, 0]), p.vector3D([10000, 0, 0]), 'textures/планеты/текстуры планет/земля/Diffuse_2K.png')
loon = sputnik(7.35 * (10**10), 50, p.vector3D([40000, 30000, 0]), p.vector3D([8000, 0, 0]), 'textures/планеты/текстуры планет/луна/Bump_2K.png', zemla)

time.sleep(1)

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

При данном расстоянии камеры Солнце видно (base.cam.setPos(0, -27459008, 0)) Но если отдалится ещё на один (base.cam.setPos(0, -27459009, 0)), то Солнце исчезает с камеры. Но ведь до дальней границы ещё очень и очень далеко? Получается панда уже не способна обрабатывать такие расстояния/координаты? А можно сделать с этим что-нибудь? П.С. Цель была именно сделать всё в реальном масштабе и не сильно уменьшив. П.П.С. На всякий случай, код моей физики (вдруг понадобится)

import math
G = 6.67 * (10**(-11))
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

П.П.П.С. Буду очень рад замечаниям/советам по делу. Вот ссылка на скачивание проекта: https://yadi.sk/d/FeiLszD3gVh85w


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