【问题标题】:Find 3d coordinates of a point on a line projected from another point in 3d space查找从 3d 空间中的另一个点投影的线上的点的 3d 坐标
【发布时间】:2019-03-20 05:33:09
【问题描述】:

在 Swift、ARTKit / SceneKit 中工作

我在 3d 中有一条 AB 线,并且我有 A 点和 B 点的 xyz 坐标。 我也有一个点 C,我也知道它的 xyz 坐标。

现在,我想找出 D 点在 AB 线上的 xyz 坐标;假设CD垂直于AB。

在 Swift 中实现它的简单方法是什么。

【问题讨论】:

  • 线条无限窄。这样的交叉点实际上是不存在的。你的目标 AB 线必须有一定的宽度,使其成为一个矩形平面。那时,只需用光线追踪一条线与平面相交,这是一项简单且有据可查的任务。
  • @Alexander AB 实际上是一个半径为 0.0002 的圆柱体

标签: swift 3d scenekit arkit


【解决方案1】:

使用标量 t 参数化行 AB

P(t) = A + (B - A) * t`

D = P(t) 的点使得CD 垂直于AB,即它们的点积为零:

dot(C - D, B - A) = 0

dot(C - A - (B - A) * t, B - A) = 0

dot(C - A, B - A) = t * dot(B - A, B - A)

// Substitute value of t

-->  D = A + (B - A) * dot(C - A, B - A) / dot(B - A, B - A)

Swift 代码:

var BmA = B - A
var CmA = C - A
var t = dot(CmA, BmA) / dot(BmA, BmA)
var D = A + BmA * t;

【讨论】:

  • 顺便说一句,您可以输入option + 8
  • @Alexander 我只是想区分标量积和点积;除此之外,我需要额外的括号来表示小数项。但是感谢您的提示,我将在以后的答案中使用它。
  • @meowgoesthedog 有没有机会将最终方程式 D = A + (B - A) * dot(C - A, B - A) / dot(B - A, B - A) 转换为 SWIFT?
  • @Kashif Stackoverflow 不能替代线性代数类和图形编程 class=/
  • @meowgoesthedog 这就像一个魅力。非常感谢!!我必须补充一点,像github.com/devindazzle/SCNVector3Extensions 这样的 SCNVector3 扩展有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2011-03-31
  • 2011-06-03
  • 2023-03-03
  • 2017-04-10
相关资源
最近更新 更多