我即将完成我在 SceneKit 中的第一个项目,但我在最后几个步骤中苦苦挣扎。通过分享一个显示我当前场景的 Xcode 模拟器的短截屏视频,可能最容易解释我的进度。
正如您在屏幕截图中看到的那样,我的项目由三个元素组成(这都是在代码中完成的,我不导入任何外部资产):
- 外框(通过每个角的六个 SCNBox 对象定义)
- 在太阳内部(通过 SCNTube 对象为圆和每个“射线”的 UIBezierPath 对象定义)
- 摄像头位置
根据反馈,我已将代码提交到 GitHub。
现在允许相机旋转,如屏幕截图所示,但相机和物体的旋转中心没有对齐,因此它看起来是离轴旋转。
这是我想去的地方:
- 正确的相机位置,使组合框和太阳直接位于相机前面,填充屏幕
- 保持太阳的位置是固定的(我猜已经完成了)
- 允许盒子根据触摸输入在 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 值,相机视图似乎并没有改变。
我的问题- 任何帮助将不胜感激:
- 关于重新定位相机的建议(我做错了什么?!) - 一旦它在正确的位置,我可以轻松设置“gameView.allowsCameraControl = false”
- 关于如何使盒子绕太阳轴旋转的建议(当太阳保持固定时)
- 伸展目标!任何关于材质和光照的一般“查看本教程”类型信息,并将此视图嵌入到 SwiftUI 视图中
谢谢!