如何计算飞机上点的UV坐标?
我有一个多边形 - 3个或4个或更多个点 - 位于一个平面上 - 也就是说,所有点都在一个平面上。但它可以在任何角度在太空中。
这个多边形的一边 - 两个点 - 将被映射到纹理中的两个相应的2D点 - 我事先知道这两个点。我也知道纹理的x和y比例,并且没有点落在纹理范围或其他“边缘情况”之外。
这是最上面的纹理四边形失真的图像:
我概述了一个黄色的坏四边形。想象一下,我知道那个四边形上那两个最底角的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))
答案 0 :(得分:2)
你必须用两个选择的向量和一个原点来表达其他点。
我会做这样的事情:
选择3个具有相应UV点的3D点:
然后使用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)
希望这有帮助!