提问人:Wetter42 提问时间:9/17/2023 最后编辑:SpektreWetter42 更新时间:9/28/2023 访问量:93
是否可以/实用地将 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?
问:
请考虑以下情况:
我有一个 3D 线段来跟踪给定跑道的理想进近。飞机的目标是尝试在这条特定的线路上飞行进入着陆区,然而,没有人是完美的,玩家不可避免地会飞得太高、太低、太远或太远。
我的目标是确定一个球员是太高、太低、太靠左边还是太靠右边。如果玩家在任何给定的一侧离得太远,请执行某些操作(这包括向玩家打印它们太高或太低)。
问题: (考虑到上图:)如果我在 3d 空间中有一个给定的笛卡尔线段(line = x, y, z && line2 = x1, y1, z1)和一个玩家相对于线的点(也在 3d 空间中),是否有意义/将 3d 线转换为其自身轴上的奇异点是否可行(原点 0, 0) 并测量玩家点相对于原点的距离? 如果是这样,我该如何将固定维度的 3D 线转换为单独维度中的点。
我的思考过程: 每条2d线都可以表示为1d中的一个点,只要我们向下看。如果我们这样做并将该点作为 2D 网格的原点,测量相对距离就变得容易了。
我认为也可以使用其他方法/方法,例如交叉产品,但如果这更便宜,我更喜欢使用这种方法。
无论如何,我很想听听你的反馈。请让我知道你的想法! 注意:我正在使用 lua
我见过一些关于齐次坐标的提及,但我注意到,尽管有一个所需的旋转轴,但轴是固定的,所以它在各种条件下都会引起问题。
测量到线上最近点的距离很简单,但在尝试确定它是相对于线是左还是右/向上还是向下时,就不那么简单了。
答:
创建基向量
X
右,Y
向上您可以使用局部接地法线、线方向和叉积来执行此操作
n
(p0,p1)
X = cross( n , p1-p0 ); Y = cross( n , X ); Y /= |Y|; X = cross( Y , n ); X /= |X|;
转换
x = dot( p-p0 , X ) y = dot( p-p0 , Y )
现在,与线的符号距离是否与您想要的方向对齐......
x,y
[编辑1] 从评论中移出...
无论如何,如果你想从某个点的某个起点沿某个单位向量的有符号标量距离,那么它是:d
v
p0
p
d = dot(v,p-p0);
现在,您只需提供沿要测量距离的任何内容的矢量即可。由于您的地面是使用参数圆方程(用作参数)的平面,因此您可以沿着跑道获得矢量v
z=0
azimuth
(cos(azimuth),sin(azimuth),0)
如果你想要向左/向右,你只需将其旋转 90 度,所以要么使用,要么交换并否定一个,例如azimuth + PI/2
x,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,0,1)
|a|
p
p0,p1
0,0,1
Y=Y/|Y|
cross ( (0, 0, 1) , (3484.432, -2011.506, -470.001) )
p
评论