如何用任何语言描述适合 3D(几何、渲染器、物理)的椭圆
How to describe an ellipse suitable for 3D (geometry, renderer, physics), in any language
我可以想到两种创建椭圆的方法class。
在数学中,椭圆由两个焦点和长轴或半长轴长度描述。
一个典型的结构是这样的:
- 焦点 1:Vector3D
- 焦点 2:Vector3D
- 半长轴:双
- planeNormal: Vector3D
然而,我发现它不是最优的,因为 99% 的时间,我并不真正关心焦点。
看起来更难弄清楚如何与 lines/rays 相交或执行投影。
相反,我会将椭圆表示为沿矢量拉伸的圆。
结构应该是这样的:
- 中心:Vector3D
- 半径:两倍
- stretchVector: Vector3D(应用拉伸的轴)
- 拉伸率:双
- planeNormal: Vector3D
我的想法是执行所有 tests/traces/projections 就好像它是针对一个纯粹的圆圈完成的,只需在将它们发送到我的圆圈方法之前缩放值。
但是我在那个领域缺乏经验,所以我不确定哪个是:
- 越易用
- 计算速度更快(它是 3D,所以我需要好的性能!)
编辑: 实际上我需要椭圆作为体积的面(圆柱截面、圆锥截面)而不是运动。所以我的主要用途是进行光线投射或将其与线、平面、圆、其他椭圆等相交......
如果你做物理,你应该关心焦点,因为这在这样的设置中是高度相关的。有关在此类上下文中描述省略号的方法,请参阅 orbital elements。如果例如,您需要这样的参数化你想获得一些天体的速度。
也就是说,我认为 3d 中椭圆的最简单 non-physical 描述可能如下:
x(t) = a + cos(t) b + sin(t) c
这里a
是圆心的位置,b
是圆心到半长轴末端的向量,c
是圆心到半长轴末端的向量半短轴的末端。您会期望 b
和 c
相互垂直,即点积为零。对于 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
现在可以通过这种方式进行高效的相交测试:
- 计算交点
P
例如包含平面由 C
和 n_0
. 定义的射线
- 通过计算
P* = M . (P-C)
(见2x3 矩阵的定义 M
下面)。
- 通过计算
P** = (b/a P*_x, P*_y)
将椭圆转换为半径为 b
的圆
- 现在
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 /
我可以想到两种创建椭圆的方法class。
在数学中,椭圆由两个焦点和长轴或半长轴长度描述。
一个典型的结构是这样的:
- 焦点 1:Vector3D
- 焦点 2:Vector3D
- 半长轴:双
- planeNormal: Vector3D
然而,我发现它不是最优的,因为 99% 的时间,我并不真正关心焦点。
看起来更难弄清楚如何与 lines/rays 相交或执行投影。
相反,我会将椭圆表示为沿矢量拉伸的圆。
结构应该是这样的:
- 中心:Vector3D
- 半径:两倍
- stretchVector: Vector3D(应用拉伸的轴)
- 拉伸率:双
- planeNormal: Vector3D
我的想法是执行所有 tests/traces/projections 就好像它是针对一个纯粹的圆圈完成的,只需在将它们发送到我的圆圈方法之前缩放值。
但是我在那个领域缺乏经验,所以我不确定哪个是:
- 越易用
- 计算速度更快(它是 3D,所以我需要好的性能!)
编辑: 实际上我需要椭圆作为体积的面(圆柱截面、圆锥截面)而不是运动。所以我的主要用途是进行光线投射或将其与线、平面、圆、其他椭圆等相交......
如果你做物理,你应该关心焦点,因为这在这样的设置中是高度相关的。有关在此类上下文中描述省略号的方法,请参阅 orbital elements。如果例如,您需要这样的参数化你想获得一些天体的速度。
也就是说,我认为 3d 中椭圆的最简单 non-physical 描述可能如下:
x(t) = a + cos(t) b + sin(t) c
这里a
是圆心的位置,b
是圆心到半长轴末端的向量,c
是圆心到半长轴末端的向量半短轴的末端。您会期望 b
和 c
相互垂直,即点积为零。对于 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
现在可以通过这种方式进行高效的相交测试:
- 计算交点
P
例如包含平面由C
和n_0
. 定义的射线
- 通过计算
P* = M . (P-C)
(见2x3 矩阵的定义M
下面)。 - 通过计算
P** = (b/a P*_x, P*_y)
将椭圆转换为半径为 - 现在
P
位于原始 3D 椭圆内当且仅当满足以下条件时:P**_x^2 + P**_y^2 <= b^2
.
b
的圆
变换矩阵M
就是
/ v_a_x v_b_x n_0_x \
\ v_a_y v_b_y n_0_y /