我不知道如何使用 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!