57

为了理解 blender python 游戏脚本,我目前尝试使用此链接中的 FPSController 结构构建一个可以绕球体行走的场景。对于重力和 FPSController 方向,我尝试构建一个 python 控制器,目前看起来像这样:

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 是不连续的——关于数学类型和实用程序的搅拌机文档没有说明任何内容,而且我对四元数表示还没有充分考虑到是否可以使用连续映射——我想有一种更优雅的方式实现局部 Z 方向持续依赖于鼠标,而局部 X 和 Y 方向持续依赖于某个给定向量,但是如何实现呢?

4

2 回答 2

4

共识似乎是你应该使用四元数来完成这样的旋转。

有关 api,请参见:http: //www.blender.org/documentation/249PythonDoc/Mathutils.Quaternion-class.html

有关数学的介绍,请参阅此:http ://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions#Quaternions

于 2013-09-10T19:32:10.967 回答
0

有一个对齐功能。如果游戏对象被称为自己的,它应该类似于own.alignAxisToVect(vector, 2, 1)2 是 Z 轴的索引(x=0,y=1,z=2),1 是对齐速度(在 0 和 1 之间)

于 2016-09-03T22:28:44.157 回答