在平面上的世界 space 单位中查找一个 (s, t) 纹理坐标单位的长度

Find length of one (s, t) texture coordinate unit in world space units on a plane

已编辑:

我有一组形状的纹理坐标和笛卡尔真实世界 ('world space') 坐标(以米为单位),我想从这些坐标中找到世界 space 长度st 纹理坐标中的每一个的单个单元,当对应于该长度的线分别在纹理 space 中水平和垂直定向时。但是当我在纹理中没有至少一条水平方向的边和一条垂直方向的边时,我很难计算这个 space.

基本上,我希望能够找出 1 s 单位等于米,1 t 单位等于米。为了说明这一点,使用示例三角形 - 请参阅下面的坐标值列表 - 我想找到以米为单位的垂直和水平红色箭头线的长度 ...

(我还希望解决方案适用于任何三角形或多边形,给定等效的坐标集)

此处的纹理映射是非参数的,所有 3D 点也是共面的,因此表面是可展开的。平面上的世界 space 中的映射是等距的(全局缩放),因此 2D 中的插值因此可以是线性的。

(因为我在 MATLAB 中工作 - 我在进行纹理贴图并希望能够将我可开发的全局缩放表面上的任何纹理坐标转换为笛卡尔坐标)

举例来说,我有一组纹理坐标 (s, t) 的三角形,如下所示 ...

编辑值(两次):

(1) 1.7942553649452966 0.8511551466745527
(2) 1.756240725743247 0.8674815156738774
(3) 1.730892921329496 0.8328561344213196
(1) 1.7942553649452966 0.8511551466745527

...具有相应的真实世界(笛卡尔)坐标(x, y, z),单位为米...

编辑值(两次):

(1) 660050.0702952344 5868605.033820355 20.442670747055647
(2) 660050.3347344951 5868606.121563466 20.574639679143946
(3) 660050.4376411334 5868606.55473629 19.53932546324279
(1) 660050.0702952344 5868605.033820355 20.442670747055647

仅供参考,这些来自 CityGML,它使用 COLLADA 方法进行纹理映射。

由于形状总是形成一个平面,我可以轻松生成平面方程,以及由每个顶点对表示的直线方程。但是如果不知道平面上的线相对于纹理中的水平和垂直方向的旋转 space,我看不出这些对我有何帮助。所以从边上使用毕达哥拉斯开始是不可能的......?

我在想这一定是那些编码对象查看器很久以前就解决了的问题,这些查看器既可以纹理贴图也可以显示世界space,但到目前为止我找不到解决方案。 ..

仅供参考,这与我提出的一个持续问题有关 here

谢谢

我可能理解错了,但这里是。

你有一个具有世界space笛卡尔坐标和纹理坐标的三角形,你想找到每个纹理维度中一个单元的世界space距离。

为方便起见,三角形顶点 A、B、C 结构化:

{p:{x,y,z},s,t} 

计算世界space单位T的距离:

在 S 方向对顶点进行排序 - 让我们将它们放在一个数组中 V[]

示例:如果 B.s < A.s < C.s 那么:

V[0] = B
V[1] = A 
V[2] = C 

沿与 V[1] 相交的对边找到分数。 (即投影在T方向)

fraction = (V[1].s-V[0].s)/(V[2].s-V[0].s)

通过 V[0] and V[2] 之间的线性插值找到边缘上该点的坐标。 (插入对象中的所有标量)

P = (V[0] * (1 - fraction)) + (V[2] * fraction)

现在您在 T 中有了垂直对齐跨度的端点,并且可以找到它的长度:

dT = abs(V[1].t - P.t)

你可以用毕达哥拉斯计算那个跨度的世界space距离:

dW = distanceBetween(V[1].p, P.p)

那么世界space单位T的距离:

uT = dW/dT

你当然可以对 S 做同样的事情。

编辑: 更多细节....

在上图中,想法是计算出 P 的坐标。一旦你有了它,你就可以计算出 V[1]-Pt 方向上的线的长度,并且在x,y,z 这足以得到你想要的结果。

如果我们知道 P 沿直线 V[0]V[2](分数)的标量 (0->1) 参数,那么我们可以通过线性插值找到所有分量 P(x,y,z,t)。事实证明,参数与 V[1]S 分量沿 V[0]V[2]S 中的跨度相同,如红色水平线所示。

Linear interpolation is like a weighted blend。假设分数是 0.33,那么您可以添加:V[2]*0.33 + V[0]*(1 - 0.33) 来找到两者之间的点。它适用于所有组件,因为直线 V[0]V[2] 在笛卡尔 space 和纹理 space 中是一条直线。如果您在这些顶点上存储了其他值,例如 RGBA 中的每个顶点颜色,您可以以相同的方式对它们进行插值并知道 P 处的颜色和 alpha 值。