使用着色器计算最佳矩阵

时间:2009-07-21 14:07:30

标签: c# xna

这是我的最终目标:我有一个非常大的Vector3s地形阵列(约200万),我想要做的是找到导致最小长度的变换矩阵所有这些向量相对于原点(也就是从向量到原点的距离)。是的,只需将它们全部加在一起。

我可以在C#中以暴力方式执行此操作。但它需要几分钟!我在这里做的是取代表转换的矩阵的每个元素(在这个应用程序中不允许旋转)并慢慢地将它们从例如-5.0增加到5.0 (有一些delta如0.01)所以已经测试了所有组合,并且在用这个矩阵对它们进行变换后存储顶点的总长度。

伪代码方法看起来像这样:

float total = 0
float delta = 0.01
for(matrix_translate_x -5.0 -> 5.0)
for(matrix_translate_y -5.0 -> 5.0)
for(matrix_translate_z -5.0 -> 5.0)
     for each vector
          transform vector by matrix
          add length to total

我想知道是否有办法使用HLSL快速执行此闪电。我理解如何用语言中的float3s和float4x4s进行计算,但是我不知道如何存储每次迭代的结果,因此可以在GPU处理所有顶点之后确定最终解决方案。到目前为止,我在高度图中有这些顶点,我将其渲染为一个rendertarget来分析结果。

在此应用程序中使用HLSL是否可行?理想情况下,这将采用一个渲染,因为3轴上的-5到5是使用0.01作为delta的100,000个组合!我也对不使用HLSL的其他建议持开放态度。

谢谢!


编辑:我没想到会有一个简单的数学答案,所以为了简洁,我简化了我的问题!见回复#1。

我所说的这个“地形”存在于沿着X轴以管状方式散布的3D点云。我可以独立地移动这个管子的两端(就像握住扫帚柄的两端并移动你的手臂)在Y和Z方向上,试图找到我上面写的最小的总长度。所以实际上会有两个向量,一个在X = 0,另一个在X = max_x。 0和max_x之间的所有点将在两个解向量之间进行插值。所以实际上我们可以在这里“旋转”。这听起来有意义吗?

我假设我能够弄清楚HLSL中的原则我可以完全应用它来解决我的问题。抱歉混淆。


[顺便说一下,我也在XNA社区论坛上发布了这个问题(复制/粘贴)。这是不好的论坛礼仪吗?我是这种事的新手......]

1 个答案:

答案 0 :(得分:1)

这似乎是一种非常强力的方法来寻找您想要的解决方案。我认为您应该能够直接计算解决方案,而不会尝试所有可能性。

如果我理解正确,你有n个3向量x_1,...,x_n,并且你正试图找到一个翻译(即另一个3向量)d,这样< / p>

sum(i = 1,... n)|| (x_i + d)||

是最小的(其中||表示向量的2范数或长度)。

正确?

我相信你应该能够通过设置d以使数据集的质心到原点来使这个总和最小(不能证明它)。换句话说

d = - (1 / n)* sum(i = 1,... n)x​​_i

尝试使用此解决方案 - 它是否等同于使用上述算法通过暴力计算的解决方案?

已编辑因为我认为我最初误解了这个问题。

再次

编辑要求澄清,因为评论格式不允许我格式化公式。

我不太确定我理解 - 您能尝试用数学方式表达您可以对数据集执行的操作吗?

澄清:

  • 你可以沿着所有轴进行翻译吗?或沿x轴的翻译是“禁止的”?

  • 你说你可以“在y和z中独立移动数据集的两端”(如果我正确地解读你的话)。这听起来好像你至少允许在y-z平面上旋转。你还允许沿y和z缩放吗?怎么样剪毛?

这个矩阵是否表达了你想要做的事情:

        | 1 0 0 | 
x_new = | 0 a b |*x_orig + d
        | 0 c d |

其中3矢量x_orig是原始数据点,矩阵在yz平面中执行任意操作,3矢量d表示在矩阵之后应用的平移。