根据摄像头的三维方向移动

2024-09-27 02:15:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是:

假设我处于(x,y,z)位置,我有几个点(xn,yn,zn),根据我的观察方向,假设我有垂直、水平和滚动的角度值,我希望我的HUD识别出这些点,如果它们在我的视角内,如果有任何角度变化,就移动。基本上是把它转到屏幕上的(x,y)坐标。在

就像下面游戏中的任务点跟踪行为:https://www.youtube.com/watch?v=I_LlEC-xB50

我该怎么做?在

编辑: 我用以下方法得到坐标:

def convert_to_xyz(point):
  # Lat / Lon / Alt -> point[0] / point[1] / point[2]
  # Note: point[2] = earth circumference + altitude

  point[2] += _earth_radius
  x = math.cos(point[0]) * math.cos(point[1]) * point[2]
  y = math.cos(point[0]) * math.sin(point[1]) * point[2]
  z = math.sin(point[0]) * point[2]  # z is 'up'

  return numpy.array([x, y, z])

获取摄像机矩阵:

^{pr2}$

转换到摄影机空间:

def transform_to_camera_space(point, camera_matrix):
  return np.dot(point, camera_matrix)

然后我使用@spug的答案得到如下值:

array([ 133.99847154,  399.15007301])

Tags: toreturndefmathsincosarraymatrix
1条回答
网友
1楼 · 发布于 2024-09-27 02:15:52

第一步:

将点从世界空间转换为摄影机空间,方法是将其乘以摄影机矩阵。你应该仔细阅读关于构建这个的信息-有无数的网络资源。在(俯仰、偏航、横摇)坐标中,旋转必须按横滚->俯仰->偏航的顺序发生,对应于:

  1. 通过角度roll->;矩阵R

  2. 通过角度pitch->;矩阵p

  3. 通过角度yaw->;矩阵Y

因此,摄像机矩阵的旋转部分由(YPRT按相乘的顺序给出。XYZ旋转矩阵在本页给出:https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations。在

相机空间中的点由q = transpose(YPR) * (p - c)给出,其中p = (xn, yn, zn)是世界空间中的点,c = (x, y, z)是相机的位置。另一种方法是构造一个4x4矩阵,并用-(YPR)*c填充第4列,同样可以在互联网上找到。在

此时,如果点q的X值低于某个限制(称为近剪裁平面-将其设置为某个正值),则丢弃该点。这样可以确保不显示摄影机后面的点。在


第二步:

下图说明了透视投影背后的过程:

enter image description here

  • θ是视野的一半
  • p是点的深度值=相机帧中的X坐标)
  • s是相机帧中的Y坐标
  • X是屏幕坐标

enter image description here

与Y类似:

enter image description here

  • t是摄影机帧中的Z坐标
  • A是您的纵横比(高/宽)

相关问题 更多 >

    热门问题