标签: scenekit

如何在代码中创建SceneKit SCNSkinner对象?

我有一个使用SceneKit for iOS 8的Swift应用程序.我从包含由骨架控制的网格的.dae文件加载场景.在运行时,我需要修改纹理坐标.使用变换不是一个选项 - 我需要为网格中的每个顶点计算一个不同的,全新的UV.

我知道几何在SceneKit中是不可变的,我读过建议的方法是手动制作副本.我正在尝试这样做,但在尝试重新创建SCNSkinner代码时,我总是崩溃.崩溃是一个EXC_BAD_ACCESS内部C3DSourceAccessorGetMutableValuePtrAtIndex.不幸的是,没有源代码,所以我不确定为什么它崩溃了.我把它缩小到SCNSkinner连接到网格节点的对象.如果我没有设置,我不会发生崩溃,事情似乎正在发挥作用.

编辑:这是一个更完整的崩溃调用堆栈:

C3DSourceAccessorGetMutableValuePtrAtIndex
C3DSkinPrepareMeshForGPUIfNeeded
C3DSkinnerMakeCurrentMesh
C3DSkinnerUpdateCurrentMesh
__CFSetApplyFunction_block_invoke
CFBasicHashApply
CFSetApplyFunction
C3DAppleEngineRenderScene
...
Run Code Online (Sandbox Code Playgroud)

我没有找到任何关于如何SCNSkinner手动创建对象的文档或示例代码.因为我只是基于以前工作的网格创建它,所以它应该不会太难.我正在创建SCNSkinner根据Swift文档,将所有正确的东西传递给init.但是,有一个骨架属性SCNSkinner,我不知道如何设置.我将它设置为SCNSkinner我正在复制的网格原始的骨架,我认为应该可以工作......但事实并非如此.设置骨架属性时,它似乎没有分配.在分配后立即检查它表明它仍然是零.作为测试,我尝试将原始网格的骨架属性设置为其他内容,并且在分配之后它也保持不变.

任何人都可以了解正在发生的事情吗?或者如何SCNSkinner手动正确创建和设置对象?

这是我用来手动克隆网格并用新网格替换它的代码(我没有在这里修改任何源数据 - 我只是想确保我可以在这一点上创建一个副本) :

// This is at the start of the app, just so you can see how the scene is set up.
// I add the .dae contents into its own node in the scene. This seems to be the …
Run Code Online (Sandbox Code Playgroud)

xcode scenekit swift ios8

89
推荐指数
1
解决办法
3965
查看次数

iOS还原相机投影

我正在尝试估算与太空中QR码相关的设备位置.我正在使用ARKit和Vision框架,两者都在iOS11中引入,但这个问题的答案可能并不依赖于它们.

使用Vision框架,我能够获得在相机框架中限制QR码的矩形.我想将此矩形与从标准位置转换QR码所需的设备平移和旋转相匹配.

例如,如果我观察到框架:

*            *

    B
          C
  A
       D


*            *
Run Code Online (Sandbox Code Playgroud)

如果我距离QR码1米远,以它为中心,假设QR码的边长为10cm,我会看到:

*            *


    A0  B0

    D0  C0


*            *
Run Code Online (Sandbox Code Playgroud)

那两个帧之间的设备转换是什么?我知道确切的结果可能是不可能的,因为观察到的QR码可能是略微非平面的,我们试图估计一个不完美的东西上的仿射变换.

我想这sceneView.pointOfView?.camera?.projectionTransformsceneView.pointOfView?.camera?.projectionTransform?.camera.projectionMatrix后者已经考虑了从ARKit推断的变换更有帮助我对此问题不感兴趣.

我该怎么做

func get transform(
  qrCodeRectangle: VNBarcodeObservation,
  cameraTransform: SCNMatrix4) {
  // qrCodeRectangle.topLeft etc is the position in [0, 1] * [0, 1] of A0

  // expected real world position of the QR code in a referential coordinate system
  let a0 = SCNVector3(x: -0.05, y: 0.05, z: 1)
  let b0 = SCNVector3(x: 0.05, y: 0.05, z: …
Run Code Online (Sandbox Code Playgroud)

camera augmented-reality ios scenekit arkit

87
推荐指数
1
解决办法
3414
查看次数

如何在SceneKit中将.dae转换为.scn文件

这是Apple的Fox示例代码的屏幕截图.如您所见,它们使用.scn文件格式作为图形对象.他们在wwdc2015视频中明确指出这是由艺术家完成的.到目前为止,我只与.dae合作,直到最近才确信这是唯一受支持的格式.我的问题是,如何将存储在.dae文件中的对象导出到.scn文件?

在此输入图像描述

编辑:这是我得到的编辑 - >转换为SceneKit场景文件格式(.scn)

在此输入图像描述

collada ios scenekit

39
推荐指数
2
解决办法
3万
查看次数

旋转SCNCamera节点,查看假想球体周围的对象

我在位置(30,30,30)有一个SCNCamera,在位于(0,0,0)位置的对象上有一个SCNLookAtConstraint.我正在尝试使用A UIPanGestureRecognizer让相机围绕虚拟球体上的物体旋转,同时保持相机和物体之间的半径.我假设我应该使用四元数预测,但我在这方面的数学知识很糟糕.我知道的变量是x&y平移+我试图保留的半径.我在Swift中编写了这个项目,但Objective-C中的答案也同样被接受(希望使用标准的Cocoa Touch Framework).

哪里:

private var cubeView : SCNView!;
private var cubeScene : SCNScene!;
private var cameraNode : SCNNode!;
Run Code Online (Sandbox Code Playgroud)

这是我设置场景的代码:

// setup the SCNView
cubeView = SCNView(frame: CGRectMake(0, 0, self.width(), 175));
cubeView.autoenablesDefaultLighting = YES;
self.addSubview(cubeView);

// setup the scene
cubeScene = SCNScene();
cubeView.scene = cubeScene;

// setup the camera
let camera = SCNCamera();
camera.usesOrthographicProjection = YES;
camera.orthographicScale = 9;
camera.zNear = 0;
camera.zFar = 100;

cameraNode = SCNNode();
cameraNode.camera = camera;
cameraNode.position = SCNVector3Make(30, 30, 30)  
cubeScene.rootNode.addChildNode(cameraNode)

// setup …
Run Code Online (Sandbox Code Playgroud)

ios scenekit swift

36
推荐指数
4
解决办法
3万
查看次数

如何创建逼真的.scn文件?

看着苹果样品AR应用程序,有许多逼真的物体(杯子,蜡烛等).但是,使用Xcode上的场景工具包编辑器很明显,这只允许您创建基本对象.

我的问题是,什么软件/文件可用于创建逼真的scn对象?我确信有一些软件可以让你创建3D模型并将它们转换为scn文件.我只是不知道使用哪个软件或可以转换为哪些文件scn

注意:我知道Stackoverflow指南对于这个问题可能过于模糊/宽泛.我只是不知道在哪里提出我的问题,这似乎是最好的地方

ios scenekit arkit

32
推荐指数
3
解决办法
2万
查看次数

高质量渲染——RealityKit 与 SceneKit 与 Metal

我正在创建一个 iOS 应用程序,我打算在 AR 中显示逼真/高质量的渲染。在试验这 3 个选项的同时,我仍然不确定我应该继续开发我的应用程序框架中的哪一个SceneKitRealityKitMetal

我读过 SceneKit 是建立在 Metal 之上的,但我不确定是否值得花时间/精力对任何自定义着色器进行编程,而不是使用 SceneKit 默认提供的功能。关于 RealityKit,我不需要它提供的任何动画或特殊效果,只需要照片级渲染方面。

三者中哪一个最适合开发 AR 和高质量模型渲染

scenekit swift metal arkit realitykit

32
推荐指数
1
解决办法
1万
查看次数

ARKit - 获取场景中ARCamera的当前位置

我正在同时学习ARKit和Scenekit,这是一个挑战.

创建了ARWorldTrackingSessionConfiguration会话后,我想知道是否有人知道在场景会话中获取用户"相机"位置的方法.我的想法是想要将对象设置为用户当前位置的动画.

let reaperScene = SCNScene(named: "reaper.dae")!
let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)!
reaperNode.position = SCNVector3Make(0, 0, -1)
let scene = SCNScene()
scene.rootNode.addChildNode(reaperNode)

// some unknown amount of time later   
let currentCameraPosition = sceneView.pointOfView?.position
let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0)
reaperNode.runAction(moveAction)
Run Code Online (Sandbox Code Playgroud)

但是,即使我正在移动相机,似乎currentCameraPosition总是[0,0,0].知道我做错了什么吗?最终的想法是我会旋转对象围绕一个看不见的球体,直到它在镜头前,然后动画它,做一些与此类似:旋转SCNCamera节点看着周围的假想球体的对象(这种方式,用户看到对象动画的对象)

谢谢你的帮助.

augmented-reality scenekit swift arkit

28
推荐指数
3
解决办法
2万
查看次数

在Swift Playground中使用SceneKit

我到处寻找这个但是我空白了.你如何复制Chris Lattner在WWDC上与Playgrounds和SceneKit展示的内容?我希望在Playgrounds中有一个SceneKit场景,动画.

我尝试从SceneKit项目模板中剪切并粘贴设置代码,认为它会神奇地开始渲染,但事实并非如此.

我试着观看主题演讲,暂停和放大Lattner的屏幕,寻找源代码的提示,但他似乎是从他的项目的其他地方导入他的所有代码,所以它没有给我任何线索.文档中似乎没有任何内容,或者我错过了它.

scenekit swift

27
推荐指数
3
解决办法
2万
查看次数

ARKit隐藏墙后的物体

如何使用ARKit跟踪的水平和垂直平面隐藏墙后/真实物体后面的物体?目前,当你离开房间和/或它们应该在后面的物体前面时,可以通过墙看到3D添加的物体.那么有可能使用ARKit让我提供更自然的AR体验而不会通过墙壁出现这些对象吗?

augmented-reality ios scenekit swift arkit

27
推荐指数
1
解决办法
8560
查看次数

代码签名错误每当我尝试在新的SceneKit应用程序中替换库存文件时

所以Xcode 8最近发布了,我仍然不确定究竟是什么原因造成了这个问题(可能只是因为它是Xcode的beta版本,或者我可能在某种程度上做错了什么).

手头的问题是我正在尝试创建一个新的SceneKit应用程序,而我正在使用.scn文件.

我在"hero.scnassets"中创建了一个.scn文件"hero.scn",并在hero.scnassets文件夹中提供了一个名为"heroTexture.png"的.png文件

Xcode 8.0 beta 1通常为"GameViewController.swift"文件中的此项目提供的代码编辑如下:

原始代码:

...
let scene = SCNScene(named: "art.scnassets/ship.scn")!
...
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!
ship.run(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))
Run Code Online (Sandbox Code Playgroud)

编辑代码:

...
let scene = SCNScene(named: "hero.scnassets/hero.scn")!
...
let hero = scene.rootNode.childNode(withName: "hero", recursively: true)!
hero.run(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))
Run Code Online (Sandbox Code Playgroud)

收到错误:

.../Xapp.app: resource fork, finder information, or similar detritus not allowed
Command /usr/bin/codesign failed with exit code 1
Run Code Online (Sandbox Code Playgroud)

问题结论:

当我所做的只是替换文件时,为什么我会收到签名错误?

旁注:我知道如何让代码签名问题消失,但这涉及重新启动整个项目(我不介意).然而,我遇到的问题是每当我更改文件时,我都会收到此错误.

PS:这是一个文件结构,只是为了方便.FileStruct

xcode ios scenekit swift xcode8

25
推荐指数
3
解决办法
1万
查看次数

标签 统计

scenekit ×10

swift ×7

ios ×6

arkit ×5

augmented-reality ×3

xcode ×2

camera ×1

collada ×1

ios8 ×1

metal ×1

realitykit ×1

xcode8 ×1