gpt4 book ai didi

swift - 无法在 ARKit 中旋转 SCNNode

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:09 24 4
gpt4 key购买 nike

我正在尝试在 y 轴上旋转 SCNNode,以便我的节点(箭头)指向正确的方向。我想制作一个使用 ARKit 的导航应用;每个箭头都需要指向我收到的路线的下一个位置。路线的检索工作正常。

节点被添加到场景的根节点。在某些时候,我遍历了一个节点数组以将它们定位在场景中并对节点应用缩放(基于距离),这一切都正确完成了。但是,当我应用旋转时,这没有任何效果。旋转是通过修改节点的旋转属性来完成的:

directionNode.rotation = SCNVector4(x:0, y:1:, z:0, w:Float(bearing))

这没有达到预期的效果。我也试过使用runAction方法,也没有效果:

directionNode.runAction(SCNAction.rotateBy(x: 0, y: CGFloat(bearing), z: 0, duration: 0))

这是定位和缩放节点的代码。

for i in 0...(directionNodes.count - 1) {

let directionNode = directionNodes[i]
let translation = MatrixHelper.transformMatrix(for: matrix_identity_float4x4,
originLocation: startingLocation,
location: directionNode.location)
let position = SCNVector3.positionFromTransform(translation)
let distance = directionNode.location.distance(from: startingLocation)

DispatchQueue.main.async {
let scale = 100 / Float(distance)
directionNode.scale = SCNVector3(x: scale, y: scale, z: scale)
directionNode.anchor = ARAnchor(transform: translation)
directionNode.position = position

if (i < (self.directionNodes.count - 1)) {
// Apply rotation to the arrow
let successiveStepLocation = self.directionNodes[i + 1].location!
let bearing = directionNode.location.bearingToLocationRadian(successiveStepLocation)
// rotate
directionNode.rotation = SCNVector4(x:0, y:1:, z:0, w:Float(bearing))
}
}
}

这一切都包含在 SCNTransaction 中。

谁能告诉我为什么节点的旋转不起作用?非常感谢任何帮助。

[编辑]:我忘了提及我尝试旋转的 3D 箭头对象始终指向同一方向。即使当我“四处走动”时,箭头也总是(在我的情况下)指向左侧。也许这有助于解决我的问题...

最佳答案

Update: I reckon the problem is in singleSided shader you're using. You see the invisible side of your model. Just enable doubleSided material for your geometry:

directionNode.geometry?.firstMaterial?.isDoubleSided = true

您需要使用以弧度表示的值(有效范围是-6.28+6.28)。

It's important in what direction your object is rotated >> CW or CCW. You can't see the single-sided geometry (at a certain angle) at a positive angle of rotation +.pi.

它是这样工作的:

myNode.rotation = SCNVector4(x: 0, y: -1, z: 0, w: (.pi * 3) / 2)

...并且当您也在使用 SCNAction 时(并且不要忘记分配持续时间):

let action = SCNAction.repeatForever(SCNAction.rotate(by: -.pi, 
around: SCNVector3(0,1,0),
duration: 1.75))
myNode.runAction(action)

...并且当您也在使用 SCNTransaction 时:

let previousTransform = myNode.transform
let rotate = SCNMatrix4MakeRotation(0, 1, 0, (-Float.pi/2))

SCNTransaction.begin()
SCNTransaction.animationDuration = 3.75
myNode.transform = SCNMatrix4Mult(rotate, previousTransform)
SCNTransaction.commit()

enter image description here

关于swift - 无法在 ARKit 中旋转 SCNNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55972326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com