Так что для школьного проекта мне нужно построить танк, который может стрелять снарядами.У меня есть объект (цилиндр), который находится на кончике канона (чтобы он выглядел как внутренняя часть канона).Этот объект также является моей стартовой точкой, с которой производится выстрел.Многие из моих имен объектов могут быть на французском языке, так что извините за это.
Вот объект, о котором идет речь:
interieurcanon=cylinder(radius=1.5,pos=(63.1,23.5,0),axis=(1,0,0),color=(0,0,0))
Все мое вращательное движение в порядке, за исключением случаев, когда я пытаюсь опустить или поднять мой канон по другой оси, затем x.С этого момента это выглядит очень похоже на this
Вот код для возвышения:
if clavier == "up": #and interieurcanon.pos.y <= 54 and tir == 0: #elevation canon haut
canon.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
pivot.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
fboulet.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
interieurcanon.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
if clavier == "down": #and interieurcanon.pos.y >= 23.5 and tir == 0: #elevation canon bas
canon.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
pivot.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
fboulet.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
interieurcanon.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
По какой-то причине interieurcanon является единственным объектом, который не будет следоватьостальная часть объекта в этих двух if.
Вот ссылка на весь мой код: (эта первая часть - танк, о котором идет речь)
from visual import * # pour importer une image de la librairie visuelle
scene.background=(0,0,0) # couleur = (R,G,B) - pour red, green, blue
scene.height=1000
scene.width=1000
terrain=box(size=(1000,0,1000),color=(0,1,0),pos=(0,0,0),material=materials.rough)
#frame du tank
tank=frame()
# Serie de roues cote conducteur (1-6)
roue0=ring(frame=tank,thickness=0.9,radius=2,color=(0.5,0.5,0.5),pos=(33,8.7,17),axis=(0,0,1))
roue1=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(25,6,17),axis=(0,0,1))
roue2=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(15,6,17),axis=(0,0,1))
roue3=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(5,6,17),axis=(0,0,1))
roue4=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(-5,6,17),axis=(0,0,1))
roue5=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(-15,6,17),axis=(0,0,1))
roue6=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(-25,6,17),axis=(0,0,1))
roue7=ring(frame=tank,thickness=0.9,radius=2,color=(0.5,0.5,0.5),pos=(-33,8.7,17),axis=(0,0,1))
#rim de roues cote conducteur
rim0=cylinder(frame=tank,thickness=0.9,radius=1.5,color=(0.5,0.5,01),pos=(33,8.7,17),axis=(0,0,1))
rim1=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(25,6,16.5),axis=(0,0,1))
rim2=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(15,6,16.5),axis=(0,0,1))
rim3=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(5,6,16.5),axis=(0,0,1))
rim4=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(-5,6,16.5),axis=(0,0,1))
rim5=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(-15,6,16.5),axis=(0,0,1))
rim6=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(-25,6,16.5),axis=(0,0,1))
rim7=cylinder(frame=tank,thickness=0.9,radius=1.5,color=(0.5,0.5,1),pos=(-33,8.7,17),axis=(0,0,1))
# Serie de roues cote passager (a-f)
roueaa=ring(frame=tank,thickness=0.9,radius=2,color=(0.5,0.5,0.5),pos=(33,8.7,-17),axis=(0,0,1))
rouea=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(25,6,-17),axis=(0,0,1))
roueb=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(15,6,-17),axis=(0,0,1))
rouec=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(5,6,-17),axis=(0,0,1))
roued=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(-5,6,-17),axis=(0,0,1))
rouee=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(-15,6,-17),axis=(0,0,1))
rouef=ring(frame=tank,thickness=1,radius=5,color=(0.5,0.5,0.5),pos=(-25,6,-17),axis=(0,0,1))
roueff=ring(frame=tank,thickness=0.9,radius=2,color=(0.5,0.5,0.5),pos=(-33,8.7,-17),axis=(0,0,1))
#rim de roues cote passager
rimaa=cylinder(frame=tank,thickness=0.9,radius=1.5,color=(0.5,0.5,1),pos=(33,8.7,-17),axis=(0,0,1))
rima=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(25,6,-17.5),axis=(0,0,1))
rimb=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(15,6,-17.5),axis=(0,0,1))
rimc=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(5,6,-17.5),axis=(0,0,1))
rimd=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(-5,6,-17.5),axis=(0,0,1))
rime=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(-15,6,-17.5),axis=(0,0,1))
rimf=cylinder(frame=tank,radius=4, thickness=1,color=(0.5,0.5,1),pos=(-25,6,-17.5),axis=(0,0,1))
rimff=cylinder(frame=tank,thickness=0.9,radius=1.5,color=(0.5,0.5,1),pos=(-33,8.7,-17),axis=(0,0,1))
#chenille du tank
chenille1=shapes.trapezoid(width=60,height=12,top=80,pos=(0,6,0),thickness=0.05,roundness=0.1)
extrusion(pos=[(0,0,-17),(0,0,-21)],shape=chenille1,color=(1,1,0),frame=tank)
chenille2=shapes.trapezoid(width=60,height=12,top=80,pos=(0,6,0),thickness=0.05,roundness=0.1)
extrusion(pos=[(0,0,17),(0,0,21)],shape=chenille2,color=(1,1,0),frame=tank)
#base du tank
base1=box(frame=tank,size=(32,12,65),pos=(0,9,0),color=(1,1,1),axis=(0,0,1))
base2=shapes.trapezoid(width=65,height=5,top=50,pos=(0,18,0))
extrusion(pos=[(0,0,-16),(0,0,16)],shape=base2,color=(0.2,0.2,0.2),frame=tank)
#base du canon
bcanon=frame()
basecanon=shapes.trapezoid(width=30,height=6,top=20,pos=(0,23.5,0),roundness=0.1)
extrusion(pos=[(0,0,-16),(0,0,16)],shape=basecanon,color=(0.3,0.2,0.6),frame=bcanon)
#canon
fcanon=frame()
canon=cylinder(radius=2,pos=(14,23.5,0),color=(1,1,1),axis=(50,0,0),thickness=0.1,frame=bcanon)
interieurcanon=cylinder(radius=1.5,pos=(63.1,23.5,0),axis=(1,0,0),color=(0,0,0))
pivot=box(frame=bcanon,size=(5,5,6),pos=(12,23.5,0),color=(1,1,0),axis=(50,0,0),roundess=0.1)
#boulet
#fboulet=frame()
fboulet=sphere(radius=1.5,color=(1,0,1),pos=canon.pos,make_trail=true)
fboulet.v=vector(0,0,0)
fboulet.visible=0
Этот последний фрагмент кода - вседвижение связано с танком
a=vector(0,-9.8,0)
t=0
rechargement = 0
tir=0
dt=0.1
#Mouvement du tank
while 1:
rate (100)
tank.v=20*tank.axis
bcanon.v=20*tank.axis
fcanon.v=20*tank.axis
interieurcanon.v=20*tank.axis
if scene.kb.keys:
clavier=scene.kb.getkey()
if clavier == "y":
controles.visible=0
aide.visible=1
if clavier == "t" and controles.visible==0:
controles.visible=1
aide.visible=0
if clavier == "p":
print pivot.axis
print canon.axis
print bcanon.axis
print tank.axis
if clavier == "w" and tir == 0: #tank avance
tank.pos=tank.pos+tank.v*dt
bcanon.pos=bcanon.pos+bcanon.v*dt
fcanon.pos=fcanon.pos+fcanon.v*dt
fboulet.pos=fboulet.pos+tank.v*dt
interieurcanon.pos=interieurcanon.pos+interieurcanon.v*dt
if clavier == "s" and tir == 0: #tank recule
tank.pos=tank.pos-tank.v*dt
bcanon.pos=bcanon.pos-bcanon.v*dt
fcanon.pos=fcanon.pos-fcanon.v*dt
fboulet.pos=fboulet.pos-tank.v*dt
interieurcanon.pos=interieurcanon.pos-interieurcanon.v*dt
if clavier == "a" and tir == 0: #tank tourne a gauche
tank.rotate(angle=pi/64,axis=(0,1,0),origin=tank.pos)
bcanon.rotate(angle=pi/64,axis=(0,1,0),origin=bcanon.pos)
fcanon.rotate(angle=pi/64,axis=(0,1,0),origin=fcanon.pos)
fboulet.rotate(angle=pi/64,axis=(0,1,0),origin=bcanon.pos)
interieurcanon.rotate(angle=pi/64,axis=(0,1,0),origin=bcanon.pos)
if clavier == "d" and tir == 0: #tank tourne a droite
tank.rotate(angle=-pi/64,axis=(0,1,0),origin=tank.pos)
bcanon.rotate(angle=-pi/64,axis=(0,1,0),origin=bcanon.pos)
fcanon.rotate(angle=-pi/64,axis=(0,1,0),origin=fcanon.pos)
fboulet.rotate(angle=-pi/64,axis=(0,1,0),origin=bcanon.pos)
interieurcanon.rotate(angle=-pi/64,axis=(0,1,0),origin=bcanon.pos)
if clavier == "left" and tir == 0: #rotation base canon gauche
bcanon.rotate(angle=pi/64,axis=(0,1,0),origin=bcanon.pos)
fcanon.rotate(angle=pi/64,axis=(0,1,0),origin=fcanon.pos)
fboulet.rotate(angle=pi/64,axis=(0,1,0),origin=bcanon.pos)
interieurcanon.rotate(angle=pi/64,axis=(0,1,0),origin=bcanon.pos)
if clavier == "right" and tir == 0: #rotation base canon droite
bcanon.rotate(angle=-pi/64,axis=(0,1,0),origin=bcanon.pos)
fcanon.rotate(angle=-pi/64,axis=(0,1,0),origin=fcanon.pos)
fboulet.rotate(angle=-pi/64,axis=(0,1,0),origin=bcanon.pos)
interieurcanon.rotate(angle=-pi/64,axis=(0,1,0),origin=bcanon.pos)
if clavier == "up": #and interieurcanon.pos.y <= 54 and tir == 0: #elevation canon haut
canon.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
pivot.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
fboulet.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
interieurcanon.rotate(angle=pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
if clavier == "down": #and interieurcanon.pos.y >= 23.5 and tir == 0: #elevation canon bas
canon.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
pivot.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
fboulet.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
interieurcanon.rotate(angle=-pi/64,axis=(0,0,abs(bcanon.axis.x)),origin=pivot.pos)
if clavier == " " and tir==0: #tir du canon
fboulet=sphere(radius=1.5,color=(1,0,1),pos=interieurcanon.pos,make_trail=true)
fboulet.v=1*vector(canon.axis.x*tank.axis.x*abs(bcanon.axis.x),canon.axis.y,canon.axis.x*tank.axis.z*abs(bcanon.axis.z))
tir=1
if tir == 1:
print fboulet.v
fboulet.v=fboulet.v+a*dt
fboulet.pos=fboulet.pos+fboulet.v*dt+0.5*a*dt**2
print fboulet.pos
if fboulet.pos.y < 0:
fboulet.pos=canon.pos
tir=0
fboulet.visible=0
#position avec click souris (laisser a la fin)
if scene.mouse.clicked:
souris=scene.mouse.getclick()
scene.center=souris.pos
print souris.pos