0

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

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

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

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

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

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

[ab 0] [cd 0] [tx ty 1]

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

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

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

谢谢!

4

1 回答 1

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
于 2009-11-19T18:40:37.153 回答