将3D点投影到3D平面上,然后根据该平面的两个轴找到2D坐标

时间:2019-04-16 14:09:17

标签: three.js

我有一个THREE.Plane plane,它与多个THREE.Line3 lines[]相交。

仅使用此信息,如何获取点的二维坐标集?

编辑以更好地理解问题:

2D坐标与平面有关,因此可以想象3D平面变成在黑板上绘制的笛卡尔平面。它几乎是2D平面的3D绘图。我想找到的是先前投影到此笛卡尔平面上的点的X,Y值。但是它们是3D的,就像3D平面一样。

1 个答案:

答案 0 :(得分:1)

您没有足够的信息。在此答案中,我将解释原因,并提供更多信息以实现您想要的目标,

首先,让我们创建一个飞机。像您一样,我使用Plane.setFromNormalAndCoplanarPoint。我正在考虑将共面点作为飞机笛卡尔空间的原点((0, 0)

let normal = new Vector3(Math.random(), Math.random(), Math.random()).normalize()
let origin = new Vector3(Math.random(), Math.random(), Math.random()).normalize().setLength(10)
let plane = new Plane.setFromNormalAndCoplanarPoint(normal, origin)

现在,我们创建一个随机的3D点,并将其投影到平面上。

let point1 = new Vector3(Math.random(), Math.random(), Math.random()).normalize()
let projectedPoint1 = new Vector3()
plane.projectPoint(point1, projectedPoint1)

projectedPoint1变量现在与您的飞机共面。但是此平面是无限的,没有离散的X / Y轴。因此,目前我们只能获得从原点到投影点的距离。

let distance = origin.distanceTo(projectedPoint1)

为了将其转换为笛卡尔坐标,您需要至少定义一个轴。为了使它真正随机,让我们计算一个随机的+Y轴:

let tempY = new Vector3(Math.random(), Math.random(), Math.random())
let pY = new Vector3()
plane.projectPoint(tempY, pY)
pY.normalize()

现在我们有了+Y,让我们得到+X

let pX = new Vector3().crossVectors(pY, normal)
pX.normalize()

现在,我们可以将平面投影点投影到轴矢量上以获得笛卡尔坐标。

let x = projectedPoint1.clone().projectOnVector(pX).distanceTo(origin)
if(!projectedPoint1.clone().projectOnVector(pX).normalize().equals(pX)){
  x = -x
}

let y = projectedPoint1.clone().projectOnVector(pY).distanceTo(origin)
if(!projectedPoint1.clone().projectOnVector(pY).normalize().equals(pY)){
  y = -y
}

请注意,为了获得负值,我对照标准化的轴矢量检查了轴投影矢量的标准化副本。如果它们匹配,则该值为正。如果不匹配,则该值为负。

此外,我在上面所做的所有clone操作都应明确说明这些步骤。这不是执行此操作的有效方法,但是我将优化权交给您。

编辑:我确定值符号的逻辑有缺陷。我已经纠正了将投影点归一化并对照归一化的轴矢量进行检查的逻辑。