如何将网格归一化为 -1 到 1,然后从归一化网格恢复为原始网格?
Posted
技术标签:
【中文标题】如何将网格归一化为 -1 到 1,然后从归一化网格恢复为原始网格?【英文标题】:How to normalize a mesh into -1 to 1, then revert from normalized mesh to original one? 【发布时间】:2012-09-09 02:05:45 【问题描述】:我有一个 X、Y、Z 格式的网格模型。让我们说。
Points *P;
在第一步中,我想将此网格归一化为 (-1, -1, -1) 到 (1, 1, 1)。 这里的 normalize 是指将这个网格拟合到 (-1, -1, -1) 到 (1, 1, 1) 的盒子中。
然后我对归一化网格进行了一些处理,最后我想将尺寸恢复为与原始网格相似。
第一步: P = 原始网格尺寸;
第 2 步: nP =归一化(P); // 从 (-1, -1, -1) 到 (1, 1, 1)
第三步: cnP = 用 (nP) 做某事,顶点数增加或减少。
第四步: 原始网格尺寸 = Revert(cnP); // 尺寸应与原始网格相同
我该怎么做?
【问题讨论】:
@NicolBolas 现在我很好奇“显而易见”是什么。 @DrewDormann 找到任何顶点的任何坐标的最大绝对值。将每个顶点的位置除以该值。稍后,乘以它以扩大规模。问题是,这个问题没有详细说明,所以有几十亿种方法来回答它...... 什么是明显的?我试图自己计算它,但我认为它很复杂。 @furqan:不,一点也不复杂。我可以在评论中加入它:min_x,y,z=max_x,y,z=vertex[0].x,y,z; foreach(v in vertices)min_x,y,z=min(min_x,y,z,v.x,y,z); max_x,y,z=max(max_x,y,z, v.x,y,z); t.x,y,z = (max_x,y,z + min_x,y,z); s.x,y,z (max_x,y,z - min_x,y,z); translate_model(-t); scale_model(2./s); modify_model(); scale_model(2.*s); translate_model(t);
就是这样。
我认为正确的是 scale_model(2./s);修改模型(); scale_model(s/2.);正如@Drew 所说,找到最大的绝对值。这个对我有用。谢谢。
【参考方案1】:
我知道在编程中迷失方向并完全错过底层数学的简单性是多么容易。但相信我,这真的很简单。
解决您的问题的最直观的方法可能是这样的:
确定所有三个坐标轴(即x
、y
和z
)的最小值和最大值。此信息包含在立方体的八个角顶点中。将这六个值保存在六个变量中(例如,min_x
、max_x
等)。
对于网格中的所有点p = (x,y,z)
,计算
q = ( 2.0*(x-min_x)/(max_x-min_x) - 1.0
2.0*(y-min_y)/(max_y-min_y) - 1.0
2.0*(z-min_z)/(max_z-min_z) - 1.0 )
现在q
等于p
转换为区间(-1,-1,-1) -- (+1,+1,+1)
。
在这个中间网格上做任何你需要做的事情。
通过逆运算将所有坐标q = (xx, yy, zz)
转换回原来的网格:
p = ( (xx+1.0)*(max_x-min_x)/2.0 + min_x
(yy+1.0)*(max_y-min_y)/2.0 + min_y
(zz+1.0)*(max_z-min_z)/2.0 + min_z )
清理您造成的任何混乱并继续您的程序的其余部分。
这很简单,找出哪个库包含这些函数可能比自己编写要多得多。
【讨论】:
@datenwolf 以一种简单的方式解决了它,但我也一定会测试你的代码。让我把它写到我的代码中。谢谢。 @furqan datenwolf 刚刚给了你一条鱼。上面的解决方案向您展示了如何捕获一个。【参考方案2】:很容易 - 使用形状函数。这是两点的一维示例:
-1 <= u <= +1
x(u) = x1*(1-u)/2.0 + x2*(1+u)/2.0
x(-1) = x1
x(+1) = x2
您可以使用 Jacobbean 在坐标系之间进行转换。
让我们看看它在 2D 中的样子:
-1 <= u <= =1
-1 <= v <= =1
x(u, v) = x1*(1-u)*(1-v)/4.0 + x2*(1+u)*(1-v)/4.0 + x3*(1+u)*(1+v)/4.0 + x4*(1-u)*(1+v)/4.0
y(u, v) = y1*(1-u)*(1-v)/4.0 + y2*(1+u)*(1-v)/4.0 + y3*(1+u)*(1+v)/4.0 + y4*(1-u)*(1+v)/4.0
【讨论】:
先用我给你的东西做点什么。 什么是 x1, x2, x3, x4 ?我的意思是在网格中这些值是什么。你的意思是 x1 = x(u+1) , x2 = x(u+2) 等等。 ? 使用形状函数仅重新缩放一组顶点以适应 +1,-1 立方体是恕我直言的过度杀伤力。如果已经有一个框架可以做到这一点,它会起作用,但无论如何你都不会自己编写转换方程。您不妨建议将值乘以某个矩阵,然后乘以该矩阵的逆矩阵——至少这更有可能得到某种框架的支持,并且是更常见的术语。你的回答似乎在炫耀。对提问者不是很有用。不过,很高兴阅读我从未听说过的形状函数。 炫耀?不,我为您提供了从全局坐标和局部坐标进行转换的基础。 (x, y) 值是全局坐标,(u, v) 是它们在局部单位空间中的对应值。您使用 Jacobbean 从一个转换到另一个。这是您需要学习以正确解决问题的方法。人们自愿在这里给出答案;这就是我所做的。看不懂就可惜了。 另外两点:OP 说网格,所以我假设每个元素都有自己的局部坐标系,就像有限元网格一样。而且,就我的一生而言,我无法理解那些不提供自己的答案但坚持对他人的答案进行争论、贬低的低代表的人。他们几乎没有什么可以提供的。 @Kuba Ober,让我们从你们这样的人那里看到更多的答案和更少的 cmets。以上是关于如何将网格归一化为 -1 到 1,然后从归一化网格恢复为原始网格?的主要内容,如果未能解决你的问题,请参考以下文章