首页 > 解决方案 > SceneKit - 定位 SCNCamera 并允许对象旋转

问题描述

我即将完成我在 SceneKit 中的第一个项目,但我在最后几个步骤中苦苦挣扎。通过分享一个显示我当前场景的 Xcode 模拟器的短截屏视频,可能最容易解释我的进度。

正如您在屏幕截图中看到的那样,我的项目由三个元素组成(这都是在代码中完成的,我不导入任何外部资产):

  1. 外框(通过每个角的六个 SCNBox 对象定义)
  2. 在太阳内部(通过 SCNTube 对象为圆和每个“射线”的 UIBezierPath 对象定义)
  3. 摄像头位置

根据反馈,我已将代码提交到 GitHub

现在允许相机旋转,如屏幕截图所示,但相机和物体的旋转中心没有对齐,因此它看起来是离轴旋转。

这是我想去的地方:

  1. 正确的相机位置,使组合框和太阳直接位于相机前面,填充屏幕
  2. 保持太阳的位置是固定的(我猜已经完成了)
  3. 允许盒子根据触摸输入在 x、y 和 z 方向上自由旋转 - 因此用户可以“轻弹”盒子并观看它围绕太阳翻转和旋转

代码结构很简单:

class GameViewController: UIViewController {

var gameView: SCNView!
var gameScene: SCNScene!
var cameraNode: SCNNode!
var targetCreationTime: TimeInterval = 0

override func viewDidLoad() {
    super.viewDidLoad()
    initView()
    initScene()   // createSun() and createCube() called here
    initCamera()
}

关于相机位置:

   func initCamera() {
        let camera = SCNCamera()
        cameraNode = SCNNode()
        cameraNode.camera = camera
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 0)
        cameraNode.rotation = SCNVector4Make(1, 0, 0, .pi/2)
    }

但我发现,尽管使用随机的 cameraNode.position 和 cameraNode.rotation 值,相机视图似乎并没有改变。

我的问题- 任何帮助将不胜感激:

  1. 关于重新定位相机的建议(我做错了什么?!) - 一旦它在正确的位置,我可以轻松设置“gameView.allowsCameraControl = false”
  2. 关于如何使盒子绕太阳轴旋转的建议(当太阳保持固定时)
  3. 伸展目标!任何关于材质和光照的一般“查看本教程”类型信息,并将此视图嵌入到 SwiftUI 视图中

谢谢!

标签: iosscenekitscnnodescncamera

解决方案


我决定停止与旋转点作斗争,而是围绕它重新定位元素。

一件有趣的事情,我在 createBox() 函数的开头提到过。

// originally debugCube & debugNode were used for debugging the pivot point of the box
// but I found have this large node helped to balance out the centre of mass
// set to fully transparent and added to boxNode as final step after all other transformations

如果您注释掉第 19-26 行和第 117 行,您将完全删除 debugNode。有趣的是,当你这样做时,盒子会停止正确旋转。但是你把它加回去,一切都修复了。我猜它会为整个节点添加“质量”,并帮助将旋转点锁定到正确的位置。所以最后我只是让它透明!

最终(1.0 版)代码发布在 GitHub 上的github.com/LedenMcLeden/logo


推荐阅读