未失真的纹理坐标

时间:2011-03-17 21:20:07

标签: 3d texture-mapping trilateration

如何计算飞机上点的UV坐标?

我有一个多边形 - 3个或4个或更多个点 - 位于一个平面上 - 也就是说,所有点都在一个平面上。但它可以在任何角度在太空中。

这个多边形的一边 - 两个点 - 将被映射到纹理中的两个相应的2D点 - 我事先知道这两个点。我也知道纹理的x和y比例,并且没有点落在纹理范围或其他“边缘情况”之外。

这是最上面的纹理四边形失真的图像:

enter image description here

我概述了一个黄色的坏四边形。想象一下,我知道那个四边形上那两个最底角的UV坐标,并且想要计算其他两个点的正确UV坐标......

如何计算相对于这两个点的平面中所有其他点的UV坐标?

想象一下,我的纹理是现实生活中的一张纸,我想要塑造你的(平面)车门。我在纸上放了两个点,我在车门上排成两个点。如何计算车门上其他位置在纸张下面的位置?

你能用trilateration吗?对于2D空间中的两个已知点,伪代码会是什么样的?


使用brainjam代码成功:

def set_texture(self,texture,a_ofs,a,b):
    self.texture = texture
    self.colour = (1,1,1)
    self.texture_coords = tx = []
    A, B = self.m[a_ofs:a_ofs+2]
    for P in self.m:
        if P == A:
            tx.append(a)
        elif P == B:
            tx.append(b)
        else:
            scale = P.distance(A)/B.distance(A)
            theta = (P-A).dot((B-A)/(P.distance(A)*B.distance(A)))
            theta = math.acos(theta)
            x, y = b[0]-a[0], b[1]-a[1]
            x, y = x*math.cos(theta) - y*math.sin(theta), \
                x*math.sin(theta) + y*math.cos(theta)
            x, y = a[0]+ x*scale, a[1]+ y*scale
            tx.append((x,y))

enter image description here

3 个答案:

答案 0 :(得分:2)

你必须用两个选择的向量和一个原点来表达其他点。

我会做这样的事情:

选择3个具有相应UV点的3D点:

  • A(X,Y,Z,U,V)
  • B(X,Y,Z,U,V)
  • C(X,Y,Z,U,V)

然后使用x,y,z坐标,我们想要将给定的3D点D表示为:

D = A + alpha(B - A)+ beta(C - A)+ gamma(B - A)X(C - A)

我们有x,y,z的3个方程,X是交叉乘积,而alpha,beta,gamma是未知的。 我们希望这能在uv和xyz之间创建一个线性关系。

计算W =(B - A)X(C - A),我们需要解决:

Dx - Ax = alpha。(Bx-Ax)+ beta。(Cx-Ax)+ gamma.Wx

Dy - Ay = alpha。(By-Ay)+ beta。(Cy-Ay)+ gamma.Wy

Dz - Az = alpha。(Bz-Az)+ beta。(Cz-Az)+ gamma.Wz

使用this method

计算矩阵M的逆矩阵
       | (Bx-Ax) , Cx-Ax , Wx | 
   M = | (By-Ay) , Cy-Ay , Wy | 
       | (Bz-Az) , Cz-Az , Wz | 

我们调用结果矩阵N,注意它不依赖于D.

然后通过以下方式计算D的alpha,beta,gamma:

(α,β,γ)= N.(D-A)

然后通过以下方式计算u,v为D:

Du = Au +α(Bu-Au)+β(Cu-Au)

Dv = Av +α(Bv-Av)+β(Cv-Av)

不使用gamma,因为它是D与(A,B,C)3D平面之间的距离。

答案 1 :(得分:1)

以逆时针顺序标记3D多边形的顶点,从已知其UV坐标的两个顶点开始。将这些标签称为 A B C D 。 UV空间中相应顶点的标签为 a b c d ,其中 a b 已知。

您说过的问题是,对于原始多边形中的 P 点,要确定相应的UV坐标 p 。 (我相信你只关心为 C D 计算UV坐标 c d ,但 P 的一般解决方案是相同的。)

首先,计算 P-A B-A 之间的角度θ。这可以使用标准化向量的dot product和acos。

轻松完成

α=( PA )⋅( BA )/(| PA || BA |)< / p>

θ= acos(α)

我们还计算了长度的比率:

σ= | P-A | / | B-A |

现在要在UV空间中计算 p ,我们只需将矢量 ba 旋转角度θ(保持 a 固定)并按σ缩放

R matrix for a rotation by angle θ

| + cos(θ)-sin(θ)|
| + sin(θ)+ cos(θ)|

然后 p = a R b-a )。

你已经完成了。

答案 2 :(得分:0)

U和V是介于0和1之间的数字。

因此,在您的情况下,较大边的大小为10,较小的边为5,每个“间隙”为2.5。然后将其标准化为您提供所需的数字。

所以一些示例伪代码:

bottomLeftVector(0,0,0)
bottomLeftTexture(0,0)
topLeftVector(2.5, 5, 0)
topLeftTexture(0.25, 0)
topRightVector(7.5, 5, 0)
topRightTexture(0, 0.75)
bottomRightVector(10, 0, 0)
bottomRightTexture(1,1)

希望这有帮助!

相关问题