#ios #swift #scenekit #augmented-reality #arkit
#iOS #быстрый #scenekit #дополненная реальность #аркит
Вопрос:
Я пишу приложение для распознавания изображений, следуя этому примеру из документации Apple: https://developer.apple.com/documentation/arkit/detecting_images_in_an_ar_experience
Пока все работает нормально, теперь я хотел бы изменить наложение прозрачной плоскости на изображение. Я устанавливаю материал плоскости следующим образом.
let image = "overlay"
let material = SCNMaterial()
material.locksAmbientWithDiffuse = true;
material.isDoubleSided = false
material.diffuse.contents = image
material.ambient.contents = UIColor.white
let planeNode = SCNNode(geometry: plane)
planeNode.geometry?.materials = [material]
Изображение загружается и визуализируется, только ему всегда не хватает цвета. Исходное изображение красного цвета, наложение черно-белое.
Я уже пробовал много разных настроек для ambient и diffuse, но безуспешно. Чего мне здесь не хватает?
Спасибо
Ответ №1:
В вашем коде следующая строка — это String
тип, а не UIImage
тип:
let image: String = "overlay"
Попробуйте следующий код:
let plane = SCNPlane(width: 10, height: 10)
let image = UIImage(named: "art.scnassets/texture")
// let image = UIColor.red
// let image = UIColor(hue: 0.25, saturation: 0.5, brightness: 0.75, alpha: 1)
let material = SCNMaterial()
material.locksAmbientWithDiffuse = true
material.isDoubleSided = false
material.diffuse.contents = image
material.ambient.contents = UIColor.white
let planeNode = SCNNode(geometry: plane)
planeNode.geometry?.materials = [material]
scene.rootNode.addChildNode(planeNode)
Кроме того, сохраните ваше изображение для diffuse
слота material в PNG
формате.
Комментарии:
1. Спасибо за ответ. К сожалению, это не имеет никакого значения. Согласно документации Apple здесь ( developer.apple.com/documentation/scenekit/scnmaterialproperty /… ) свойство content также принимает NSStrings с расположением изображений, такие же, как UIImage, UIColor и другие. Однако я заметил странное поведение. Когда я жестко кодирую местоположение изображения в коде, оно работает нормально. Если я создаю местоположение, например, из свойства referenceImages name, я получаю ту же старую проблему.
Ответ №2:
Для дальнейшего использования вот что я выяснил: изображения не должны иметь одинаковые имена, даже при сохранении в разных группах или папках. Я использовал имя изображения в качестве ссылки для загрузки наложения. Когда я изменил имя и получил ссылку вручную (с помощью переключателя / регистра), все работает просто отлично.