Menu Glowscript中的菜单

Menu Glowscript中的菜单,menu,slider,astronomy,vpython,glowscript,Menu,Slider,Astronomy,Vpython,Glowscript,关于这个问题,我已经问过类似的问题,但我的同事和我仍然无法解决。有关此问题的更多信息,请参阅 我们定义了不同的物体(太阳和太阳系的行星)以及它们之间的作用力。现在,我们想定义一个菜单,让我们可以选择一个对象:然后它将被定义为currentobject,模拟用户将能够使用滑块改变其质量。我们对第一个问题的答案是,在使用函数“def M(M)”之前必须定义currentobject,因此我们将sun定义为currentobject。 以下是我们关于这部分模拟的代码片段: sun = sphere(

关于这个问题,我已经问过类似的问题,但我的同事和我仍然无法解决。有关此问题的更多信息,请参阅

我们定义了不同的物体(太阳和太阳系的行星)以及它们之间的作用力。现在,我们想定义一个菜单,让我们可以选择一个对象:然后它将被定义为currentobject,模拟用户将能够使用滑块改变其质量。我们对第一个问题的答案是,在使用函数“def M(M)”之前必须定义currentobject,因此我们将sun定义为currentobject。 以下是我们关于这部分模拟的代码片段:

sun = sphere( pos=vector(0,0,0), radius=6.96E+09, texture="https://i.imgur.com/DTm6i8r.jpg",  

               mass = 1.989e30, momentum=vector(0,0,0), make_trail=True, visible=True )   #example of a defined object

currentobject=sun


def M(m):
    global col, sun, mercury, venus, earth, mars, jupiter, saturn, uranus, neptune, currentobject 
    currentobject.visible = True 
    obj = m.selected 
    if obj == "Sonne": 
        currentobject = sun 
    elif obj == "Merkur":
        currentobject = mercury
    elif obj == "Venus": 
        currentobject = venus
    elif obj == "Erde": 
        currentobject = earth
    elif obj == "Mars": 
        currentobject = mars
    elif obj == "Jupiter": 
        currentobject = jupiter
    elif obj == "Saturn": 
        currentobject = saturn
    elif obj == "Uranus": 
        currentobject = uranus
    elif obj == "Neptun": 
        currentobject = neptune
    currentobject.visible=True

menu(choices=['Sonne', 'Merkur', 'Venus', 'Erde', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptun'], bind=M) 
scene.append_to_caption('\n\n')


scene.append_to_caption("Change mass of chosen object: \n\n") 
def setmass(b): 
    wt.text = '{:1.1f}'.format(b.value)
sl = slider(min=1, max=10, value=1, length=1000, bind=setmass)  
wt = wtext(text='{:1.1f}'.format(sl.value))
scene.append_to_caption('\n\n') 


while (True):  

    rate(100) 

    if running:

        if currentobject = sun:
            sun.mass = (1.989e30)*sl.value
        elif currentobject = mercury:
            mercury.mass = (3.285e23)*sl.value
        elif currentobject = venus:
            venus.mass = (4.869e24)*sl.value
        elif currentobject = earth:
            earth.mass = (5.974e24)*sl.value
        elif currentobject = mars:
            mars.mass = (6.4185e23)*sl.value
        elif currentobject = jupiter:
            jupiter.mass = (1.8987e27)*sl.value
        elif currentobject = saturn:
            saturn.mass = (5.683e26)*sl.value
        elif currentobject = uranus:
            uranus.mass = (8.683e25)*sl.value
        elif currentobject = neptune:
            neptune.mass = (1.0241e26)*sl.value

程序运行时,不会显示任何错误消息。但是,我们发现,虽然currentobject在函数M中发生了更改,但之后它并没有发生更改。(当您在“def M(M)”中插入“print(currentobject.mass)”时,所选对象的质量将显示在模拟中,但当您在函数之后插入它时,将显示太阳质量)。这意味着计算始终使用太阳作为其当前对象,而不是使用菜单选择的对象。

您创建的唯一三维对象是“太阳”“。在M()中,当你说currentobject=mercury时,你将currentobject设置为“未定义”,因为没有名为“mercury”的3D对象。

在我们的实际代码中,其他行星的定义形式与太阳的定义形式相同。我们只是没有把它们放在问题的代码部分,因为我们把太阳作为定义对象的“例子”。对所有行星来说,这几乎是同样的事情。所以行星都是在我们的实际代码中创建和定义的,我们需要的是一个最小的可运行程序来演示错误。非常感谢您的努力,但是我们最近设法自己解决了这个问题!