如何用任何语言描述适合3D(几何体、渲染器、物理)的椭圆
我可以想出两种方法来创建椭圆类 在数学中,椭圆由两个焦点和长轴或半长轴长度来描述 典型结构如下所示:如何用任何语言描述适合3D(几何体、渲染器、物理)的椭圆,3d,geometry,physics,renderer,3d,Geometry,Physics,Renderer,我可以想出两种方法来创建椭圆类 在数学中,椭圆由两个焦点和长轴或半长轴长度来描述 典型结构如下所示: 焦点1:矢量3D 焦点2:矢量3D 半主轴:双 平面法线:矢量3D 然而,我发现它是次优的,因为99%的时候,我并不真正关心焦点。 弄清楚如何与直线/光线相交或执行投影看起来比较困难 相反,我将椭圆表示为沿向量拉伸的圆 结构应该是这样的: 中心:Vector3D 半径:双 stretchVector:Vector3D(应用拉伸的轴) 双人床 平面法线:矢量3D 我们的想法是执行所有测试/
- 焦点1:矢量3D
- 焦点2:矢量3D
- 半主轴:双
- 平面法线:矢量3D
- 中心:Vector3D
- 半径:双
- stretchVector:Vector3D(应用拉伸的轴)
- 双人床
- 平面法线:矢量3D
- 更易于使用
- 计算速度更快(它是3D的,所以我需要很好的性能!)
编辑:实际上,我需要椭圆作为体积的面(圆柱体部分、圆锥体部分),而不是运动。所以我的主要用途是光线投射或与直线、平面、圆、其他椭圆等相交 如果你学物理,你应该关注焦点,因为这在这样的设置中非常重要。有关在此类上下文中描述省略号的方法,请参见。如果你想得到某个天体的速度,你需要这样的参数化 也就是说,我认为3d中椭圆最简单的非物理描述可能是:
x(t) = a + cos(t) b + sin(t) c
这里,
a
是中心的位置,b
是从中心到半长轴末端的向量,c
是从中心到半短轴末端的向量。您希望b
和c
彼此垂直,即点积为零。对于t ∈ [0,2π)这将给出椭圆的所有点,许多几何特性可以用依赖于t的条件来描述,因此可以求解t。如果你做物理,你应该关注焦点,因为这在这样的设置中是非常相关的。请参阅,以了解在这样的上下文中描述椭圆的方法。你需要这样的参数如果你想得到某个天体的速度,就要进行三角化
也就是说,我认为3d中椭圆最简单的非物理描述可能是:
x(t) = a + cos(t) b + sin(t) c
这里,
a
是中心的位置,b
是从中心到半长轴末端的向量,c
是从中心到半长轴末端的向量。你会期望b
和c
彼此垂直,即点积为零。对于t ∈ [0,2π)这将给出椭圆的所有点,许多几何特性可以用依赖于t的条件来描述,因此可以求解t。椭圆的形状由长轴a
和短轴b
的长度定义。接下来,定义包含平面可能是个好主意通过中心点C
和法向量n_0
标准化为长度1。您需要的剩余信息是长轴的方向。这可以通过与指定平面中的默认线的角度来指定,但我不知道一种自然有效的方法。因此我会选择指定方向长轴的作用向量v_a
。这引入了一些冗余,因为n_0.v_a=0
必须保持并且另外|v_a |=1
或|v_a |=a
(第一个条件更适合您的需要).短轴的方向向量v_b
可根据上述信息计算,但为了提高效率,人们可能更希望对其进行预计算
总之,可以用以下数据在3D中表示椭圆:
:分别表示长轴和短轴长度的实际值a,b
:三维点,椭圆中心C
:三维向量,包含平面的法向量n_0
:分别表示大调和小调方向的3D矢量v_a,v_b
a>=b>0
| n|u 0 |=| v|u a |=| v|u b |=1
n_0=v_a x v_b
v_a.v_b=0
C
和n_0
定义)的交点P
P*=M.(P-C)
(参见下面2x3矩阵M
的定义),将交点P
转换为二维标准椭圆位置(中心=(0,0),长轴平行于x轴)P**=(b/a P*x,P*y)
P
位于原始三维椭圆内,当且仅当以下条件成立:P**x^2+P**y^2椭圆的形状由长轴
a
和短轴b
的长度定义。接下来,通过中心点C
和法向量定义包含平面可能是个好主意ode>n_0
标准化为长度1。您需要的剩余信息是长轴的方向。这可以由j指定