好的,我直接使用操纵杆将SCNNode
换为SceneKit
这里。来完成 Apple 的教程,我已经复制了代码,并获得了操纵杆来移动和旋转角色-但不能同时进行,并且不能相对于节点以正确的方向进行。
所有正确的代码都在该下载中,但是我在这里所做的是从操纵杆 UI 中获得操纵杆手柄和 float2 的角度偏移量-
characterDirection = float2(Float(padNode.stickPosition.x), -Float(padNode.stickPosition.y))
let direction = theDude.characterDirection(withPointOfView: renderer.pointOfView)
directionAngle = CGFloat(atan2f(direction.x, direction.z))
public func characterDirection(withPointOfView pointOfView: SCNNode?) -> float3 {
let controllerDir = theDude.direction //THIS ISNT BEING UPDATED
if controllerDir.allZero() {
return float3.zero
}
var directionWorld = float3.zero
if let pov = pointOfView {
let p1 = pov.presentation.simdConvertPosition(float3(controllerDir.x, 0.0, controllerDir.y), to: nil)
let p0 = pov.presentation.simdConvertPosition(float3.zero, to: nil)
directionWorld = p1 - p0
directionWorld.y = 0
if simd_any(directionWorld != float3.zero) {
let minControllerSpeedFactor = Float(0.2)
let maxControllerSpeedFactor = Float(1.0)
let speed = simd_length(controllerDir) * (maxControllerSpeedFactor - minControllerSpeedFactor) + minControllerSpeedFactor
directionWorld = speed * simd_normalize(directionWorld)
}
}
return directionWorld
}
我没有写最后一部分,但仍然试图理解它。但是重要的是我有一个 float3 和一个 angle,当我在渲染器更新func
中尝试同时以SCNActions
的方式运行它们时,它们发生冲突:
这是苹果公司基本上更新的内容:
// move
if !direction.allZero() {
theDude.characterVelocity = direction * Float(characterSpeed)
var runModifier = Float(1.0)
theDude.walkSpeed = CGFloat(runModifier * simd_length(direction))
// move character - IMPORTANT
theDude.directionAngle = CGFloat(atan2f(direction.x, direction.z))
theDude.node.runAction(SCNAction.move(by: SCNVector3(theDude.characterDirection(withPointOfView: theDude.node)), duration: TimeInterval(40))) //HERE - random time
theDude.isWalking = true
} else {
theDude.isWalking = false
theDude.node.removeAllActions()
}
}
我在注释行的哪儿应用了此举,在这里苹果应用了轮换:
var directionAngle: CGFloat = 0.0 {
didSet {
theDude.node.runAction(
SCNAction.rotateTo(x: 0.0, y: directionAngle, z: 0.0, duration: 0.1, usesShortestUnitArc:true))
}
}
它们都在发生,问题是我真的不知道该如何放置时间和节点移动,当操纵杆指向右时向左移动,等等,因为我没有正确执行移动。
我尝试复制该演示,但是它们有一个活动地板,因此有所不同。我在这里做错了什么?