如何用任何语言描述适合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
然而,我发现它是次优的,因为99%的时候,我并不真正关心焦点。

弄清楚如何与直线/光线相交或执行投影看起来比较困难

相反,我将椭圆表示为沿向量拉伸的圆

结构应该是这样的:

  • 中心: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
    :三维向量,包含平面的法向量
  • v_a,v_b
    :分别表示大调和小调方向的3D矢量
符合下列条件:

  • 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指定