Текстура изображения в SCNMaterial всегда серая. Как применить цвет?

#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:

Для дальнейшего использования вот что я выяснил: изображения не должны иметь одинаковые имена, даже при сохранении в разных группах или папках. Я использовал имя изображения в качестве ссылки для загрузки наложения. Когда я изменил имя и получил ссылку вручную (с помощью переключателя / регистра), все работает просто отлично.