1

不久前我在推特上发布了这个,但看到我的追随者似乎都不是数学/编程天才,我也会在这里试试运气。我来到这里是因为我发现可能包含我的解决方案的一部分。

我在以下pdf文档中描述了我的问题,其中包含我想要实现的目标的图片。

为了提供更多细节,我将十二面体的五边形(12 个五边形)划分为三角形(5 个/五边形,总共 60 个三角形),然后收集与每个三角形相关的一组数据点。

这个想法是为每个单独的三角形生成地形网格。为此,数据必须以 32K x 32K 正方形(idTech4 Megatexture)平面表示

我隐约听说过转换矩阵,如果设置得当,它可以起到将所有数据点通过它们的技巧,让它们出现在正确的位置。

我在这里查看了这个源代码,但我不明白我应该如何将点输入和/或输出,更不用说如何进行设置,以便我可以依次呈现每个点并获得结果点回来。

我很快就确定了属于右后角的点。我所有的 3D 点最初都存储在纬度/经度对中。我以这种方式检索 3D 向量:

coord getcoord(point* p) 
{
    coord c;
    c.x=cos(p->lat*pi/180.l) * cos(p->lon*pi/180.l);
    c.y=cos(p->lat*pi/180.l) * sin(p->lon*pi/180.l);
    c.z=sin(p->lat*pi/180.l);
    return c;
};

我的想法是,如果我能找到我的三角形的中心,并发现如何偏移我的角度,以便从我的球体中心到三角形中间的矢量移动到 90N,那么我的点将已经在正确的平面上,如果我沿相同的角度旋转它们。如果我然后将它们全部转换为 3d 并从 y 中减去半径,它们也将位于正确的 y 位置。

然后我需要做的就是旋转、缩放和移动到最终位置。

三角形有几种“中心”,我认为我需要的是与三角形角等距的一种(外心?)

但是可能有一个更简单的方法来解决整个问题,所以当我继续我自己的研究时,也许你们中的一些人可以帮助我指出正确的方向。

看起来好像一些样本数据是有序的,这里有一些 obj 文件格式的三角形:

v 0.000000 0.000000 3396.000000
v 2061.582356 0.000000 2698.646733
v 637.063983 1960.681333 2698.646733
f 1 2 3

还有一个:

v -938.631230 2888.810129 1518.737455
v 637.063983 1960.681333 2698.646733
v 1030.791271 3172.449325 637.064076
f 1 2 3

您会注意到,每个点与 0,0,0 的距离为 3396 我提到“在球体上”,这意味着远离球体中心的面是在翻译成时需要成为“顶部”的面广场。

从理论上讲,所有这些三角形实际上应该具有相同的大小,但是由于生成它们的数学中的舍入误差,这可能并不完全正确。

如果我没记错的话,我已经采取措施确保您在这里看到的第一个点始终是与最长边界相对的那个点,所以它应该位于最左角(测试上述 2 个样本证实了这一点,但是无论如何,我正在测量以确保)从这一点引出的两条腿理论上也应该具有相同的长度,但再次舍入误差可能会稍微抵消这一点。

如果我做得正确,那么长边是 2 个短边的 1,113587 倍。假设它们是相同的,然后在 excel 中进行一些目标搜索,我可以推断出最终点,假设我只是在翻译这个三角形,应该如下所示:

v 16384.000000 0.000000 16384.000000
v -16384.000000 0.000000 9916.165306
v 9916.165306 0.000000 -16384.000000
f 1 2 3

所以我需要设置矩阵来进行这种转换,最好使用 4x4 矩阵,如下所述。

4

1 回答 1

1

我建议使用变换矩阵。3d 变换矩阵是一个 4x4 的数据结构,它描述了平移和旋转(可能还有比例)。一旦你有了一个矩阵,你就可以像这样变换一个点

 result.x = (tmp->pt.x * m->element[0][0]) + 
            (tmp->pt.y * m->element[1][0]) + 
            (tmp->pt.z * m->element[2][0]) + 
            m->element[3][0];

 result.y = (tmp->pt.x * m->element[0][1]) + 
            (tmp->pt.y * m->element[1][1]) + 
            (tmp->pt.z * m->element[2][1]) + 
            m->element[3][1];
 result.z = (tmp->pt.x * m->element[0][2]) + 
            (tmp->pt.y * m->element[1][2]) + 
            (tmp->pt.z * m->element[2][2]) + 
            m->element[3][2];
 int w = (tmp->pt.x * m->element[0][3]) + (tmp->pt.y * m->element[1][3])
      + (tmp->pt.z * m->element[2][3]) + m->element[3][3];
 if (w!=0 || w!=1)
 result.x/=w; result.y/=w; result.z/=w;

这将通过矩阵 m 转换 3D 点 pt。如果您现在进行一些矩阵数学运算,您会看到我只是将原点作为向量与矩阵相乘(如果它是偏斜矩阵,则进行一些归一化。)矩阵可以相乘以形成复杂的变换,因此它们非常有用。

有关制作矩阵的详细信息,建议阅读此链接。 http://en.wikipedia.org/wiki/Transformation_matrix

于 2012-01-31T21:30:58.380 回答