vpython полет ракеты

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#-*-coding:utf-8-*-
from time import sleep
from random import random,choice
from visual import *
# создаем "сцену", определяем параметры экрана
scene = display(title='Rocket',
width=640, height=480)
# Если нужно, то показываем в полноэкранном режиме
#scene.fullscreen=1
# Если есть стерео очки, оставляем это, мне понравилось :)
#scene.stereo = 'redcyan'
# Указываем "масшаб" камеры
scene.range=(15,15,15)
# Указываем положение камеры
scene.center=(0,0,0)
# Куда смотрит камера
scene.forward=vector(1,-1,2)
# Величина освещения
scene.ambient=0.3
# Создадим кадр, на котором у нас будет размещаться ракека
s=frame()
# начнем рисовать ракету...
# цилиндр
cylinder(pos=(-0,0,-0), axis=(0,6,0), radius=1,frame=s,color=(0.5,0.5,0.5))
# конус сверху
cone(pos=(0,5.9,0),axis=(0,2,0),rarius=1,frame=s)
# и 4 стабилизатора...
a=[
[(1,0.5,0),(1.5,0,0),(1.5,-2,0),(0.8,0,0)],
[(-1,0.5,0),(-1.5,0,0),(-1.5,-2,0),(-0.8,0,0)],
[(0,0.5,-1),(0,0,-1.5),(0,-2,-1.5),(0,0,-0.8)],
[(0,0.5,1),(0,0,1.5),(0,-2,1.5),(0,0,0.8)]
]
for x in a:
v=convex(pos=x,radius=0.5,frame=s)
v.color=(0.5,0.5,0.5)
# Сферой и конусом сделаем пламя, которое вырывается из сопла
f=sphere(pos=(0,-0.7,0),radius=1,frame=s)
f.color=color.red
f1=cone(pos=(0,-0.9,0),axis=(0,-5,0),radius=0.7,frame=s)
f1.color=color.red
# создадим земля... 20 на 20 квадратов, по 10 метров каждый
for x in xrange(-100,100,10):
for y in xrange(-100,100,10):
b=box(pos=(-2+x,-3,y),axis=(10,0,0),lenght=10,height=0.1,width=10)
# выбираем случайный цвет для каждого
b.color=choice([color.red,color.green,color.blue])
# n это будет высота
n=0
# начнем полет
for x in xrange(0,1000):
sleep(0.005)
# увеличиваем высоту кадра s, тем самым поднимается все что есть в кадре
s.y+=0.1
# увеличиваем n
n+=0.1
# соответственно поднимаем камеру
scene.center=(0,n,0)
# меняем направление камеры
scene.forward=vector(1,-1-n/10,2-n/10)
# симулируем эффект пламени, меняя случайным образом красный цвет
f.red=random()
f1.red=random()
# убираем пламя
f1.visible=0
f.visible=0
# поворачиваем ракету на 180 и балуемся с положением камеры
for x in xrange(500):
sleep(0.001)
s.rotate(angle=0.006)
n-=0.2
scene.forward=vector(1,-1-n/10,2-n/10)
k=0
# пока ракета не упала, падаем ее...
while s.y>0:
sleep(0.005)
k+=0.001
s.y-=k
n-=k
scene.center=(0,n+100,0)
scene.forward=vector(1,-1+n/10,2+n/10)