我在大学里接到一个任务,要把一张图片作为纹理添加到测角八面体中。这是我在斯威夫特的第一个项目。
有很多关于带uiimage类的uikit的建议,但是我正在使用macos和nsimage类的appkit。我在网上找到的所有选择对我都没有作用。可能我误解了一些基本的东西。
首先,我把一张名为“sims.jpg”的图片拖到我的项目文件夹和art.scnassets文件夹中。还添加了file→add files到“art.scnassets”和general文件夹。对assets.xcapets什么也没做。
下面是创建形状的方式:

func createOctahedron() {

   let vertices: [SCNVector3] = [
       SCNVector3(0, 1, 0),
       SCNVector3(-0.5, 0, 0.5),
       SCNVector3(0.5, 0, 0.5),
       SCNVector3(0.5, 0, -0.5),
       SCNVector3(-0.5, 0, -0.5),
       SCNVector3(0, -1, 0)
   ]

   let source = SCNGeometrySource(vertices: vertices)

   let indices: [UInt16] = [
       0, 1, 2,
       2, 3, 0,
       3, 4, 0,
       4, 1, 0,
       1, 5, 2,
       2, 5, 3,
       3, 5, 4,
       4, 5, 1
   ]

   let element = SCNGeometryElement(indices: indices, primitiveType: .triangles)
   let geometry = SCNGeometry(sources: [source], elements: [element])
   let node = SCNNode(geometry: geometry)

   node.geometry?.firstMaterial?.diffuse.contents = NSColor.green // назначаем цвет октаэдру

   let scnView = self.view as! SCNView
   scnView.scene?.rootNode.addChildNode(node)

   let rotateAction = SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: .pi, z: 0, duration: 5))
   node.runAction(rotateAction)
}

以防我留下一个full code
所以,我要添加这样的图像
let imageMaterial = SCNMaterial()
let image = NSImage.Name("sims")
imageMaterial.diffuse.contents = image
geometry.materials = [imageMaterial, imageMaterial, imageMaterial, imageMaterial, imageMaterial, imageMaterial, imageMaterial, imageMaterial]

或者像那样?
node.geometry?.firstMaterial?.diffuse.contents = NSImage.Name("sims")

或者我应该另外绘制地图吗?请帮帮我,因为我真的不明白。xcode只输出一个旋转的八面体,没有额外的纹理,也没有错误。

最佳答案

这一行:

let image = NSImage.Name("sims")

只声明名称。你需要:
let image = NSImage(named: NSImage.Name("sims"))

编译代码的原因是contents属性的类型为Any?,因此可以在属性中放入任何旧的goo。它无声地失败了。

关于swift - 如何正确使用NSImage作为SCNGeometry形状的 Material ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55881717/

10-08 21:33