swift:将y轴定向到三维空间中的另一个点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift:将y轴定向到三维空间中的另一个点相关的知识,希望对你有一定的参考价值。

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

如何,在斯威夫特,你可以旋转r,使其y轴指向t?如果指向z轴更容易,我会采取相反的方式。其他两个轴的最终方向对我的需求来说并不重要。

enter image description here

我经历过很多与此有关的讨论,但都没有满足。我从阅读和经验中了解到,欧拉角度可能不是最佳选择。我们没有用微积分来描述这个问题,而这在50年前还是如此。

答案

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

// 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轴定向到三维空间中的另一个点的主要内容,如果未能解决你的问题,请参考以下文章

将y轴自动缩放到pyqtgraph中的可见数据

在 3D 空间中沿 Y 轴的一个角度在随机点处旋转单位向量

重定向到 React 中的另一条路线时如何传递状态/道具?

在 3d 空间中移动一个点

如何将 JSON 响应发送到 Swift 3 中的另一个视图

将点击行为重定向到 UICollectionViewCell 中的另一层