从投影为 2D 平面的 3D 平面获取统一坐标

问题描述 投票:0回答:1

3d 平面投影到 2d 多边形

我有定义矩形的顶点 P1、P2、P3 和 P4 的坐标。

这些坐标始终定义一个规则的矩形区域,并且在上图中,由这些坐标定义的平面的变形仅是由于透视造成的。

我在世界空间中有这些坐标(P1、P2、P3 和 P4)。 我还有世界空间中点 C 的坐标,该点不在 P1、P2、P3 和 P4 定义的平面中,而是位于相机位置和 P1、P2、P3 和 P4 定义的平面之间的某个位置。

我已经有一种方法可以通过将所有坐标从世界坐标转换到屏幕空间并检查屏幕空间点 C 来计算从相机看来 C 是否在 P1、P2、P3 和 P4 定义的边界内位于屏幕空间三角形 P1 - P2 - P3 或三角形 P1 - P3 - P4 内。 因此,如果 P1、P2、P3 和 P4 始终定义一个规则矩形,并且如果 C 位于从相机看到的 P1、P2、P3 和 P4 定义的区域内,那么我如何从 0,0 计算统一坐标(例如在 P2 处)到 C 点的 1,1(例如在 P4 处),如果它投影到由 P1、P2、P3 和 P4 定义的平面上? 我的意思是,在示例图像中,我期望获得与 C 点位置相对应的统一坐标的结果约为 0.8、0.45。

如果C点屏幕投影对应于P2点的屏幕位置,我应该得到0,0 如果 C 点屏幕投影对应于 P1 点的屏幕位置,我应该得到 1,0 如果C点屏幕投影对应于P3点的屏幕位置,我应该得到0,1 如果C点屏幕投影对应于P4点的屏幕位置,我应该得到1,1

基本上,我需要计算单个规则平面内从 0,0 到 1,1 的统一坐标(由于透视,视图中可能会扭曲),即相机和该平面之间的点的投影,到那架飞机上。但是我只有顶点坐标和点坐标(在 3d 世界空间和 2d 屏幕空间中)。 我希望我已经足够清楚地解释了这一切。 有人可以帮忙吗?非常感谢。

哦,我正在使用 python,但我不介意解决方案是否采用任何其他语言甚至伪代码。

3d 2d coordinates plane
1个回答
0
投票

我通过计算形成四边形形状的两个三角形的重心坐标来解决这个问题。 因此,我可以检查该点是否在矩形内部,并从计算的重心坐标的 u、v 和 w 分量导出 uv 坐标。

def get_uvs(pw1,pw2,pw3,pw4):
    # quadrilateral is defined by pw1,pw2,pw3 and pw4 2d vectors, in screen-space

    vv = 1.0/(2*area(pw1,pw2,pw3)) * (pw1.y*pw3.x - pw1.x*pw3.y + (pw3.y-pw1.y) * p_uv.x + (pw1.x-pw3.x)*p_uv.y)
    ww = 1.0/(2*area(pw1,pw2,pw3)) * (pw1.x*pw2.y - pw1.y*pw2.x + (pw1.y-pw2.y) * p_uv.x + (pw2.x-pw1.x)*p_uv.y)
    uu = 1.0 - vv - ww  
    if uu>0 and vv>0 and ww>0: return uu,ww

    vv = 1.0/(2*area(pw3,pw4,pw1)) * (pw3.y*pw1.x - pw3.x*pw1.y + (pw1.y-pw3.y) * p_uv.x + (pw3.x-pw1.x)*p_uv.y)
    ww = 1.0/(2*area(pw3,pw4,pw1)) * (pw3.x*pw4.y - pw3.y*pw4.x + (pw3.y-pw4.y) * p_uv.x + (pw4.x-pw3.x)*p_uv.y)
    uu = 1.0 - vv - ww
    if uu>0 and vv>0 and ww>0: return = 1.0-uu,1.0-ww

    return -1,-1 # return negative results if not inside quadrilateral
    
#---------------------------------------------------------

def area(p0, p1, p2):
    return 0.5*(-p1.y*p2.x + p0.y*(-p1.x+p2.x) + p0.x*(p1.y-p2.y)+ p1.x*p2.y)
© www.soinside.com 2019 - 2024. All rights reserved.