到目前为止,我已经阅读了以下有关计算4D对象的三维相交点的内容:
Simple implementation of 4D cross-section
How do I get a 3D cross section of a 4D mesh?
然而,我真的很困惑到底发生了什么我知道我需要计算4D对象的每个边(在我的例子中是一个细分)与三维空间相交的点,然后连接计算的点,但是我不确定如何计算相交。
如果有人能解释一下他们是如何计算整个三维横截面的,那就太好了,但是我对如何计算14d边的交集感到满意了,就像两个4D点的交集一样。
(与我发现的第一个链接中所示的不同,我希望能够在第四轴上的任何W坐标上这样做,这样计算的方式可以保持三维空间沿W轴的位置,以及TyScAct本身的位置和方向)。
谢谢
最佳答案
我在这里做过(你的第一个链接是它的副本)
how should i handle morphing objects in opengl?
你会发现不仅仅是横截面,还有C++4D TestSerACT的例子,也没有横截面渲染。
现在你要问的是如何计算几何边缘与轴上4D超平面w = constant
的相交。这很容易,因为边实际上是由两点定义的直线,所以可以使用线性插值:
p(t) = p0 + (p1-p0)*t
当
p0,p1
是标量线性参数定义t = <0,1>
在直线上的位置时,这将为您提供直线上的任何点。p(0) = p0
p(1) = p1
p(0.5) = mid point between p0,p1
现在你只需要解
p(t)
所以t
等于你的常数,我们称它为w
切割平面。p(t).w = w_cut
p0.w + (p1.w-p0.w)*t = w_cut
t = (w_cut-p0.w) / (p1.w-p0.w)
如果
w_cut
在t
间隔内,则边与平面相交。如果<0,1>
整个边在平面中。如链接答案中所述,这不涉及拓扑,因此您将获得点和边,但不涉及如何从它们构造三维几何图形的相互连接信息,因此需要进行彻底的分析更好的方法是以四面体的形式组织网格,检查三角形的交叉点,而不是仅检查边。
所以你要检查四面体三角形的三条边。每个三角形在相交后将转换为:
无-忽略
单点-记住
单边-记住它的两点
整个三角形-记住它的3个点
删除重复的点,然后在相交后应该有四面体的点列表(
(p1.w-p0.w)=0
或0,3
点),以便:4
点-忽略0
点-渲染三角形3
点-渲染四面体也有可能存在
4
和1
点,但可以忽略它们,除非您还希望渲染无限细的直线和点(在这种情况下渲染它们)。有关更多信息,请查看上述链接中的此功能:void mesh4D::draw_cut(double w_cut)
就像我在这里描述的那样唯一的问题是我们失去了多边形的缠绕。但这可以通过在
2
和向量normal_of_triangle
之间做点来修复,如果符号为负,则法线指向内部所以,如果你知道如果方向不对,你想用什么样的方法来指向三角形点的反序。