swift:将 y 轴朝向 3-d 空间中的另一个点

Posted

技术标签:

【中文标题】swift:将 y 轴朝向 3-d 空间中的另一个点【英文标题】:swift: orient y-axis toward another point in 3-d space 【发布时间】:2016-05-24 21:20:07 【问题描述】:

假设您在 3-D 空间中有两个点。调用第一个o 为原点,另一个t 为目标。每个的旋转轴都与世界/父坐标系(以及彼此)对齐。放置第三个点r,与原点重合,位置相同,旋转相同。

如何在 Swift 中旋转 r 使其 y 轴指向 t?如果指向 z 轴更容易,我会改用它。其他两个轴的最终方向对我的需求来说并不重要。

我已经进行了许多与此相关的讨论,但没有一个令人满意。我从阅读和经验中了解到,欧拉角可能不是要走的路。我们没有在微积分中讨论这个问题,反正那是 50 年前的事了。

【问题讨论】:

我很困惑。 3D 点没有旋转,它们沿给定轴具有 x/y/z 点。您正在绘制“r”,就好像它是一个向量。您是否正在寻找“y”轴上原点和目标之间的梯度? 对不起。这些是向量表示。我试图定位的是一个 SCNNode。我不知道梯度一词在这里如何应用。谢谢,伯恩 【参考方案1】:

知道了!添加容器节点时非常简单。以下似乎适用于任何象限中的任何位置。

// pointAt_c is a container node located at, and child of, the originNode
// pointAtNode is its child, position coincident with pointAt_c (and originNode)

// get deltas (positions of target relative to origin)
let dx = targetNode.position.x - originNode.position.x
let dy = targetNode.position.y - originNode.position.y
let dz = targetNode.position.z - originNode.position.z

// rotate container node about y-axis (pointAtNode rotated with it)
let y_angle = atan2(dx, dz)
pointAt_c.rotation = SCNVector4(0.0, 1.0, 0.0, y_angle)

// now rotate the pointAtNode about its z-axis
let dz_dx = sqrt((dz * dz) + (dx * dx))

// (due to rotation the adjacent side of this angle is now a hypotenuse)
let x_angle = atan2(dz_dx, dy)
pointAtNode.rotation =  SCNVector4(1.0, 0.0, 0.0, x_angle)

我需要这个来替换不能很容易地用节点树存档的lookAt 约束。我指的是 y 轴,因为这就是 SCN 圆柱体和胶囊的方向。

如果有人知道如何避免容器节点,请告诉。每次我尝试将顺序旋转应用于单个节点时,最后一个会覆盖前一个。我不知道如何制定一个旋转表达式来一次性完成。

【讨论】:

以上是关于swift:将 y 轴朝向 3-d 空间中的另一个点的主要内容,如果未能解决你的问题,请参考以下文章

ue4-4,transform 凹凸 视差 置换

SceneKit - 获取相机的方向

Blender制作模型之网格基本体

欧拉角四元数和矩阵的对比(转)

四元数旋转

将数据源分离到 Swift 中的另一个类