所以我在3D Space中有一组四个点。
P1 [0,0,0]
P2 [128,0,0]
P3 [0,128,0]
P4 [128,128,0]
然后我正确地在屏幕上投影,有效地在屏幕空间中给我两个线框三角形。
我现在想要将纹理映射到由这两个三角形组成的“平面”。所以我采用我的方形纹理,并使用u,v坐标,我可以将纹理映射到这两个三角形。
当我尝试将z组件添加到verticies时出现问题。屏幕空间中生成的三角形现在有些扭曲,但纹理贴图完全关闭。
在我看来,虽然它只是三个点,但它们仍然形成某种类型的仿射矩形,我们可以将矩形表示为形式的矩阵:
[a b 0] [c d 0] [tx ty 1]
有人可以给我一些提示,关于如何将屏幕空间中的三个2D点转换为上述形式的矩阵的想法吗?
我查找的所有教程等解释了一个松散的纹理映射理论,然后让OpenGl / DirectX本机函数进行实际的映射。
我正在寻找更多的直接方法,给定三个点,我可以使用仿射矩阵将纹理映射到该三角形。 (不做扫描线渲染方法)
谢谢!
答案 0 :(得分:1)
我不确定我到底在想什么,但是这里有一种从(u,v)坐标转换到屏幕坐标的方法。
让我们假设您将P1,P2,P3投影到屏幕坐标,并获得3个点,屏幕坐标(x1,y1),(x2,y2)和(x3,y3)。
现在我们需要从表单转换
[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