ios - SceneKit - 定位 SCNCamera 并允许对象旋转
问题描述
我即将完成我在 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 视图中
谢谢!
解决方案
我决定停止与旋转点作斗争,而是围绕它重新定位元素。
一件有趣的事情,我在 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
推荐阅读
- azure-data-factory - Azure 数据流无法连接到私有云中的托管实例
- javascript - 使用反应钩子打字时如何修复模态关闭
- mysql - 如何在 Azure 数据工厂中将 XML 多个节点映射到数据库字段
- php - PHP gettype返回双精度而不是整数?
- java - Java:无论在switch-case中是否区分大小写,都获取字符串值
- r - 在 KableExtra 中插入列分隔符
- excel - 如何通过变量(ID)将 2 个 excel 文件合并为 1 个
- javascript - 是否有算法或自定义函数来打包对象/项目,以便它们有效地形成正方形或矩形形状(大约)?
- javascript - 除了尝试捕获或承诺拒绝之外,有没有办法处理量角器的预期条件?
- python - 如何使 docx 文件呈现/加载/添加并保留所有 w:LastRenderedPageBreak