Я закончил учебник raywenderlich.com
Создание приложения-музея с ARKit
2. Я пытался изменить это приложение, чтобы добавить SKScene
на якорное изображение вместо AVPlayer
.
Все, что я действительно хочу сделать, это поставить SKShapeNode
на изображение, но после проведения исследования похоже, что мне нужно создать SKScene
, добавить SKShapeNode
к SKScene
и затем добавить SKScene
до SCNPlane
.
Вы можете установить значение для этого свойства, используя любой из следующих типов:
Цвет (NSColor / UIColor или CGColor), определяющий однородный цвет для поверхности материала
Число (NSNumber), задающее равномерное скалярное значение для поверхности материала (полезно для физических свойств, таких как металличность)
Изображение (NSImage / UIImage или CGImage), указывающее текстуру для отображения на поверхности материала
Объект NSString или NSURL, указывающий местоположение файла изображения
Видеоплеер (AVPlayer) или предварительный просмотр захвата видео (AVCaptureDevice, только в iOS)
Слой Core Animation (CALayer)
Текстура (SKTexture, MDLTexture, MTLTexture или GLKTextureInfo)
Сцена SpriteKit (SKScene)
Специально отформатированное изображение или массив из шести изображений с указанием граней кубической карты
Вот моя модифицированная версия кода:
private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode) {
let name = imageAnchor.referenceImage.name!
print("you found a \(name) image")
let size = imageAnchor.referenceImage.physicalSize
let skScene = SKScene(size: size)
print("SKSCENE FRAME: \(skScene.frame)")
skScene.backgroundColor = .white
let skShape = SKShapeNode(rectOf: size, cornerRadius: 5.0)
skShape.fillColor = .blue
skShape.strokeColor = .red
skShape.lineWidth = 1.5
skScene.addChild(skShape)
let plane = SCNPlane(width: size.width, height: size.height)
let material = SCNMaterial()
material.lightingModel = SCNMaterial.LightingModel.constant
material.isDoubleSided = true
material.diffuse.contents = skScene
plane.materials = [material]
let rectNode = SCNNode(geometry: plane)
rectNode.eulerAngles.x = -.pi / 2
node.addChildNode(rectNode)
}
Когда я запускаю это на своем iPhone и указываю на изображение, приложение вылетает, и я получаю следующую трассировку стека.
2019-04-15 22:32:28.650432-0600 ImageTracker[3807:1577260] [DYMTLInitPlatform] platform initialization successful
2019-04-15 22:32:29.238671-0600 ImageTracker[3807:1577061] [Accessibility] ****************** Loading GAX Client Bundle ****************
2019-04-15 22:32:29.362407-0600 ImageTracker[3807:1577061] Metal GPU Frame Capture Enabled
2019-04-15 22:32:29.364368-0600 ImageTracker[3807:1577061] Metal API Validation Enabled
2019-04-15 22:32:29.499256-0600 ImageTracker[3807:1577061] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2019-04-15 22:32:29.500912-0600 ImageTracker[3807:1577061] [MC] Reading from public effective user settings.
Point the camera at a dinsoaur.
you found a stegosaurus image
SKSCENE FRAME: (-0.0, -0.0, 0.10541000217199326, 0.06538714197231457)
<SKScene> name:'(null)' frame:{{-0, -0}, {0.10541000217199326, 0.065387141972314572}} anchor:{0, 0}
2019-04-15 22:32:37.189388-0600 ImageTracker[3807:1577292] validateTextureDimensions, line 1071: error 'MTLTextureDescriptor has width of zero.'
validateTextureDimensions:1071: failed assertion `MTLTextureDescriptor has width of zero.'
Я не совсем уверен, что такое MTLTextureDescriptor
или как сделать ширину ненулевым значением.
Может ли кто-нибудь помочь мне понять, что я здесь делаю неправильно, или это даже правильный способ сделать это? Опять же, я просто хочу найти изображение и наложить его на SKShapeNode
. Если мне нужно сделать это с SKScene
, это нормально, мне просто нужна помощь, чтобы понять, как это сделать. Если это не лучший способ, может кто-нибудь указать мне документацию, где я могу найти решение для счетчика?
Спасибо!