是否可以/实用地将 3d 线段转换为 2d 中的点,以便我可以轻松地从其原点测量点?

Is it possible / practical to convert a 3d line segment to a point in 2d so that I can easily measure points from it's origin?

提问人:Wetter42 提问时间:9/17/2023 最后编辑:SpektreWetter42 更新时间:9/28/2023 访问量:93

问:

请考虑以下情况:

desired plane conversion

我有一个 3D 线段来跟踪给定跑道的理想进近。飞机的目标是尝试在这条特定的线路上飞行进入着陆区,然而,没有人是完美的,玩家不可避免地会飞得太高、太低、太远或太远。

我的目标是确定一个球员是太高、太低、太靠左边还是太靠右边。如果玩家在任何给定的一侧离得太远,请执行某些操作(这包括向玩家打印它们太高或太低)。

问题: (考虑到上图:)如果我在 3d 空间中有一个给定的笛卡尔线段(line = x, y, z && line2 = x1, y1, z1)和一个玩家相对于线的点(也在 3d 空间中),是否有意义/将 3d 线转换为其自身轴上的奇异点是否可行(原点 0, 0) 并测量玩家点相对于原点的距离? 如果是这样,我该如何将固定维度的 3D 线转换为单独维度中的点。

我的思考过程: 每条2d线都可以表示为1d中的一个点,只要我们向下看。如果我们这样做并将该点作为 2D 网格的原点,测量相对距离就变得容易了。

我认为也可以使用其他方法/方法,例如交叉产品,但如果这更便宜,我更喜欢使用这种方法。

无论如何,我很想听听你的反馈。请让我知道你的想法! 注意:我正在使用 lua

我见过一些关于齐次坐标的提及,但我注意到,尽管有一个所需的旋转轴,但轴是固定的,所以它在各种条件下都会引起问题。
测量到线上最近点的距离很简单,但在尝试确定它是相对于线是左还是右/向上还是向下时,就不那么简单了。

矩阵 几何 三角学 投影 代数

评论


答:

0赞 Spektre 9/18/2023 #1
  1. 创建基向量 X 右,Y 向上

    您可以使用局部接地法线、线方向和叉积来执行此操作n(p0,p1)

    X = cross( n , p1-p0 );
    Y = cross( n , X ); Y /= |Y|;
    X = cross( Y , n ); X /= |X|;
    
  2. 转换

    x = dot( p-p0 , X )
    y = dot( p-p0 , Y )
    

    现在,与线的符号距离是否与您想要的方向对齐......x,y

[编辑1] 从评论中移出...

无论如何,如果你想从某个点的某个起点沿某个单位向量的有符号标量距离,那么它是:dvp0p

d = dot(v,p-p0);

现在,您只需提供沿要测量距离的任何内容的矢量即可。由于您的地面是使用参数圆方程(用作参数)的平面,因此您可以沿着跑道获得矢量vz=0azimuth

(cos(azimuth),sin(azimuth),0)

如果你想要向左/向右,你只需将其旋转 90 度,所以要么使用,要么交换并否定一个,例如azimuth + PI/2x,y

(-sin(azimuth),cos(azimuth),0)

如果你想要向上向量,它只是(0,0,1)

从你现在的描述来看,你希望轴垂直于你的进近线并指向上(倾斜),这样你就可以利用叉积,它将垂直向量返回到它的操作数,所以:Y(p0,p1)

Y = cross(p1-p0,cross(p1-p0,(0,0,1))); Y/=length(Y);

内部交叉将与进近线与您的跑道对齐时相同......cross(p1-p0,(0,0,1))X

评论

0赞 Wetter42 9/19/2023
这是有道理的......好吧,一点点 - 几个问题: 1.获得叉积很容易,但是我如何获得正常积呢?这是基于选择的轮换吗?它是如何格式化的,我如何在上述方程式中使用它?2. 我注意到有一个分号。这是为了区分等式的单独部分还是同义词?3. 管道有什么作用 |Y |围绕每个向量代表?正常化?这是如何处理的?4. 在点积上,“p”应该代表“p1”吗?对不起我的无知,但这对我来说有点新鲜。
0赞 Spektre 9/19/2023
@Wetter42 1.法线是 3D 矢量 您可以使用局部位置地平面法线(不确定您是有 WGS84 还是只是平面地球,但在这两种情况下您都应该知道法线坐标,例如)您也可以从跑道网格中获取它。2. 分号表示类似 C/C++ 语言的代码行末尾,因此您可以在单个文本行中包含更多内容 3. 表示向量的绝对值(其长度),请参阅此处 4 中的 edit2。 是你的飞机位置,是跑道理想的进近线终点,所有3D矢量......(0,0,1)|a|pp0,p1
0赞 Wetter42 9/21/2023
它是平面地球。坐标为 Z-Up、X-North 和 Y-West。这是否意味着我的地面法线只是 (0, 0, 1)?既然它是垂直于平面地面的 1 个单位(跨越 x / y 轴)?此外,对于 C / C++ 的东西;这是有道理的,但我很好奇;在我们得到叉积后,我们得到了 Y 的结果,但我们仍然有工作要做,即取 y 并使其等于 Y / |Y|(abs 值 / 'Y' 的长度),对吗?在我们执行除法之后,这是 Y 的最终结果吗?最后,P 是飞机,就像飞机一样!我现在明白了!不是平面(平面) 这是有道理的!
0赞 Wetter42 9/21/2023
插入我认为是变量的东西,我得到以下结果: X = cross( n , p1-p0 );n = (0, 0, 1) p1 - p0 = (3484.432, -2011.506, -470.001) 由于 X 和 Y 值为 0,运行叉积将返回总值 0, 0, 0 与 Y 和 X 的点积相同;这对我来说没有意义......那么我们将 0 除以 0 的长度?我知道我错过了什么!
0赞 Spektre 9/21/2023
@Wetter42是的,在这种情况下是正常的,只是对单位大小的标准化......2 个向量之间的叉积返回垂直于两个向量的向量...你的应该是非零的(除非 2 个向量是平行的,但事实并非如此),所以你的叉积计算是错误的,请参阅此处的 edit2。我通常使用名称来表示点(但在这种情况下,有问题的点也是飞机)0,0,1Y=Y/|Y|cross ( (0, 0, 1) , (3484.432, -2011.506, -470.001) )p