首页 > 解决方案 > 我的一个对象没有像我所有其他对象一样旋转

问题描述

所以对于一个学校项目,我需要建造一个可以发射炮弹的坦克。我有一个物体(圆柱体)位于佳能的顶端(使其看起来像佳能的内部)。该物体也是我射击炮弹的起点。我的很多对象名称可能都是法语,对此感到抱歉。

这是有问题的对象:

interieurcanon=cylinder(radius=1.5,pos=(63.1,23.5,0),axis=(1,0,0),color=(0,0,0))

我所有的旋转运动都很好,除非我尝试在另一个轴上降低或提升我的佳能然后 x。从那时起,它看起来很像这样

这是海拔的代码:

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

标签: pythonpython-2.7vpython

解决方案


推荐阅读