Apple Engine

Apple, iPhone, iOS, その周辺のことについて

iOS で SceneKit を試す(Swift 3) その85 - SceneKit で 2D ライブラリ SpriteKit の SKTexutre をテクスチャとして使用する

今まで SCNMaterial が持つ SCNMaterialProperty の content で UIImage を設定し、テクスチャを決めていたが SpriteKit の SKTexutre を設定することができる。

 

SKTexutre を適応してみる

いつも通り、Xcode の Game テンプレートで SceneKit を選択し作成。 GameViewController.swift を開く。

以下のコードを追加して、宇宙船のマテリアルの Normal に SKTexutre としてしたの画像を適応してみた

f:id:x67x6fx74x6f:20170901190955p:plain

let shipMesh = scene.rootNode.childNode(withName: "shipMesh", recursively: true)!
let normalTexture = SKTexture(imageNamed: "cloud.png")
shipMesh.geometry?.firstMaterial?.normal.contents = normalTexture
shipMesh.geometry?.firstMaterial?.normal.intensity = 1.0

 

UIImage と同様に Normal Map の画像に最適化されていないため、おかしな表示になっている。

f:id:x67x6fx74x6f:20170901191048p:plain

 

SKTexutre から Normal Map を作成する

SKTexutre には generatingNormalMap() という通常の画像を Normal Map に変換するメソットがある。

 

先ほどのコードの変更して試してみる。

変更前

shipMesh.geometry?.firstMaterial?.normal.contents = normalTexture

変更後

shipMesh.geometry?.firstMaterial?.normal.contents = normalTexture.generatingNormalMap()

 

機体に雲模様のノーマルマップが適応されているのがわかる。

f:id:x67x6fx74x6f:20170901191239p:plain

 

一応、端末で変換するため、Normal Map を他のアプリケーションで作成できるのであれば、事前に行って画像を作成しておいた方が全体の処理が軽くなる。

 

generatingNormalMap について

ちなみに generatingNormalMap には generatingNormalMap(withSmoothness:contrast:) というメソッドもあり、滑らかさとコントラスト設定できる。

また、SKTexutre の generatingNormalMap は、Model I/O の MDLTexture の機能を使用している。

SCNMaterialProperty の content は MDLTexture や Metal の MTLTexture を読み込むことができるので、より複雑なことが可能ではある。

 

今回はここまで。