我的目标是能够点击特定模型并为表面着色。我已经设法使用通用 SCNSphere、SCNBox 等来做到这一点。
我是这样设置的,它基本上适用于 SCNSphere 等:
let node = SCNNode(geometry: geometry)
let material = SCNMaterial()
material.specular.contents = SKColor.init(white: 0.1, alpha: 1)
material.shininess = 2.0;
material.normal.contents = "wood-normal.png"
let skScene = SKScene.init(size: CGSize(width: SPRITE_SIZE, height: SPRITE_SIZE))
skScene.backgroundColor = SKColor.orange
skScene.scaleMode = .aspectFill
material.diffuse.contents = skScene
geometry.firstMaterial = material
scnScene.rootNode.addChildNode(node)
但是,当我加载.obj
文件并尝试使用 SKScene 设置材质时,我什么也得不到。这是我如何设置obj
let bundle = Bundle.main
let path = bundle.path(forResource: name, ofType: "obj")
let url = NSURL(fileURLWithPath: path!)
let asset = MDLAsset(url: url as URL)
guard let object = asset.object(at: 0) as? MDLMesh else {
print("Failed to get mesh from obj asset")
return
}
let material = SCNMaterial()
material.specular.contents = SKColor.init(white: 0.1, alpha: 1)
let skScene = SKScene.init(size: CGSize(width: SPRITE_SIZE, height: SPRITE_SIZE))
skScene.backgroundColor = SKColor.orange
skScene.scaleMode = .aspectFill
material.diffuse.contents = skScene
let geometry = SCNGeometry.init(mdlMesh: object)
let node = SCNNode(geometry: geometry)
node.geometry?.materials = [material]
scnScene.rootNode.addChildNode(node)
但如你所见,茶壶的颜色不是橙色
我的问题是,我在使用 SKScene 作为文件材料方面做错了什么obj
,还是我知道有一些限制?我在这上面花了几个小时,如果有人有任何想法,我愿意接受建议。
另外,在这种情况下,我如何决定 SKScene 的大小,因为我想用 SKScene 任意包裹整个网格?
更新 1
我有点想通了。我的obj
文件没有纹理坐标,只有顶点。当我尝试obj
使用纹理坐标的另一个文件时,skScene
似乎已正确加载。所以我猜我的茶壶没有 uv 坐标,所以它不能映射纹理。obj
如果文件还没有它们,有没有办法添加 uv 坐标?