vpython“相对”旋转一帧

问题描述:

我想弄清楚如何旋转一个框架对象相对于它的当前位置。vpython“相对”旋转一帧

例如一个物体指向北方,我说绕y轴旋转180度。之后我说:倾斜90度,它从“世界”的角度来看。所以它指向下来,而不是起来。 (对不起,这个令人困惑的故事,如果你尝试下面的代码,并使用你的上下左右键,你明白我的意思)。

任何帮助将不胜感激。

import time 
    import numpy 
    from visual import * 

    # initialize variables 
    pitch_degrees = 0 
    roll_degrees = 0 
    yaw_degrees = 0 

    xangle = 0.0 
    yangle = 0.0 
    zangle = 0.0 

    # create the airplane frame. this will be our working object. 
    airplane = frame(make_trail=True) 
    # below are the elements that create the airplane 
    body = cone(frame=airplane, pos=(50,0,0), axis=(-150,0,0), radius=10) 
    body2 = cone(frame=airplane, pos=(50,0,0), axis=(50,0,0), radius=10) 
    wing = box(frame=airplane, pos=(35,0,0), size=(30,3,180)) 
    tail = box(frame=airplane, pos=(-75,0,0), size=(20,3,50)) 
    aileron = box(frame=airplane, pos=(-75,12,0), size=(20,24,3)) 
    cabin = ellipsoid(frame=airplane, pos=(30,5,0), axis=(1,0,0),size=(45,24,12)) 
    #painting 
    for obj in airplane.objects: 
     obj.color = color.red 

    body.color = color.white 
    cabin.color = (0.5, 0.5, 0.5) 
    cabin.opacity = 0.8 

    # I'm experiencing some jitter in my screen when starting up (yay ati....) 
    time.sleep(2) 

    # loop forever 
    while True: 
      # are there any keys pressed? if so, act on them. 
      if scene.kb.keys: # event waiting to be processed? 
        s = scene.kb.getkey() # get keyboard info 
        if (s == 'up'): 
          pitch_degrees = pitch_degrees - 1 
        if (s == 'down'): 
          pitch_degrees = pitch_degrees + 1 
        if (s == 'left'): 
          roll_degrees = roll_degrees - 1 
        if (s == 'right'): 
          roll_degrees = roll_degrees + 1 

      # convert degrees to radians 
      zangle = numpy.radians(pitch_degrees) 
      xangle = numpy.radians(roll_degrees) 

      # execute the actual rotation. 
      # but this should be relative to its current rotation :(
      airplane.rotate(angle=zangle,axis=(0,0,1)) 
      airplane.rotate(angle=xangle,axis=(1,0,0)) 

      # some delay because i'm a dirty boy 
      time.sleep(0.005) 

创建一个自定义类,它是飞机而不是框架。通过这种方式,您可以为飞机课程提供一种方法,以相对于飞机的位置和方向旋转课程中的每个项目(机翼,尾部等)。所以这个类将包含一个向量,它的位置以及它的方向向量。然后使用旋转数学关于飞机的方向矢量分别旋转每个项目。

对不起,我会在评论中发布这个,但我没有足够的声望:)