Исчезновение сильно увеличенной модели при небольшом отдалении камеры
Я делаю эмулятор Солнечной системы с помощью 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