3dsmax でレイヤーが表示されなくなったときの対処法

ある日、.maxファイルを開いたらあったはずのレイヤが全部無い!という事態に遭遇したことはありますか? 私はあります。焦りますよね。しかもなんだかおかしな状態になっていて、全オブジェクトが規定値レイヤーにあるのではなく、レイヤーマネージャーから見えない状態になっている。焦りますよね。パンツを履いていたはずなのにいつのまにかすっぽんぽんだったぐらい焦ります。

ちょっともったいぶりますが、これの原因は、おそらくですが、3dsmax 2015で搭載されたネストレイヤーではないかと思います。ネストレイヤーというのはレイヤーを親子付けして、レイヤーの中にレイヤーがある、という構造を実現したものです。これとても便利なのですが、便利な新機能というのはだいたい実装された当初はバグが付きものです。3dsmaxも例外ではないというか、むしろ3dsmax にはよくあるというか…。

実装された最初のバージョンである2015にはいろいろとこのネストレイヤー付近に怪しい動きがありました。私がこれまで経験したところによると、2014以前のバージョンで保存されたネストのないレイヤー構造のものを2015以降のバージョンで開いたときに、レイヤー情報が全部なくなる、という現象が発生しやすいようです。(これまで見たケースはほとんど全部これだと思います)

何が起きているのか

結論から言うと、これはレイヤー情報がなくなったのではなく、レイヤー情報はあるけれどレイヤーマネージャに表示されない、という状態です。レイヤーがなくなったシーンデータでオブジェクトを選択し、下記のコマンドでそのオブジェクトの所属しているレイヤーを確認すると、ちゃんと存在しているのです。

$.layer

そこで、これを復元するスクリプトを用意しました。

失われたレイヤーを取り戻すスクリプト

function recoverLostLayers = (
	local lm = layermanager
	for o in objects do (
		local l_name = o.layer.name
		local ly = lm.getLayerFromName l_name
		if ly == undefined do (
			ly = lm.newLayerFromName l_name
		)
		ly.addNode o
	)
)

再利用しやすいように関数にしました。

せっかくなので少しコードの解説をすると、すべてのオブジェクトに対し、そのオブジェクトが所属しているレイヤー名の情報を取得し、そのレイヤをレイヤーマネージャで取得することを試みます。

ここでその名前のレイヤーを取得できない場合(レイヤーマネージャが把握できていない場合)、新たにその名前のレイヤーを作成し、そこに該当するオブジェクトを格納する、という動作です。

一応下記からスクリプトファイルをダウンロードできるようにしました。上記の関数を定義したあと、その関数を呼び出すというコードになっています。このスクリプトファイルを実行すればレイヤーの復元が行われます。

これでもう、ある日突然レイヤーが全部消失しても焦らずに済みますね。

っていうか消失すんなよ…