Как добавить SKScene в плоскость SCNNode? - PullRequest
0 голосов
/ 16 апреля 2019

Я закончил учебник 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, это нормально, мне просто нужна помощь, чтобы понять, как это сделать. Если это не лучший способ, может кто-нибудь указать мне документацию, где я могу найти решение для счетчика?

Спасибо!

1 Ответ

1 голос
/ 16 апреля 2019

Это потому, что ширина и высота в size здесь let size = imageAnchor.referenceImage.physicalSize равна нулю.

1004 * Размер вы получаете будет physicalSize вы установите для эталонного изображения, которые уверены, что составляет менее 1 метра.Поэтому, когда вы используете это как размер для skScene, вы создали его с размером по высоте и ширине равна нулю 1008 * Например:. Если ваше эталонное изображение имеет физический размер 10х15 см, ваш sizeбудет иметь ширину 0,1 и высоту 0,15., которая будет изменена на ноль.

Рекомендую:

let physicalSize = imageAnchor.referenceImage.physicalSize
let size = CGSize(width: physicalSize.width * 1000, height: physicalSize.height * 1000)
...