【问题标题】:Matrix to Represent a Triangle in Screen Space在屏幕空间中表示三角形的矩阵
【发布时间】:2009-11-19 17:33:48
【问题描述】:

所以我在 3D 空间中有一组四个点。

P1 [0, 0, 0]
P2 [128, 0, 0]
P3 [0, 128, 0]
P4 [128, 128, 0]

然后我将其正交投影到屏幕上,有效地在屏幕空间中为我提供了两个线框三角形。

我现在想将纹理映射到这个由两个三角形组成的“平面”。所以我使用我的方形纹理,并使用 u,v 坐标我可以将纹理映射到这两个三角形中。

当我尝试将 z 组件添加到顶点时,问题就出现了。屏幕空间中生成的三角形现在有些失真,但纹理映射完全关闭。

在我看来,因为它只是三个点,它们仍然形成某种仿射矩形,我们可以将该矩形表示为以下形式的矩阵:

[a b 0] [c d 0] [tx ty 1]

谁能给我一些提示,关于如何将屏幕空间中的三个 2D 点转换为上述形式的矩阵?

我查阅的所有教程等都解释了纹理映射的松散理论,然后让 OpenGL/DirectX 原生函数进行实际映射。

我正在寻找更多的直接方法,在给定三个点的情况下,我可以使用仿射矩阵将纹理映射到该三角形。 (不做扫描线渲染方式)

谢谢!

【问题讨论】:

    标签: mapping matrix textures plane


    【解决方案1】:

    我不确定我理解您到底在寻找什么,但这里有一种从 (u,v) 坐标转换为屏幕坐标的方法。

    假设您将 P1、P2、P3 投影到屏幕坐标,并得到屏幕坐标为 (x1,y1)、(x2,y2) 和 (x3,y3) 的 3 个点。

    现在我们需要对表单进行转换

    [a, b, c] [d, e, f] [0, 0, 1]*[u, v, 1] = [x, y, 1]

    并且我们希望它把(0,0)转换成(x1,y1)(1,0)(x2,y2)(0,1)(x3,y3)。 (这是因为您希望它将纹理三角形映射到投影三角形)。

    所以我们写出所有的方程式:

    0 a + 0 b + 1 c = x1
    0 d + 0 e + 1 f = y1
    1 a + 0 b + 1 c = x2
    1 d + 0 e + 1 c = y2
    0 a + 1 b + 1 c = x3
    0 d + 1 e + 1 f = y3
    

    我们解决它们,得到:

    a = x2-x1
    b = x3-x1
    c = x1
    d = y2-y1
    e = y3-y1
    f = y1
    

    【讨论】:

    • 酷,谢谢。所以看起来我必须再做两件事才能让它发挥作用。第一个是翻转你给我的矩阵(这很简单)。 [a d 0] [b e 0] [c f 1] 第二个是在未变换空间中通过多边形的原始delta X对a和c进行归一化,并通过原始delta Y对b和d进行归一化。
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多