我有一个对象(比如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格式的结果。
答案 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!