Эмулятор солнечной системы. Исчезают планеты, появляется белый шар
Я делаю эмулятор Солнечной системы. Вод код:
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 шт):
Ааа, ну я и идиот. Зачем-то прикрепляю всё к модели (room = loader.loadModel("textures/планеты/планета.obj")), а не к точке (room = render.attachNewNode("room")), эта модель и вылазит, при слишком маленьком масштабе.