Panda3D:如何旋转对象使其X轴指向空间中的某个位置?

时间:2013-02-28 02:36:03

标签: rotation quaternions euler-angles panda3d

我有一个对象(比如fromObj)存储在NodePath的3D点位置(比如fromPoint)。其航向俯仰滚动(HPR)为(0,0,0)。我想旋转它,使其X轴指向空间中的另一个点toPoint。我只想计算实现此轮换的HPR并将其用于其他目的。

我尝试了fromObj.lookAt(toPoint),但这将其Y轴指向toPoint。我希望它的X轴指向toPoint

如何计算旋转 旋转对象,使其 X轴指向给定的位置< / strong>在太空?

注意:我在StackOverflow上发现了这个问题: Calculate rotations to look at a 3D point? 但是,我正在寻找一种使用现有Panda3D API的解决方案,我希望得到Panda3D HPR格式的结果。

2 个答案:

答案 0 :(得分:2)

感谢 Panda3D 论坛上有帮助的人,我收到了easier solution

def getHprFromTo( fromNP, toNP ):
    # Rotate Y-axis of *from* to point to *to*
    fromNP.lookAt( toNP ) 

    # Rotate *from* so X-axis points at *to*
    fromNP.setHpr( fromNP, Vec3( 90, 0, 0 ) )

    # Extract HPR of *from* 
    return fromNP.getHpr()

如果您只有点位置,请为这两个点创建虚拟nodePath以进行此计算。

答案 1 :(得分:1)

我不知道如何使用Panda3D API做到这一点。但它可以通过原始计算完成如下:

def getHprFromTo( fromPt, toPt ):
    """
    HPR to rotate *from* point to look at *to* point
    """

    # Translate points so that fromPt is origin
    pos2 = toPt - fromPt

    # Find which XY-plane quadrant toPt lies in
    #    +Y
    #    ^
    #  2 | 1
    # ---o---> +X
    #  3 | 4

    quad = 0

    if pos2.x < 0:
        if pos2.y < 0:
            quad = 3
        else:
            quad = 2
    else:
        if pos2.y < 0:
            quad = 4

    # Get heading angle

    ax   = abs( pos2.x )
    ay   = abs( pos2.y )
    head = math.degrees( math.atan2( ay, ax ) )

    # Adjust heading angle based on quadrant

    if 2 == quad:
        head = 180 - head
    elif 3 == quad:
        head = 180 + head
    elif 4 == quad:
        head = 360 - head

    # Compute roll angle 

    v    = Vec3( pos2.x, pos2.y, 0 )
    vd   = abs( v.length() )
    az   = abs( pos2.z )
    roll = math.degrees( math.atan2( az, vd ) )

    # Adjust if toPt lies below XY-plane

    if pos2.z < 0:
        roll = - roll

    # Make HPR
    return Vec3( head, 0, -roll )

基本思想是将你的头部固定在太空中的点上。你的头部(或眼睛)面向+ ve X轴,+ ve Y轴从左耳出来,你的向上矢量是+ ve Z轴。你身边的某个地方就是toPoint。

要看它,首先在全局XY平面上旋转头部(如恐怖电影),直到toPoint高于或低于你。这是航向角。

现在你抬起头或向下抬头,最终让你看到了toPoint。这是滚动角度。请注意,这是滚动而不是音高,尽管看起来像。这是因为它在你头部的坐标系中滚动。这给你HPR!