planeten.py
planeten.py — text/python-source, 5 KB (5694 bytes)
Dateiinhalt
# -*- coding: utf-8 -*- # einfaches Planetensystem # Sonne (km,km,kg): s_radius=1.39e6 s_masse=2e30 # Merkur (km,d,d): mer_radius=2439 mer_umkreiszeit=88 mer_rotzeit=59 s_abstand_merkur=58e6 # Venus (km,d,d): v_radius=6050 v_umkreiszeit=224.7 v_rotzeit=243 s_abstand_venus=108e6 # Erde (km, km, kg,°,d): e_radius=12730 s_abstand_erde=150e6 e_masse=5,97e24 e_neigungswinkel=23.44 e_rotzeit=1 e_umkreiszeit=365 # Mond (km, kg) m_radius=1738 e_abstand_mond=384400 m_masse=7.35e22 m_rotzeit=29 m_umkreiszeit=29 # Mars (km, d, d, km): ma_radius=3397 ma_rotzeit=24.5 ma_umkreiszeit=687 s_abstand_mars=227e6 # Jupiter(): j_radius=71490 s_abstand_jupiter=777e6 j_umkreiszeit=365*11+316 j_rotzeit=0.35 # 1 Tag = 1 Minute bei zfakt=250 # 1 Tag = 1 Sekunde bei zfakt=4.16 zfakt = 250 from visual import * # das 3D-Modul from threading import * # das Modul für Nebenläufigkeit from math import * # das Mathe-Modul (sin, cos, log) #-- Oberflächen Mond und Mars (do it yourself ...) ------------ import Image name = "moon" width = 1024 height = 512 im = Image.open(name+".tga") materials.saveTGA(name,im) mondtextur = materials.texture(data=im, mapping="spherical") name = "mars" width, height = 1024/2, 512/2 im = Image.open(name+".tga") materials.saveTGA(name,im) marstextur = materials.texture(data=im, mapping="spherical") #----------------------------------------------------------------- def scale_dist(rohdaten): "globale Hilfsfunktion: skaliert Entfernungen" return sqrt(rohdaten) def scale_rad(rohdaten): "globale Hilfsfunktion: skaliert Radien" return sqrt(rohdaten) class Planet(Thread): "Klasse erstellt Planetenobjekte" def __init__(self, form=0, pos=(0,0,0), radius=e_radius, color=(1,1,1), rotzeit=1, umkreiszeit=365, zentrum=None,\ abstand_zentrum=0, material=materials.earth, neigungswinkel=23.4, spurlaenge=500, spurfarbe=(0.3,0,0)): Thread.__init__(self) self.f = frame(pos=pos) self.planet = sphere(frame=self.f) self.planet.material = material self.planet.radius = radius self.planet.color = color self.planet.frame=self.f self.neigungswinkel=neigungswinkel self.rotzeit=rotzeit self.umkreiszeit = umkreiszeit self.zentrum=zentrum self.abstand_zentrum = abstand_zentrum self.trail = curve(color=spurfarbe) self.spurlaenge = spurlaenge def run(self): x=0.0 while 1: rate(25) # max. 50 Berechnungen pro Sekunde self.planet.rotate(angle=pi/zfakt*5/self.rotzeit, axis=(0,1,0)) # Eigendrehung: 1d = 1min self.f.axis = (cos(radians(self.neigungswinkel)),sin(radians(self.neigungswinkel)),0) # Neuausrichtung der Frame-Axis für Planetenneigungswinkel if self.zentrum: self.f.pos = (self.zentrum.f.pos.x+self.abstand_zentrum*sin(x/self.umkreiszeit/zfakt), 0 ,self.zentrum.f.pos.z+self.abstand_zentrum*cos(x/self.umkreiszeit/zfakt)) #Bewegung um Zentrum self.trail.append(pos=self.f.pos, retain=int(self.spurlaenge*zfakt)) x+=1 if __name__ == '__main__': # falls Skript gestartet... scene.width=800 # Fensterbreite scene.height=400 # Fensterhöhe scene.forward-=vector(0,0.03,0.1) # Blickpunkt in Zentrum über den Bahnen...(Vektoraddition) print scene.forward # Kontrollausgabe des Vektors scene.lights=[distant_light(direction=(0.22, 0.44, 0.88), color=color.gray(0.4))] # nur schwaches 'Weltraumlicht' sonne = Planet(pos=(0,0,0),radius=scale_dist(s_radius), color = (1,1,0), material=materials.emissive) sonnenlicht = local_light(pos=(0,0,0), color=color.white) merkur = Planet(pos=(0,0,scale_dist(s_abstand_merkur)),radius=scale_rad(mer_radius), color = (1,0.6,0.2), material=materials.wood, rotzeit=mer_rotzeit, \ umkreiszeit=mer_umkreiszeit, zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_merkur)) venus = Planet(pos=(0,0,scale_dist(s_abstand_venus)), radius=scale_rad(v_radius), color=(0.4,0.6,0.8), material=materials.marble, rotzeit=v_rotzeit, \ umkreiszeit=v_umkreiszeit, zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_venus), spurlaenge=1000) erde = Planet(pos=(0,0,scale_dist(s_abstand_erde)), radius=scale_rad(e_radius), rotzeit=e_rotzeit, material=materials.earth,neigungswinkel=e_neigungswinkel,\ zentrum=sonne, umkreiszeit=e_umkreiszeit, abstand_zentrum=scale_dist(s_abstand_erde)) mond = Planet(pos=(0,0,0), radius=scale_rad(m_radius), zentrum=erde, abstand_zentrum=scale_dist(e_abstand_mond), \ material=mondtextur, rotzeit=m_rotzeit, umkreiszeit=m_umkreiszeit, spurlaenge=20000) """ mars = Planet(pos=(0,0,scale_dist(s_abstand_mars)), radius=scale_rad(ma_radius), zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_mars),\ umkreiszeit=ma_umkreiszeit, rotzeit=ma_rotzeit, material=marstextur, spurlaenge=300000) jupiter= Planet(pos=(0,0,scale_dist(s_abstand_jupiter)), radius=scale_rad(j_radius), zentrum=sonne, abstand_zentrum=scale_dist(s_abstand_jupiter),\ umkreiszeit=j_umkreiszeit, rotzeit=j_rotzeit, color=(0.7,0.3,0.2), material=materials.marble, spurlaenge=300000) """ # Planeten-Threads einzeln starten... merkur.start() venus.start() erde.start() mond.start() """ mars.start() jupiter.start() """