如何用任何语言描述适合 3D(几何、渲染器、物理)的椭圆

How to describe an ellipse suitable for 3D (geometry, renderer, physics), in any language

我可以想到两种创建椭圆的方法class。

在数学中,椭圆由两个焦点和长轴或半长轴长度描述。

一个典型的结构是这样的:

然而,我发现它不是最优的,因为 99% 的时间,我并不真正关心焦点。

看起来更难弄清楚如何与 lines/rays 相交或执行投影。

相反,我会将椭圆表示为沿矢量拉伸的圆。

结构应该是这样的:

我的想法是执行所有 tests/traces/projections 就好像它是针对一个纯粹的圆圈完成的,只需在将它们发送到我的圆圈方法之前缩放值。

但是我在那个领域缺乏经验,所以我不确定哪个是:

编辑: 实际上我需要椭圆作为体积的面(圆柱截面、圆锥截面)而不是运动。所以我的主要用途是进行光线投射或将其与线、平面、圆、其他椭圆等相交......

如果你做物理,你应该关心焦点,因为这在这样的设置中是高度相关的。有关在此类上下文中描述省略号的方法,请参阅 orbital elements。如果例如,您需要这样的参数化你想获得一些天体的速度。

也就是说,我认为 3d 中椭圆的最简单 non-physical 描述可能如下:

x(t) = a + cos(t) b + sin(t) c

这里a是圆心的位置,b是圆心到半长轴末端的向量,c是圆心到半长轴末端的向量半短轴的末端。您会期望 bc 相互垂直,即点积为零。对于 t∆∈ [0,2π) 这将为您提供椭圆的所有点,并且可以根据依赖于 t[ 的条件来描述许多几何属性=26=],所以你可以求解 t.

椭圆的形状由长轴 a 和短轴 b 的长度定义。接下来,通过中心点 C 和归一化为长度一的法向量 n_0 来定义包含平面可能是个好主意。您需要的其余信息是主轴的方向。这可以通过指定平面中与默认线的角度来指定,但我不知道执行此操作的自然且有效的方法。所以我会选择指定长轴的方向向量v_a。这引入了一些冗余,因为 n_0 . v_a = 0 必须成立,另外 |v_a| = 1|v_a| = a (第一个条件对您的需求更有效)。短轴的方向矢量 v_b 可以根据上述信息计算出来,但为了效率,人们可能更愿意预先计算它。

一共可以用以下数据表示一个 3D 椭圆:

  • a, b:表示长轴和短轴长度的实数值,分别为
  • C: 3D点,椭圆中心
  • n_0: 3D向量,包含平面的法向量
  • v_a, v_b:3D 向量指定主次方向,resp.

满足以下条件:

  • a >= b > 0
  • |n_0| = |v_a| = |v_b| = 1
  • n_0 = v_a x v_b
  • v_a . v_b = 0

现在可以通过这种方式进行高效的相交测试:

  1. 计算交点 P 例如包含平面由 Cn_0.
  2. 定义的射线
  3. 通过计算 P* = M . (P-C)(见2x3 矩阵的定义 M 下面)。
  4. 通过计算 P** = (b/a P*_x, P*_y)
  5. 将椭圆转换为半径为 b 的圆
  6. 现在 P 位于原始 3D 椭圆内当且仅当满足以下条件时:P**_x^2 + P**_y^2 <= b^2.

变换矩阵M就是

 / v_a_x v_b_x n_0_x \
 \ v_a_y v_b_y n_0_y /