Почему SCNLights работает со встроенной геометрией Apple, а не с файлами OBJ или DAE? - PullRequest
0 голосов
/ 13 октября 2019

Я весь день изо всех сил пытался заставить свои SCNLights работать над моими моделями сцены. У меня есть SCNNode, где SCNLight проецирует источник света типа .spot в игре.

Когда я использую встроенный в Apple SCNBox и подсвечиваю объекты (на изображении оранжевого цвета), освещение настраивается соответствующим образом. Тем не менее, при использовании моей собственной модели (зеленая трава) освещение НЕ подходит, независимо от используемой битовой маски. Как придешь? Что мне нужно изменить в моем коде, чтобы мои модели реагировали на битовую маску соответствующим образом?

Я пробовал это с файлами OBJ, DAE и SCN (перейдя в Редактор -> Преобразовать в формат файла SceneKit), и все они создают одну и ту же проблему. Сначала я подумал, что мои битовые маски были проблемой, но они отлично работают на примитивных моделях Apple, но не на моих.


Orange Cuboids Grass


Код для оранжевых кубоидов:

//These few lines sit in a class called "Tile," which contains an SCNNode called "grass"

let grassGeo = SCNBox(width: 0.3, height: 0.6, length: 0.3, chamferRadius: 0)
            grassGeo.materials.first!.diffuse.contents = UIColor.orange
            self.grass.geometry = grassGeo
            self.grass.position = SCNVector3(0, 0, 0)
            self.grass.categoryBitMask = Constants.bitMask.tile
            self.addChildNode(self.grass)

Код для модели травы

self.grass = SCNNodeFromDAE(filePath: "testgame.scnassets/Models/t_grass/t_grass.dae")
            self.grass.scale = SCNVector3(1, 1, 1)
            self.grass.position = SCNVector3(0, 0, 0)
            self.grass.categoryBitMask = Constants.bitMask.tile
            self.addChildNode(grass)

Код для SCNNodeFromDAE:

func SCNNodeFromDAE(filePath: String) -> SCNNode {
        guard let s = SCNScene(named: filePath) else { fatalError("Failed to find DAE file.") }
        let n = SCNNode()

        for i in s.rootNode.childNodes {
            n.addChildNode(i as SCNNode)
        }

        return n
    }

ОБНОВЛЕНИЕ: Согласно предложению @ Локка, я обнаружил, что свет, приложенный к камере моей сцены, освещает узлы, однако я использую битовые маски, которые должны дать мне желаемый результат. Я неправильно их настраиваю / использую? Вот код настройки камеры и моя структура битовой маски в файле с именем «Константы»:

func setupCamera() {
    cam = SCNNode()
    cam.camera = SCNCamera()
    cam.eulerAngles = c.camAngle
    cam.light = SCNLight()
    cam.light!.type = .omni
    cam.light!.color = UIColor.white
    cam.light!.intensity = c.cam_l_intensity
    cam.light!.categoryBitMask = Constants.bitMask.usr //ONLY light the user
    scn.rootNode.addChildNode(cam)
}

А вот код битовой маски:

struct bitMask {
    static let usr:Int = 0x1 << 0 //1
    static let tile:Int = 0x1 << 1 //2
}
...