2016-01-09 3 views
3

Я сделал 3d модель с блендером, и я хочу использовать его в наборе сюжетов.геометрия узла из файла dae nil

var platform = SCNNode(); 
let dae = SCNScene(named:"platform.dae"); 
platform = dae!.rootNode; 
platform.position = SCNVector3(x: 0,y: 0,z:0); 
if platform.geometry == nil { 
    print("geo is nil.") 
} 
platform.geometry?.firstMaterial?.diffuse.contents = "wood.png"; 
platform.geometry?.firstMaterial?.diffuse.wrapS = SCNWrapMode.Repeat 
platform.geometry?.firstMaterial?.diffuse.wrapT = SCNWrapMode.Repeat 
platform.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: SCNPhysicsShape(node: platform, options: nil)); 
scene.rootNode.addChildNode(platform); 

Он всегда печатает «geo is nil». Поэтому я не могу создать физическое тело для модели. Может ли кто-нибудь сказать мне, почему это происходит?

+0

Можете ли вы просмотреть платформу.dae в режиме предварительного просмотра? У вас есть это на корневом уровне в вашем приложении (как следует из вашего вызова) или в папке scnassets (нужно указать имя этой папки в вашем пути загрузки). Также: drop "var platform = SCNNode()" в пользу "let platform = dae? .rootNode". И вам не нужны эти точки с запятой. –

+0

dae не находится в папке scnassets, но нет никаких проблем с его печатью. Я могу даже дать ему действия, но я не могу изменить материал, или я не могу сделать физическое тело, используя его геометрию. Потому что его геометрия всегда равна нулю. – white5tone

+0

Кроме того, я попытался превратить dae в scn-файл. Но после этого приложение падает. Я думаю, dae! .rootNode возвращает nil. И да, я изменил метод инициализации как SCNScene (named: "platform.scn") – white5tone

ответ

1

Файл DAE при загрузке возвращает полное дерево узлов. Если в файле Blender есть свет и камера (что почти наверняка делает), то и дерево узлов DAE. Корень SCNNode не имеет геометрии (и нет необходимости в том, чтобы у SCNNode). Но вы можете найти детей, которые это делают.

print (platform) 
platform.childNodes.map { 
    print($0.name, $0.geometry) 
} 

производит

<SCNNode: 0x7fe008e938d0 | 3 children> 
Optional("Camera") nil 
Optional("Lamp") nil 
Optional("Cube") Optional(<SCNGeometry: 0x7fe00ab08930 'Cube'>) 

Вы можете использовать childNodeWithName() или childNodesPassingTest(), чтобы выбрать объект, который вы хотите, и добавить его в сцену.

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