gpt4 book ai didi

ios - 仅用一个旋转轴将 SCNNode 定位在相机前面

转载 作者:行者123 更新时间:2023-11-28 12:11:15 26 4
gpt4 key购买 nike

我正在尝试制作一个 ARKit 应用程序,其中一个 SCNNode(在本例中是一个盒子)被放置在相机前面,面向相机。当用户四处移动相机时,物体会在移动一定距离后放置。这将为您留下一系列面向相机的节点,它们排成一条直线,间距相等。

我在一定程度上可以做到这一点,但我的问题在于轮换。我目前正在采用所有旋转轴,因此当用户重新定位他们的手机时,节点的旋转会匹配。我想将其限制为仅围绕 y 轴旋转。理想的结果是像多米诺骨牌一样的外观,所有对象都具有相同的 x 和 z 旋转,但可能有不同的 y 旋转。

我希望我已经解释清楚了!

这是我目前使用的代码:

func createNode(fromCameraTransform cameraTransform: matrix_float4x4) -> SCNNode {
let geometry = SCNBox(width: 0.02, height: 0.04, length: 0.01, chamferRadius: 0)

let physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry: geometry))
physicsBody.mass = 1000

let node = SCNNode(geometry: geometry)
node.physicsBody = physicsBody

var translationMatrix = matrix_identity_float4x4
translationMatrix.columns.3.x = 0.05 // Moves the node down in world space
translationMatrix.columns.3.z = -0.1 // Moves the object away from the camera

node.simdTransform = simd_mul(cameraTransform, translationMatrix)

return node
}

我尝试了不同的组合,从 cameraTransform 的第二列提取值并将它们设置为 eulerAnglesrotationsimdRotation,但无济于事。

我也曾尝试从当前 sceneViewpointOfView 中提取值,并将它们分配给与上面列出的相同的值,但还是没有成功。

如有任何帮助,我们将不胜感激!

我对此略知一二,但我真的只是刚开始接触 SceneKit 和 3D 变换/矩阵,所以请对我温柔一点!

最佳答案

我想我知道你想做什么,基本上自动放下每个新的多米诺骨牌,使其均匀分布在 camera.pointOfView 轨迹上。

您可以将新节点欧拉角 y 轴更新为与相机 pointofView eularAngles.y 相同。因此,当您围绕下一个节点移动相机时,您放置的节点始终面向相机(仅围绕 y 轴旋转)。

enter image description here

下面的渲染器函数 updateAtTime 每次都会被调用相机移动

  func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {


// You set the camera’s pointOfView’s eularAngle for y-xis to the node you are
about to place.

node.eulerAngles.y = (sceneView.pointOfView?.eulerAngles.y)!
  • 我在 Playground 上使用过它,所以它确实有效。

编辑:这个角度以上的解决方案有一个万向节锁定问题(当你绕着一个圆圈转时,它的角度会重置回轴。

所以我发现这种使用 SCNBillboardConstraint 的方法在绕圈时不会遇到万向节锁定问题。

let yFreeConstraint = SCNBillboardConstraint()
yFreeConstraint.freeAxes = .Y
node.constraints = [yFreeConstraint]
node.eulerAngles = node.presentation.eulerAngles
node.position = position

enter image description here

关于ios - 仅用一个旋转轴将 SCNNode 定位在相机前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465184/

26 4 0
文章推荐: javascript - 如何以编程方式设置所有 将 wmode 设置为不透明?