我需要将三维点相对于一个三角形转换,就像三角形在其他地方一样

时间:2012-01-31 21:10:39

标签: c 3d rotational-matrices

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

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

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

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

我已经模糊地听说过转换矩阵,如果设置得当,可以通过它们传递所有数据点,让它们显示在正确的位置。

我查看了这个源代码here,但我不明白我应该如何获得和/或在那里得分,更不用说如何进行设置以便我可以展示每个依次指向并获得结果点。

我确定了识别属于右后角的点。我的所有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位置。

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

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

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

看起来好像有些样本数据是按顺序排列的,以下是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矩阵,如下所述。

1 个答案:

答案 0 :(得分: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