0

我的目标是能够点击特定模型并为表面着色。我已经设法使用通用 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 坐标?

4

0 回答 0