我的问题是:
假设我处于(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])
第一步:
将点从世界空间转换为摄影机空间,方法是将其乘以摄影机矩阵。你应该仔细阅读关于构建这个的信息-有无数的网络资源。在(俯仰、偏航、横摇)坐标中,旋转必须按横滚->俯仰->偏航的顺序发生,对应于:
通过角度
roll
->;矩阵R通过角度
pitch
->;矩阵p通过角度
yaw
->;矩阵Y因此,摄像机矩阵的旋转部分由(YPR)T,按相乘的顺序给出。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值低于某个限制(称为近剪裁平面-将其设置为某个正值),则丢弃该点。这样可以确保不显示摄影机后面的点。在第二步:
下图说明了透视投影背后的过程:
与Y类似:
相关问题 更多 >
编程相关推荐