3

如何计算平面上点的 UV 坐标?

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

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

这是最上面的纹理四边形扭曲的图像:

在此处输入图像描述

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

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

想象一下我的纹理是现实生活中的一张纸,我想给你的(平的)车门贴上纹理。我在我的纸上放了两个点,我把它和你车门上的两个点对齐。如何计算车门上的其他位置在纸下的位置?

你可以使用三边测量吗?对于二维空间中的两个已知点,伪代码会是什么样子?


使用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))

在此处输入图像描述

4

3 回答 3

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

用这种方法计算矩阵 M 的逆矩阵:

       | (Bx-Ax) , Cx-Ax , Wx | 
   M = | (By-Ay) , Cy-Ay , Wy | 
       | (Bz-Az) , Cz-Az , Wz | 

我们称结果矩阵为 N,注意它不依赖于 D。

然后通过 计算 D 的 alpha,beta,gamma:

(阿尔法,贝塔,伽马)= N.(DA)

然后计算 D 的 u,v:

Du = Au + alpha( Bu - Au ) + beta( Cu - Au )

Dv = Av + alpha( Bv - Av ) + beta( Cv - Av )

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

于 2011-03-17T22:33:52.643 回答
1

以逆时针顺序标记 3D 多边形的顶点,从已知 UV 坐标的两个顶点开始。将这些标签称为ABCD。UV 空间中相应顶点的标签是abcd,其中ab是已知的。

您所说的问题是,对于原始多边形中的点P,确定相应的 UV 坐标p。(我相信您只关心计算点CD的 UV 坐标cd ,但P的一般解决方案是相同的。)

首先,计算PABA之间的角度 θ 。使用归一化向量的点积和 acos很容易做到这一点。

α = ( PA )⋅( BA )/(| PA || BA |)

θ = acos(α)

我们还计算长度的比率:

σ = | 功放|/| 文学士|

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

R旋转角度 θ 的矩阵,为

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

那么p = a + σ R ( ba )。

你完成了。

于 2011-03-20T16:50:06.637 回答
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)

希望这可以帮助!

于 2011-03-17T21:30:10.080 回答