[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        
    }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です