2016-01-04 3 views
2

У меня есть массив объектов SCNPlane, и я хочу добавить разные изображения к каждому. Моя проблема в том, что всякий раз, когда я инициализирую SCNPlanes в цикле for, каждая плоскость будет иметь то же самое изображение. Вот что мой цикл в основном выглядит следующим образом:Невозможно использовать несколько изображений для массива SCNPlane

var layer = [CALayer](count: 8, repeatedValue: CALayer()) 
var tmpPhoto = [CGImage]() 

for var i = 0; i < 8; ++i{ 
    tmpPhoto.append("image data") 
    layer[i].contents = tmpPhoto[i] 
    layer[i].frame = CGRectMake(0, 0, "image width", "image height") 

    //initialize the SCNPlane and add it to an array of SCNNodes 

    plane[i].geometry?.firstMaterial?.locksAmbientWithDiffuse = true 
    plane[i].geometry?.firstMaterial?.diffuse.contents = layer[i] 

    //add SCNPlane constraints 
} 

То, что я заметил, что изображение, отображаемое будет последним изображением, которое было добавлено/изменено. Я знаю это, потому что после этого цикла я попытался изменить первую запись в массиве плоскости. Во время выполнения изображение для первой записи массива будет отображаться на всех остальных SCNPlanes! Имейте в виду, что я вообще не использую displayLayer() или setNeedsDisplay().

Вот что я попытался:

  • с использованием аналогичного переменным слоя вместо массива, и просто модифицировать его в начале каждого цикла
  • переменных
  • манипула слоя вне цикла
  • прямое добавление в UIImage без преобразования в CGImage (я знаю, что каждое изображение загружается в массив)
  • пытается изменить слой SCNPlane непосредственно
  • с использованием SCNM aterial variable (после this, но с одним слоем, добавленным к переменной материалов для каждого SCNPlane)
  • добавление слоев в существующие структуры представлений с использованием либо addSublayer() (не работает), либо layoutSublayersOfLayer() (сбой приложения из-за неперехваченное исключение)

Могу ли я упустить что-то важное?

EDIT: Забыли номер.

ответ

2

Создайте вместо этого SCNPlane для каждого SCNNode. Если вы создадите один SCNPlane для нескольких узлов, то они будут делиться геометрией. Установка материала в геометрии изменит все узлы, которые используют эту геометрию.

+0

Ваш пост дал мне хорошую идею. Я переместил объявление для геометрии для SCNPlane в самый верх цикла for. Добавьте в метод SCNMaterial, и теперь все работает. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^