纹理坐标映射如何在正方形中的三角形映射的4个三角形的坐标到4个三角形(Texture coordin

2019-10-19 22:01发布

考虑下面的图片

1.所以有4个三角形的右手图,而不是3,这使得更多的意义上,我已经更新了基于反馈Steven_W形象!

2.再次更新图像标记子三角形为A,B,C,d为灰色

什么是映射坐标(x,y)的左手方,使得坐标(U,V)的矩形的边界右侧的三角形,使得点的映射点之间的内插中产生的伪算法如图所示在图上?

1至4是从左至右,即使我的例证是周围的边缘有点粗糙三角形等距:)

这是为了生成用于从所述上半部的360度全景照片一个天空盒的盖子粗略的面板。

更新3根据反馈

第一步似乎是工作出我们在用于基于所述(X,Y)的左手图,它三角坐标。

第二陡峭的是沿着三角形的顶点锻炼身体的距离。 然后使用这些距离来获得相关的三角坐标图中右侧

更新4 -代码,以便识别在左手图三角形

Public Function TriangleIndex(ByVal x As Integer, ByVal y As Integer, ByVal w as integer, ByVal h as integer) as integer                              
    Dim AboveForwardSlashDiagonal As Boolean = ((((h * x) + (w * y)) - (h * w)) < 0)
    Dim AboveBackSlashDiagonal As Boolean = (((h * x) - (w * y)) > 0)
    If AboveForwardSlashDiagonal Then
         If AboveBackSlashDiagonal
            return 2 ' C
         else
            return 3 ' D
         end if
    else
         If AboveBackSlashDiagonal
            return 1 ' B
         else
            return 0 ' A
         end if
    End If
End Function

更新5 -模板代码解决方案

左图w2和h2的w1和H1是尺寸为右图的尺寸

Private Function TranslateToTriangle(ByVal x1 As Integer, ByVal y1 As Integer, ByVal w1 As Integer, ByVal h1 As Integer, ByVal w2 As Integer, ByVal h2 As Integer) As System.Drawing.Point

    Dim ReturnPoint As New System.Drawing.Point


        select case TriangleIndex(x1,y1,w1,h1)
            case 0

            case 1

            case 2

            case 3

        end select

    Return ReturnPoint

End Function

更新6公式三角形的面积给它的长度-这可能是在计算重心的权重有帮助吗?

Private Function AreaOfTriangle(ByVal LengthA As Single, ByVal LengthB As Single, ByVal LengthC As Single) As Single
    Dim Perimeter As Single = LengthA + LengthB + LengthC
    Return 1 / 4 * Math.Sqrt(Perimeter * (Perimeter - 2 * LengthA) * (Perimeter - 2 * LengthB) * (Perimeter - 2 * LengthC))
End Function

Answer 1:

让我们首先考虑的三角形的情况下a

假设您的原点在点5,点1和2的坐标(-x0, y0)(x0, y0)我们应该有以下几点。

从旧的坐标的映射(x, y)到新的(xnew, ynew)必须是线性的。 这意味着,我们得到了与仍然不确定系数以下公式:

xnew = A*x + B*y + C
ynew = D*x + E*y + F

我们怎样才能确定系数? 我们有三对值: (-x0, y0) -> (-x0, y0) (x0, y0) -> (-x0/2, y0)(0, 0) -> (0, -y0) 这给了我们如下:

-x0 = -A*x0 + B*y0 + C   (1)        -x0/2 = A*x0 + B*y0 + C   (3)
 y0 = -D*x0 + E*y0 + F   (2)         y0   = D*x0 + E*y0 + F   (4)

  0 =  A*0  + B*0  + C   (5)
-y0 =  D*0  + E*0  + F   (6)

目前很好。 (5)使我们C = 0 ,(6)给出F = -y0 。 添加(2)和(4),我们得到2*y0 = 2*E*y0 + 2*(-y0)因此E = 2 。 减去(2)和(4),我们得到0 = 2*D*x0 ,因此D = 0 。 加入(1)和(2),并考虑到该C = 0 ,我们得到-(3/4)*x0 = 2*B*y0 ,因此B = -3/4*x0/y0 。 最后,减去(1)和(2),我们得到x0/2 = 2*A*x0 ,从而A = 1/4

现在,我们可以写下所需的映射:

xnew = 0.25*x - 0.75*(x0/y0)*y
ynew = 2*y - y0

用同样的方法,对三角c我们得到:

xnew = -0.25*x - 0.25*(x0/y0)*y
ynew = -2*y - y0


Answer 2:

好了,@ Steven_W的回答您的评论使回答你的问题更清晰。 你真的想在你的其他方箱(125,235,435,415)在4个三角形(125,235,435,415)在你方箱点映射到相应的4个三角形。 哦,你不必三角形415在第二个框,也许你应该或许不是。

所以,现在你必须从三角点映射到三角这应该很容易。 作为你的“启动”三角形的每个点的坐标位置使用其相对于所有3个顶点,然后使用相对于“目标”三角形的三个顶点相同的位置。 你也许可以逃脱只用三角形顶点的2坐标。

HTH

在维基百科条目三坐标介绍了数学不够好,我想。



Answer 3:

为什么某些点映射到其上的三角形对应这是不是真的清楚。

例如,在应的点映射到为“1”和“4”之间等距离?

或者,只是点“上方” 5号?



文章来源: Texture coordinate mapping how to map coordinates of 4 triangles in a square to 4 triangles in a triangle