0

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

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

如何计算将旋转对象以使其X 轴指向空间中给定位置的HPR

注意:我知道 StackOverflow 上的这个问题: Calculate rotations to look at a 3D point? 但是,我正在寻找一种使用现有 Panda3D API 的解决方案,并且我想要 Panda3D HPR 格式的结果。

4

2 回答 2

2

感谢Panda3D论坛上的乐于助人,我得到了一个更简单的解决方案

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()

如果您只有点位置,请为两个点创建虚拟节点路径以执行此计算。

于 2013-03-04T03:34:00.873 回答
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 )

基本思想是想象你的头部在空间中的 fromPoint 处静止。你的头(或眼睛)朝向 +ve X 轴,+ve Y 轴从你的左耳出来,你的向上向量是 +ve Z 轴。在你周围空间的某个地方是 toPoint。

要查看它,您首先在全局 XY 平面中旋转您的头部(就像在恐怖电影中一样),直到 toPoint 在您的上方或下方。这是航向角。

现在,您抬起头或向下抬起头,最终使 toPoint 出现在您的视线中。这是滚动角。请注意,这是滚动而不是俯仰,尽管看起来是这样。这是因为它在你头部的坐标系中滚动。这给了你 HPR!

于 2013-02-28T08:07:31.360 回答