2012-08-10 125 views
57

爲了理解攪拌機的python遊戲腳本,我目前嘗試使用從this link的FPSController結構來構建一個場景,其中人們可以在球體周圍走動。重力和FPSController取向我試圖構建蟒控制器,目前看起來像這樣:攪拌機:繞着球體行走

def main(): 
    print("Started") 

    controller = bge.logic.getCurrentController() 
    me = controller.owner 

    distance, loc, glob = me.getVectTo((0,0,0)) 

    grav = controller.actuators['Gravity'] 

    strength = me['Gravity'] 
    force = strength*(distance*distance)*glob 

    grav.force = force 

    try: 
     rot = Vector((0,0,-1)).rotation_difference(glob).to_matrix() 
    except Exception as E: 
     print(E) 
     rot = (0,0,0) 

    rotZ = me.orientation 
    me.orientation = rot*rotZ 

    controller.activate(grav) 

main() 

這大致工作到任何角度變爲超過180度,並且看起來不連續的即可。我認爲這是來自rotation_difference是不連續的 - blender documentation on Math Types & Utilities沒有說什麼,我還沒有足夠的關於四元數表示還沒有看到,如果連續的地圖是可能的 - 我想有一個更優雅的方式來實現本地Z方向持續依賴於鼠標,而局部X和Y方向依賴於某個給定的矢量,但是如何?

+15

3D空間中的旋轉可能非常困難。在我看來,把時間放在理解四元數是最簡單的,然後使用它們。 – fluffels 2012-10-19 13:03:55

+0

如果使用歐拉角(而不是四元數),您可能會遇到的問題之一是萬向節鎖(http://en.wikipedia.org/wiki/Gimbal_lock),這可能會導致相當多的問題 – decden 2013-04-06 19:53:11

+0

是否容易嘗試此操作當你安裝了Blender時出來? (不是Blender專家) – Gerard 2013-06-10 19:50:18

回答

0

有一個allign功能。如果遊戲對象被稱爲自己,它應該類似own.alignAxisToVect(vector, 2, 1),其中2是Z軸的索引(x = 0,y = 1,z = 2),1是對齊速度(在0和1之間)