[swift] 立方体の6面それぞれに1枚づつテクスチャ画像を貼る方法
立方体の6面に異なるテクスチャを貼る方法は下記のコードの通り、
[SCNMaterial]という6つのSCNMaterialを要素に持つ配列を、ジオメトリのmaterialに設定すると6面にそれぞれ異なるテクスチャをはることができる。
override func viewDidLoad() {
super.viewDidLoad()
// sceneを作る
let scene = SCNScene()
// SCNNodeを作成
let cube = SCNNode()
// キューブ型の形状(Geometry)を生成
let cubeGeometry = SCNBox(width: 2, height: 2, length: 2, chamferRadius: 0.02)
// テクスチャのイメージのパスを指定
let textureFilePath = [
"art.scnassets/chest/chest_front",//front
"art.scnassets/chest/chest_side",//left
"art.scnassets/chest/chest_side",//back
"art.scnassets/chest/chest_side",//right
"art.scnassets/chest/chest_end",//top
"art.scnassets/chest/chest_end"//bottom
]
// テクスチャ作成関数の呼び出し
let textureMaterial = makeTexture(filenameArray: textureFilePath)
// ジオメトリにテクスチャを貼り付け
cubeGeometry.materials = textureMaterial
// ジオメトリをキューブにする
cube.geometry = cubeGeometry
// キューブの位置を指定
cube.position = SCNVector3Make(-5, 0, 0)
// キューブを配置
scene.rootNode.addChildNode(cube)
}
// テクスチャ配置関数(6つの要素を持つMaterial配列を作成する)
func makeTexture(filenameArray : [String]) -> [SCNMaterial] {
//空の配列を作成
var materials = [SCNMaterial]()
//ファイルパスからMaterial配列にそれぞれ入れ込み、もしパスが6つでなかったら、ブラウンのカラーで塗り
for i in 0...5 {
let material = SCNMaterial()
if i < filenameArray.count {
material.diffuse.contents = UIImage(named: filenameArray[i])
}else{
material.diffuse.contents = UIColor.brown
}
//配列に追加
materials.append(material)
}
//配列をreturn
return materials
}