Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3d 未失真纹理坐标_3d_Texture Mapping_Trilateration - Fatal编程技术网

3d 未失真纹理坐标

3d 未失真纹理坐标,3d,texture-mapping,trilateration,3d,Texture Mapping,Trilateration,如何计算平面上点的UV坐标 我有一个多边形-3个或4个或更多的点-在一个平面上-也就是说,所有的点都在一个平面上。但它可以在空间的任何角度 这个多边形的一侧-两个点-将映射到纹理中两个对应的2D点-我预先知道这两个点。我还知道纹理的x和y比例,并且没有点落在纹理范围或其他“边缘情况”之外 下面是一张图像,其中纹理最上面的四边形变形: 我用黄色勾勒出一个糟糕的四边形。想象一下,我知道四边形上最底部两个角的UV坐标,并想计算其他两点的正确UV坐标 如何计算平面中所有其他点相对于这两点的UV坐标?

如何计算平面上点的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))

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)

希望这有帮助

您必须用两个选定的向量和一个原点来表示其他点

我会这样做:

选择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+α(B-A)+β(C-A)+γ(B-A)X(C-A)

我们有3个方程,x,y,z,x是叉积,α,β,γ是未知的。 我们希望它在uv和xyz之间创建一个线性关系

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

Dx-Ax=α(Bx-Ax)+β(Cx-Ax)+γ.Wx

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

Dz-Az=α(Bz-Az)+β(Cz-Az)+γ.Wz

用以下公式计算矩阵M的逆矩阵:

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

然后通过以下公式计算D的α、β、γ:

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

然后通过以下公式计算D的u,v:

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

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


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

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

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

首先,计算p-AB-A之间的角度θ。这是很容易做到的使用标准化向量,和蚁群算法

α=(p-A)⋅(B-A)/(P-AB-A

θ=acos(α)

我们还计算了长度比:

σ=|p-A|/|B-A|

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

R成为

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

然后p=aRb-a


你已经完成了。

你已经在2D中完成了。每一个纹理演示都是从在立方体上涂抹纹理开始的,立方体有漂亮的方形边。问题是计算一组3D点所在平面上的2D坐标。如果使用2D纹理,这是相同的一般问题。需要从3D形状中找到导致问题的两点之间的距离,然后将其放置到2D纹理中。这就是我自己解决同样问题的方法。那么你是如何从平面上的3D点到相应的2D点的呢?如果你的物体是圆形的,那么3D点就不需要考虑了。这是因为您正在将2D纹理映射到它。因此,只需将要渲染纹理的面视为2D形状即可。这使工作更容易理解。或者说,如果纹理将2D纹理映射到3D对象,则映射每个面,而不是每个顶点。非常有希望,thx!什么是α-β和γ?它在c或python伪代码中看起来如何,这样我就可以理解你的意思了?alpha、beta、gamma是实数系数,表示D-a在3个向量B-a、c-a和(B-a)X(c-a)的基础上的分解。这是一个基本的改变,但不是正交的。@brainjam这确实很有希望,但我无法让我将其翻译成python的尝试正常工作;我已经详细更新了这个问题,希望这是我代码中的一个明显错误?@Will,尝试用
x,y=a[0]-b[0],a[1]-b[1]
替换
x,y=b[0]-a[0],b[1]-a[1]
?谢谢
       | (Bx-Ax) , Cx-Ax , Wx | 
   M = | (By-Ay) , Cy-Ay , Wy | 
       | (Bz-Az) , Cz-Az , Wz |