如何以编程方式在 SceneKit 中围绕立方体包装 png 纹理
How to programmatically wrap png texture around cube in SceneKit
我是 SceneKit 的新手...尝试让一些基本的东西工作但到目前为止没有太大成功。出于某种原因,当我尝试将 png 纹理应用于 CNBox 时,我最终只得到黑色。这是我在 viewDidLoad:
中的简单代码片段
let sceneView = (view as SCNView)
let scene = SCNScene()
let boxGeometry = SCNBox(width: 10.0, height: 10.0, length: 10.0, chamferRadius: 1.0)
let mat = SCNMaterial()
mat.locksAmbientWithDiffuse = true
mat.diffuse.contents = ["sofb.png","sofb.png","sofb.png","sofb.png","sofb.png", "sofb.png"]
mat.specular.contents = UIColor.whiteColor()
boxGeometry.firstMaterial = mat
let boxNode = SCNNode(geometry: boxGeometry)
scene.rootNode.addChildNode(boxNode)
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
它最终看起来像是黑色背景下黑色立方体反射的白色光源。我错过了什么?感谢所有回复
只有 reflective
material 属性 和场景的 background
.[=12= 支持传递图像数组(以创建立方体贴图) ]
在您的情况下,所有图像都是相同的,因此您只需将图像(而不是数组)分配给内容,让它出现在框的所有侧面
如果你有不同的图像,你可以从每个图像构建一个不同的 SCNMaterial 对象,如下所示:
let material_L = SCNMaterial()
material_L.diffuse.contents = UIImage(named: "CapL")
这里的CapL指的是一个保存在项目Assets.xcassets文件夹中的.png文件。构建 6 个这样的对象后,将它们交给 boxNode,如下所示:
boxGeometry.materials = [material_L, material_green_r, material_K, material_purple_r, material_g, material_j]
请注意 "boxGeometry" 最好命名为 "box" 或 "cube"。此外,最好在项目的新 class 中完成这项工作,其构造如下:
class BoxScene: SCNScene {
然后您将在 viewController 的 viewDidLoad 方法中使用现代 Swift 调用,如下所示:
let scnView = self.view as! SCNView
scnView.scene = BoxScene()
(为了使 let 语句起作用,转到 Main.storyboard -> View Controller Scene -> View Controller -> View -> Identity icon 然后在 Custom Class 下,将其从 UIView 更改为SCNView。否则,您会收到一条错误消息,例如:
无法将类型 'UIView' 的值转换为 'SCNView'
我是 SceneKit 的新手...尝试让一些基本的东西工作但到目前为止没有太大成功。出于某种原因,当我尝试将 png 纹理应用于 CNBox 时,我最终只得到黑色。这是我在 viewDidLoad:
中的简单代码片段 let sceneView = (view as SCNView)
let scene = SCNScene()
let boxGeometry = SCNBox(width: 10.0, height: 10.0, length: 10.0, chamferRadius: 1.0)
let mat = SCNMaterial()
mat.locksAmbientWithDiffuse = true
mat.diffuse.contents = ["sofb.png","sofb.png","sofb.png","sofb.png","sofb.png", "sofb.png"]
mat.specular.contents = UIColor.whiteColor()
boxGeometry.firstMaterial = mat
let boxNode = SCNNode(geometry: boxGeometry)
scene.rootNode.addChildNode(boxNode)
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
它最终看起来像是黑色背景下黑色立方体反射的白色光源。我错过了什么?感谢所有回复
只有 reflective
material 属性 和场景的 background
.[=12= 支持传递图像数组(以创建立方体贴图) ]
在您的情况下,所有图像都是相同的,因此您只需将图像(而不是数组)分配给内容,让它出现在框的所有侧面
如果你有不同的图像,你可以从每个图像构建一个不同的 SCNMaterial 对象,如下所示:
let material_L = SCNMaterial()
material_L.diffuse.contents = UIImage(named: "CapL")
这里的CapL指的是一个保存在项目Assets.xcassets文件夹中的.png文件。构建 6 个这样的对象后,将它们交给 boxNode,如下所示:
boxGeometry.materials = [material_L, material_green_r, material_K, material_purple_r, material_g, material_j]
请注意 "boxGeometry" 最好命名为 "box" 或 "cube"。此外,最好在项目的新 class 中完成这项工作,其构造如下:
class BoxScene: SCNScene {
然后您将在 viewController 的 viewDidLoad 方法中使用现代 Swift 调用,如下所示:
let scnView = self.view as! SCNView
scnView.scene = BoxScene()
(为了使 let 语句起作用,转到 Main.storyboard -> View Controller Scene -> View Controller -> View -> Identity icon 然后在 Custom Class 下,将其从 UIView 更改为SCNView。否则,您会收到一条错误消息,例如:
无法将类型 'UIView' 的值转换为 'SCNView'