2015年12月31日木曜日

今年もお世話になりました

今年の前半はRLが忙しくてイン時間が短かくて、0時過ぎにようやくイン出来るということも多かったので、一人で過ごしていることが多かった感じでした。

長いSL人生の中では、そういう時期ももちろんあります。

でもそういう時期は必ず過ぎて、ゆっくり出来る時も絶対来ますので、それを信じて、それはそれとして過ごしていました^^


今年の後半、ようやくRLが落ち着いて、夜から朝までイン出来るという昔のような生活が出来るようになりました。

ゆったりしたSL生活を満喫するのはもちろん、せっかく出来た時間なので、しばらくお邪魔出来ていなかったところにもお伺いしたりと、出会いや再開もある日々でした。

そんな中で、大切な人と巡り合い、パートナーになることが出来ました。
おかげで、今はすごく落ち着いた時を過ごすことが出来ています。

いろんなことがあった一年でしたけれど、すごく幸せです^^

今年も本当にお世話になりました。
来年もよろしくお願いいたします。
このエントリーをはてなブックマークに追加

2015年12月24日木曜日

セカンドライフ公式ビュアー バージョン 4.0.0 が公開されました

セカンドライフ公式ビュアー バージョン 4.0.0 (309247) が公開されました。

セカンドライフ公式サイトのダウンロードページからダウンロード出来ます。

Downloads | Second Life

今回のバージョンでは、Valhalla ビュアーの内容が公式ビュアーに取り込まれました。

天使になりたくて: セカンドライフビュアー内蔵の HTML レンダリングエンジンを、WebKit から CEF に変更する「Valhalla」プロジェクト

セカンドライフビュアー内蔵の HTML レンダリングエンジンが、WebKit から Chromium Embedded Framework (CEF) へと変更されました。


WebKit

chromiumembedded / cef   - Bitbucket

セカンドライフビュアーでは、下記の部分などで HTML レンダリングエンジンが利用されています。
  • Web プロフィール
  • 検索
  • 行き先ガイド
  • ビュアー内のアバターの選択画面
  • 内蔵 Web ブラウザ(ヘルプでのサイトの表示、マーケットプレイスの表示など)
  • プリムでの Web コンテンツの表示(HTML on Prim)


これらは、外部の Web ブラウザを通して表示されているのでは無くて、セカンドライフビュアーに内蔵されている HTML レンダリングエンジンで描画が行われています。

セカンドライフビュアーの中に Web ブラウザの機能が内蔵されていて、そこで描画されたものがセカンドライフビュアーの画面上にも表示される…という仕組みです。

Chrome や Safari などの外部の Web ブラウザがインストールされているかどうかや、そのバージョンなどを気にしなくても、Web のコンテンツを共通の見た目で確実に描画出来るため、こういう仕組みが用意されています。


セカンドライフビュアーでは、これまで下記の HTML レンダリングエンジンが使用されていました。

ビュアーのバージョンHTML レンダリングエンジンHTML レンダリングエンジンを使用している Web ブラウザ
1.xMozillaFirefox
2.xWebKitSafari
3.xWebKitSafari

今回それが、Chrome で使用されている HTML レンダリングエンジン「Chromium Embedded Framework」に変更されました。


 HTML レンダリングエンジンが CEF になって変わったところは、下記の点です。
  • HTML5 対応
  • 最新の JavaScript エンジン(V8)対応
  • WebGL 対応
公式ビュアー バージョン 3.x までで採用されていた Webkit は古いバージョンだったため、HTML5 には対応していませんでした。
このため、最近主流の HTML5 向けのサイトは正しく表示されないことがあるなど、Web ブラウザとしては使いにくい状態が続いていました。

また、Flash Player の仕様変更のため、Mac OS X では Flash のコンテンツが描画されないという大きな問題も抱えていました。

天使になりたくて: セカンドライフで動画を見る方法

天使になりたくて: Mac 版セカンドライフビュアーで Flash のコンテンツが見れない原因

こういった部分が、今回 CEF に変わったことで全て解決しました^^/

さらに、Web で 3D の表現を実現する「WebGL」も表示出来るようになりましたので、Web の 3D コンテンツをセカンドライフで楽しむことも出来るようになりました。


もちろんこれらは、プリムでの Web コンテンツの表示(HTML on Prim)でもその恩恵を受けることが出来ます。


今後は、セカンドライフのような世界と Web の世界が、今まで以上に繋がっていく可能性があります。
CEF は、その掛け橋をより強固にするためのものです。


ただし今のところは、プロフィールなどで表示される内容は従来のままです。
CEF に変わったということで、見た目に分かる変化は今のところはまだありません。

この辺は、サードパーティービュアーでの CEF の対応状況の関係もありますので、すぐに大きな変化が出てくることは考えにくいと思います。
その辺が解決したら、もしかすると今よりずっとモダンな表示に変わるかもしれません。


CEF では Web ブラウザのプラグインの機能は当初サポートされない予定だったのですが、最終的に Flash の表示はデフォルトでオンになることになったそうです。

CEF での Flash Player は WebKit の時とは違い、PPAPI 版の Flash Player が必要です。

How to use Adobe Flash in Second Life Viewer 4.0 a... - Second Life

ただしこれは、Flash のコンテンツの作成を推奨するものでは無いそうですので、既存の Flash で作られたコンテンツは、HTML5 への移行を進められた方がいいと思います。


内部的には非常に大きな変更にあたりますので、ビュアーのバージョンは、

4.0.0

へとステップアップしました。

セカンドライフビュアーも、とうとうバージョン 4 の時代です^^


わたし個人的には、インワールドのテレビで YouTube などの動画が Mac でもまた見れるようになったのがすごくうれしいです。


Mac で動画が見れなくて困っていらっしゃった方にとっては、待望のバージョンアップです^^
このエントリーをはてなブックマークに追加

2015年12月23日水曜日

SIM のあるサーバーのクラスの調べ方

この記事は、「セカンドライフ技術系 Advent Calendar 2015」の記事です。

セカンドライフ技術系 Advent Calendar 2015


今回の内容は、扱っている題材自体は“誰得?”って突っ込みがありそうな内容なんですけれど…w、
技術系としては気になるよね?という内容だと思いましたので、記事にしてみました。

実は、下記の記事を書いている際に、気になって調べていた内容を別途まとめたものです^^

天使になりたくて: プライベート SIM の初期費用値下げ、「Grandfathered(適用除外)」SIM の譲渡費用改定が発表されました

概要

セカンドライフの SIM は、リンデンのサーバー上で動いています。
リンデンのサーバーは常に同じスペックでは無くて、時々見直しが行なわれ、その時々の最適なスペックに更新が行われています。
そのサーバーのスペックに応じて、“クラス”という種別があります。

2015 年 12 月 23 日現在、最新のクラスは「クラス 8」です。


サーバーのクラスの情報は、一般のユーザー向けには公開されていません。

これは、SIM を新規購入すると最新のクラスのサーバーが割り当てられて、その後も随時新しいクラスへのアップグレードが自動的に行われていくからです。

Moving away from server Class - Second Life

しかし、昔からある SIM の中には、古いクラスのままのところもあるようです。

プライベート SIM

Class 5344
Class 78205
Class 87791
Class 不明1458

リンデンの SIM

Class 518
Class 71291
Class 85554
Class 不明248

2015年 12 月 20 日現在

New SL Sims in past week - Page 94 - SLUniverse Forums

クラスごとのサーバーのスペックは、下記のようになっているようです。

CPUコア数メモリ最大収容可能 SIM 数
(フルリージョン)
最大収容可能 SIM 数
(ホームステッド)
Class 4Opteron 2702 コア2GB2 SIM-
Class 5Xeon 51484 コア4GB4 SIM16 SIM(1コア 4SIM)
Class 7Dual Quad Xeon8 コア24GB8 SIM32 SIM(1コア 4SIM)
Class 8不明

このため、古い SIM を譲渡してもらう場合などの場合は、サーバーのクラスがどうしても気になってしまうことがあるかもしれません。

そんな時のために、今回は SIM のあるサーバーのクラスを調べる方法をご紹介します^^

Second Life Grid Survey

一番手っ取り早く調べる方法それは、セカンドライフの SIM の情報を集めているサイト「Second Life Grid Survey」で調べることです。

Second Life Grid Survey

サイトの「Region Search」欄に SIM 名を入力して「Search」ボタンを押すと、その SIM の情報が表示されます。

ここでは、リンデンの SIM のひとつである Linden Estate Services SIM を検索してみましょう。


検索結果の中の「Physical visit survey details」の「Server Class」が、サーバーのクラスです。



現在は、801 となっています。

これは、クラス 8 のサーバーであることを表しています。

つまりこの SIM は、2015 年 12 月時点での最新のスペックのサーバー上で動いているということになります。

801 の最初の数字が、クラスの番号です。

クラスの番号の後ろの「01」の部分は、同じクラス内のバージョン違いを表しているそうです。

例:701、702、703

Second Life Grid Survey は、リンデンラボが公開している情報ではありません。
セカンドライフのユーザーの Tyche Shepherd さんが運用しているそうです。
またその情報は不定期に更新されているようですので、最新の状態を表しているとは限りません。
その辺は注意が必要です。

Radegast


テキストベースの軽量ビュアーとして人気の Radegast ビュアーには、SIM の情報を表示する機能が標準で用意されています。

Radegast Metaverse Client · Lightweight client for connecting to Second Life and OpenSim based virtual worlds

Radegast でログイン後、チャットの入力欄に「//siminfo」と入力することで、現在いる SIM の情報をチャット欄に表示することが出来ます。


「CPU class」の部分が、現在の SIM のあるサーバーのクラスの情報です。

これは現時点のリアルタイムのサーバーの情報ですので、Second Life Grid Survey ではまだ取得されていない最新の状態も表示することが出来ます。

libOpenMetaverse

サーバーのクラスの情報は、.NET(C#)用のライブラリ libOpenMetaverse でも取得することも出来ます。

libOpenMetaverse は、セカンドライフビュアー相当の機能を C# のプログラムから利用出来るようにしたライブラリです。

libopenmetaverse - libomv - Developer Wiki

openmetaversefoundation/libopenmetaverse · GitHub

libOpenMetaverse を利用すると、セカンドライフビュアーや Bot などのプログラムを作成する際、セカンドライフのサーバーとの通信などの部分を libOpenMetaverse にお任せすることが出来ます。
ややこしい通信の手続きの処理などを、自分で一から作る必要はありません。

先ほどご紹介した Radegast ビュアーも、libOpenMetaverse を使って作られています。


libOpenMetaverse の NetworkManager クラスの CurrentSim プロパティで、現在の SIM の情報が取得出来ます。
その情報の中の「CPUClass」が、サーバーのクラスの情報です。

CurrentSim Property

では実際に、libOpenMetaverse を使ってサーバーのクラスの情報を取得してみましょう。

using System;
using System.Collections.Generic;
using System.Text;
using OpenMetaverse;

namespace SakuraNoel
{
    //
    // GetServerClass クラス
    //
    class GetServerClass
    {
        // クライアントオブジェクト
        private static GridClient Client;

        static void Main(string[] args)
        {
            // クライアントオブジェクトを作成
             Client = new GridClient();

            // ログを出力しない
            Settings.LOG_LEVEL = Helpers.LogLevel.None;

            // ログイン処理
            if(Client.Network.Login("アカウントの名", "アカウントの姓", "パスワード", "SampleBot", "1.0"))
            {
                // ログインした場合

                // サーバーのクラスを表示
                Console.WriteLine("CPU Class: {0}", Client.Network.CurrentSim.CPUClass);

                // ログアウト
                Client.Network.Logout();
            }
            else
            {
                // ログイン出来なかった場合
                Console.WriteLine("Login Error!: {0}", Client.Network.LoginMessage);
            }
        }
    }
}
GetServerClass.cs

このプログラムでは、サーバーに接続して、接続した SIM のクラスの情報を表示したあと、すぐにログアウトします。
いわゆる“Bot”のような挙動をするプログラムです。

プログラムを実行すると、

CPU Class: 801

といった結果が表示されます。

libOpenMetaverse を使うとこのように、C# から簡単に SIM のクラスの情報が取得出来ます。

リアルタイムにクラスの情報を取得することはもちろん、こういった情報を元に Second Life Grid Survey のようなサービスを作成することも可能です。

C++

libOpenMetaverse でサーバーのクラスが取得出来るのなら、通常のビュアーでも同様の方法で出来るんじゃないの?と思われたかもしれません。

libOpenMetaverse やその他のサードパーティビュアーは、セカンドライフの公式ビュアーのソースを元に作成されています。

公式ビュアーのソースファイルは、オープンソースプロジェクト「Snowstorm」として公開されています。

Project Snowstorm - Second Life Wiki

正式リリースされている公式ビュアーのソースファイルの他に、現在開発中の様々なプロジェクトビュアーのソースファイルも公開されています。
誰でも自由に、その内容を閲覧することが出来ます。

そのソースファイルを見ていくと、公式ビュアー内にも、libOpenMetaverse と同様にサーバーからクラスの情報を取得している部分が見つかります。

indra/newview/llviewerregion.cpp の LLViewerRegion::unpackRegionHandshake() が、その部分です。

lindenlab / viewer-release   / ソース  / indra / newview / llviewerregion.cpp - Bitbucket

ここでは、SIM とのハンドシェイクの際に、接続した SIM 固有の情報を取得しています。
その処理の中で、サーバーのクラスの情報も取得されています。

msg->getS32     ("RegionInfo3", "CPUClassID",  classID);

サーバーのクラスの情報自体は取得されているのですが、公式ビュアーではこの情報はユーザーの目に見える形では提供されていません。
ビュアーにサーバーのクラスの情報を表示する UI を作ってみたいと思われた方は、この辺を元に挑戦してみてください。

また、C++ で自分で直接サーバーのクラスの情報を取得したいという方も、llviewerregion.cpp などの内容は参考になると思います。


いかがだったでしょうか?

サーバーのクラスを調べたいという疑問を調べていくと、ビュアーの仕組みの部分までたどり着いてしまいました。
技術系としては興味深い内容だったのではないでしょうか?

今回は“サーバーのクラスを調べてみたい”というところからでしたけれど、他のことでもこうやって調べていくと、実は意外な解決方法が見つかるかもしれません。

技術系としてはそういう探求も楽しい部分だと思いますので、なにか気になったことが出てきた時は、ぜひいろんな面から調べてみてください^^

このエントリーをはてなブックマークに追加

2015年12月16日水曜日

LSL に新機能「llGetObjectDetails(OBJECT_OMEGA)」が追加されました

LSL(Linden Script Language)に新機能が追加されました。

Release Notes/Second Life Server/15 - Second Life Wiki

llGetObjectDetails() 関数に、OBJECT_OMEGA 定数が追加されました。

LlGetObjectDetails - Second Life Wiki

LlGetObjectDetails のフラグに OBJECT_OMEGA を指定すると、オブジェクトの回転速度を取得することが出来ます。

取得出来る値は、llTargetOmega で設定された値(vector)です。

LlTargetOmega/ja - Second Life Wiki

OBJECT_OMEGA で取得出来る値は、llGetOmega で取得出来る値と同じです。

LlGetOmega/ja - Second Life Wiki

オブジェクトの回転速度を取得するだけなら llGetOmega でも取得出来ますが、llGetObjectDetails ではオブジェクトの他の値と一緒に取得出来るのが特徴です。

llGetObjectDetails でオブジェクトの名前/位置/回転速度を一度に取得した例

list info = llGetObjectDetails(llGetKey(), [OBJECT_NAME, OBJECT_POS, OBJECT_OMEGA]);

スクリプトの処理を簡潔にまとめたい場合に、便利な新機能だと思います^^
このエントリーをはてなブックマークに追加

2015年12月8日火曜日

軽くて崩れないメッシュの作り方 ーマテリアル編

この記事は、「セカンドライフ技術系 Advent Calendar 2015」の記事です。

セカンドライフ技術系 Advent Calendar 2015


前々回の「ポリゴン数編」、前回の「LOD 編」で、軽くて崩れないメッシュの作り方をご紹介してきました。

今回は、メッシュはもちろん、プリムでも描画を軽くする方法をご紹介します。


ポリゴン数を削減することは、メッシュを軽くする基本的な要素です。

しかし同じポリゴン数でも、マテリアルの設定次第では、描画の負荷が高いプリムやメッシュが生まれてしまいます。


アバターの描画の負荷「描画ウェイト」の計算方法として、下記の資料があります。

Mesh/Rendering weight - Second Life Wiki


ベースのアバター

1000 ポイント
(ただし、ベイクされたテクスチャーを非表示にする毎に -200 ポイント)

ベースコスト

プリム、スカルプテッドプリム、メッシュのポリゴン数に応じたポイント

プリム毎に乗算

グロー1.5 倍
凸凹1.25 倍
フレキシ5.0 倍
輝き1.6 倍
インビジブルプリム1.2 倍
リグ入りメッシュ(Rigged Mesh)1.2 倍
テクスチャマッピング1.0 倍(負荷無し)
アニメーションテクスチャー1.4 倍
アルファ4.0 倍

追加

パーティクルプリム毎に 100 ポイント
ライトでの発光プリム毎に 500 ポイント
メディア面毎に 1500 ポイント
リンク先で別のテクスチャーを使っている場合+ 256 + 16 * (resX/128 + resY/128)


実はこれはアバター特有のものでは無くて、ビュアーで表示されるものすべてに同様に影響する内容です。


3D の世界では、ポリゴンは「シェーダー」と呼ばれる GPU 用の特別なプログラムで一枚一枚描かれていきます。

シェーダー - Wikipedia

シェーダーでは、ポリゴンの形を設定したり、ポリゴンの色などを設定したりします。

シェーダーに、ポリゴンの色やテクスチャーなどのデータを渡したりして、素材の“材質”を設定出来るようにしたものが、マテリアルです。


セカンドライフビュアーでは、編集ウインドウの「材質」の項目がマテリアルにあたります。


ポリゴンを単色に塗ったりテクスチャーを貼るくらいなら、描画の負荷はほぼ無視出来るくらいの負荷なのですが、アルファやグローなどの特別な表示を行なおうとすると、それらを描画するための複雑な処理が必要になりますので、その分負荷がかかります。

ポリゴン一枚での負荷は小さなものですが、それが何万枚、何十万枚と集まると、FPS に影響するほどの重さになってしまいます。

セカンドライフでも同様に、マテリアル(シェーダー)の設定次第では描画が重くなってしまうことがあります。

特に描画の負荷が高いのは、

フレキシ 5 倍

アルファ 4 倍

です。

これは、マテリアルにテクスチャーを貼り付けていない状態の単色のプリム(メッシュ)との描画の負荷の比較の値です。


フレキシは、通常のプリムをアバターの身体のようにグニャグニャ動くようにする仕組みです。
「フレキスブルパス」や「フレキシブルプリム」とも呼ばれています。


フレキシは、マテリアルの機能では無いのですが、描画の負荷という意味では関連する項目ですので、ここでは一緒にご紹介します。

フレキシは、そのグニャグニャ動くようにする変形処理もビュアー側でリアルタイムに計算が行なわれます。
そのため、描画をするための処理が非常に重くなってしまいます。

風になびく髪やスカート、森の木々などは、見た目はすごくいい感じなのですが、実は描画的にはすごく重いものだったのです。

フレキシが設定出来るのは、プリムだけです。
メッシュでは使用することは出来ません。
メッシュにフレキシが導入されなかったのは、描画の負荷が高すぎるためだそうです。

ですので、プリムでも出来るだけ使わない方がいいのですが…、
見た目の効果は非常に高いものですので、どうしても必要な場合には、ここぞというところワンポイントに使うのがいいと思います。


一番よく使っていて、一番意外に思われそうなのが、アルファです。

ここでの“アルファ”は、プリムの透明度はもちろん、テクスチャーの中の透過度(アルファチャンネル)も含まれます。

プリムの透明度

テクスチャーの中の透過度(アルファチャンネル)

アルファは、向こう側が透けるという処理が必要です。
そのため、まず最初に奥側を描いて、その後に手前側を描くといった処理が必要になります。

その処理が、山のようにオブジェクトがある SIM やアバターなどの間で行われますので、通常よりも複雑な処理になってしまいます。

半透明なものの向こうに半透明なものがあって…ということも珍しくありませんしね。

また、そういう複雑な処理を行なっているためオブジェクトの表示位置などによっては、前後関係がおかしくなってしまったり、チラつきが起きてしまうことがあります。

このため 3D の世界では、アルファは

鬼門

と呼ばれて、本当に必要なところ最小限または多少破綻しても大丈夫なところ(パーティクルなどのエフェクト)に使われるのが一般的です。

ところがセカンドライフでは、アルファは日常的にいろんなところに使われているんですよねw

建物などのガラスはもちろん、森の木々やアバターの髪、パーティクルなどなど…

特にプリム製の髪は、透明度のあるテクスチャーを貼ったプリムをたくさん使って作られていますので、描画の負荷が非常に高くなっていることがあります。
プリム製の髪でアバターの描画ウェイトの数値が高いことがあるのは、そういう理由です。

神秘的な景色のところでよく見かける、オブジェクトにアルファとグローを掛けた表現も、


(ベースコスト x (アルファ 4.0 倍+ グロー 1.5 倍)) x プリム数

と、描画的の負荷的には意外と高いものになります。

きれいなアバターや景色だけど表示が重いなーっと感じた時は、ポリゴン数以外に、マテリアルの負荷も確認してみてください^^


「そんなこと言われても、
オブジェクトのマテリアルの負荷って、
どうやって調べるの?」

マテリアルの負荷そのものを見ることは、残念ながらセカンドライフビュアーでは出来ませんが…、
それらを使っているオブジェクトの表示をオン/オフ出来る機能がビュアーにはあります。

それは、アドバンスメニューにある「レンダリング(種類)」です。


「====」の部分をクリックすると、メニューから切り離しが出来て便利です^^


「レンダリング(種類)」では、下記の項目の表示のオン/オフが出来ます。
  • シンプル
  • アルファ
  • アバター(フレキシブルプリムやそれらにリンクされたオブジェクトも含む)
  • 地表
  • 地面
  • ボリューム
  • パーティクル
  • 凸凹(バンプ)
各項目をオン/オフすると、セカンドライフの世界の中でその項目が使用されている部分を、表示したり消したり出来るようになります。

その際、アドバンスメニューの「パフォーマンスツール」にある「統計バー」で、FPS の値を確認してください。

オン/オフした時の FPS の差が大きければ大きいほど、描画の負荷が高いということになります。

通常の表示
アルファを使用しているオブジェクトを非表示にした際の表示
FPS が 6 増加している点に注目!

普段見ている景色のどこが描画の負荷が高いのか、ポリゴン数の負荷も含めた状態を、これで細かくチェックすることが出来ます。

これは、プリムでも、ユーザーがアップロードしたメッシュでも同様です。
この方法で、身の回りの描画の負荷が大きいオブジェクトを見つけてみてください。


“アバターの描画ウェイト”が登場した頃にはまだなかった概念として、
  • ノーマルマップ
  • スペキュラマップ
があります。


Get the New Materials Viewer Today! - Second Life

この二つのことを“マテリアル”と呼ぶことがありますが、実際にはこの二つは“マテリアルに追加された機能”です。


ノーマルマップは、低ポリゴン(ローポリ)でも細かい装飾を表現したい場合に使われる手法です。

ポリゴン数を増やさずに、テクスチャーを使って細かい造形を表現します。
細かい造形にはライティングの効果も反映されますので、従来のバンプマップよりもリアルな造形表現が可能になります。

スペキュラマップは、テクスチャーで指定した部分の輝き度合いを自由に設定出来る手法です。
ライティングの効果も反映されますので、従来の「輝き」よりもリアルな金属などの表現が可能になります。

これらは、オブジェクトの表現力を大幅に向上させてくれます。

そのかわり、

高度なライティングモデル

を有効にしないと見ることが出来ません。

※影は有効になっている必要はありません

高度なライティングモデルでは、従来のプリム含め全てのオブジェクトが、高度なライティング処理によって表示されるようになります。
高度なライティングモデルをオンにすると、画面全体の質感が変わるのは、この影響です。

具体的には、シェーダーが高度なライティング用のものに切り替わります。
そのため、見た目がよりリアルになる一方、全体的に従来の表示よりも描画の負荷がかかってしまうようになります。

ただし、「高度なライティングモデル」がデフォルトで有効になるのは、グラフィック設定が「高」以上の場合です。
また、「高度なライティングモデル」はユーザーが自由にオフにすることも出来ますので、描画の負荷が高いなっと感じる方は、デフォルトで有効になっていたとしても、オフに変更しているかもしれません。

このため、全ての人に影響することが前提の“アバターの描画ウェイト”の方では、考慮されていないのかもしれません。

ただし、描画の負荷は通常よりも掛かるものですので、ノーマルマップやスペキュラマップの表現を使用される場合は、その辺も考慮された方がいいと思います。

また、「高度なライティングモデル」の設定をオフにしていると、ノーマルマップやスペキュラマップの表現は全く表示されませんので、表示されない場合でも雰囲気が壊れないようなテクスチャー作りの方も、考慮された方がいいと思います。




3回にわたって、軽くて崩れないメッシュの作り方を紹介してきました。
いかがだったでしょうか?

今回書いてきました“軽くて崩れないメッシュの作り方”という内容は、セカンドライフだけの方法ではありません。
他の 3D の環境でも同じですので、これを覚えておけば、他のところでも活かすことが出来ます。

来年は、次世代プラットフォーム「サンサール」が登場する予定になっています。
そこでは、セカンドライフよりずっと品質の高い物づくりが要求されるかもしれませんので、今のうちにこういった作り方に慣れておかれるといいと思います^^
このエントリーをはてなブックマークに追加

2015年12月7日月曜日

軽くて崩れないメッシュの作り方 ーLOD 編

この記事は、「セカンドライフ技術系 Advent Calendar 2015」の記事です。

セカンドライフ技術系 Advent Calendar 2015


前回は、軽いメッシュを作るために、

ポリゴン数を減らそう!

という方法をご紹介しました。

しかしそれだけでは、プリムと同等の軽さにはなりません。

「え?プリムと同等のポリゴン数にしたのに、なんで?
前回の話は嘘だったの!?」

いえいえ、そうではありません^^

実はプリムでは、LOD 用の適切なモデルも設定されているので、描画が軽いんです。


LOD というのは、Level Of Detail の略です。

LOD の機能が無い 3D 空間の場合、1万ポリゴンで作ったオブジェクトは、カメラの目の前にあっても、すごく遠くにあって画面上は1ドットでしか表示されない状態であっても、1万ポリゴンとして描画されます。

見た目上潰れていても、3D の描画の処理上は1万ポリゴンは1万ポリゴンなので、同じ場所に1万回ポリゴンが描画されます。

これって、すごく無駄ですよね?

オブジェクトが一つだけならまだいいかもしれないですけれど、たくさんのアバターや SIM 内の建築物、様々なオブジェクトがあって、そういうものが遠くにもたくさんあるとしたら、どうでしょう?

描画の無駄がありすぎますよね?

遠くにあるものは簡略化して描画出来れば、もっともっと早くなるはずです。

それを実現する仕組みが、LOD です^^




LOD は、カメラからオブジェクトまでの距離によって、表示するモデルを切り替える技術です。



“モデルを切り替える”

というところが大事です。

セカンドライフのサーバーやビュアーが、リアルタイムに勝手にモデルを書き換えて減らしてくれるわけではありません!
ここ重要!!!


プリムの場合、3段階の LOD が用意してあります。

無加工の Cube の場合、カメラからオブジェクトが遠ざかるにつれて、

1段階目:108ポリゴン 
2段階目:48ポリゴン 
3段階目:12 ポリゴン

という風にポリゴン数が変化していきます。

遠くになればなるほど描画の負担が少なくなって、その分たくさんのオブジェクトを表示出来るというわけです。

みなさんがアップロードするメッシュでもこれと同じことをすれば、プリムと同等の軽さにすることが出来ます^^


メッシュの LOD の設定は、メッシュのアップロード画面で行ないます。
公式ビュアーでは、「描画詳細度」という名称の項目が LOD の設定画面です。


セカンドライフでは、ユーザーがアップロードするメッシュの LOD は4段階あります。
描画詳細度の「高」「中」「低」「最低」のところが、LOD を設定するところです。

アップロード用に選択したモデルは、自動的に「高」に割り当てられます。
それ以外のレベルの LOD は、デフォルトでは自動設定(自動的に生成)されるようになっています。

このままアップロードしてもいいですし、「三角形の限度数」の値を調整して、自分好みのポリゴン数の LOD を設定しても大丈夫です。

この辺は、メッシュをアップロードされている方なら、普段やられていることですね。

少ないポリゴン数
適切な LOD

これで、軽いメッシュのアップロードが出来ました。
めでたしめでたし^^


「軽くなったのはいいけど、この方法だとメッシュ崩れるのよ!
そこはどうなってるの?」

そうなんです!

メッシュのお悩み二点目、

メッシュは崩れちゃう!

ここの解決方法を次にご紹介します。


そもそも、メッシュはなんで崩れちゃうんでしょう?

「セカンドライフのビュアーがメッシュを表示する際に、
リアルタイムの計算誤差とかで崩れちゃうんじゃないの?」

ブッブー!
ハズレです^^


メッシュが崩れる原因、それは、

適切な LOD 用のモデルが設定されていないから

です。

LOD で大事なことって何でしたか?

そう、

“モデルを切り替える”

です。

LOD では、リアルタイムにポリゴンの削減処理が行なわれているのではありません。

カメラからオブジェクトまでの距離が一定の範囲を超える毎に、

次の LOD のモデルに切り替えている

だけです。

次の LOD のモデル…、そう、メッシュのアップロードの画面にあった「中」「低」「最低」のモデルです。

これらのレベルの LOD のモデルは、実は何も設定していない状態、

生成

の時も、アップロードの際にそれらのモデルが自動生成されて、一緒にアップロードされています。

「中」「低」「最低」それぞれのモデルが、あらかじめ作られている状態です。

もしそこでモデルが崩れている状態になっていた場合、崩れたモデルがそのままアップロードされてしまいます。

つまり、メッシュが崩れるというのは、

崩れたメッシュのモデルをアップしているから

なんです!

LOD というのは、あらかじめ用意したモデルを切り替えるだけの仕組みですので、LOD に適切なモデルが用意されていないと、このようなことも起きてしまいます。


セカンドライフビュアーで LOD 用のモデルを自動的に作ってくれる機能では、
  • プログラムによるポリゴンの自動削減処理のため、ユーザーが意図した減らし方をしてくれない
  • オリジナルの頂点数が既に少なすぎる場合も、無理に LOD を作ろうとしてメッシュが崩れてしまう
ということが起きる場合があります。

これが、メッシュが崩れる原因です。


「え?なに?それって、
セカンドライフビュアーで、
LOD 用のモデルを自動的に作ってくれる機能が
原因ってこと?」

そうです!

「じゃあどうしたらいいの?
ポリゴン数を減らしたモデルを別に作って、
それをアップロードしたらいいの?」

はい、その通りです。
それが、崩れないメッシュを作る、唯一の方法です!


メッシュのアップロード画面で、「高」と同様に「中」以下も「ファイルからロード」の項目を選ぶことで、自分が作ったモデルを LOD 用としてアップロードすることが出来ます。


そうすれば、セカンドライフビュアーではあらかじめ用意されたモデルを切り替えるだけですので、崩れることはありません。


LOD 用のモデルを作る際に注意が必要な点は、下記の部分です。

3D ソフト側のマテリアルの数/名前は、
全ての LOD 用モデルで同じにしておく

これが揃っていないと、

モデルの材料は参考モデルのサブセットではありません。
material of model is not a subset of reference model

というエラーが出てアップロードが出来ませんので、その点だけ注意してください。

ちなみに、マテリアルが同一であれば、メッシュや UV は LOD のレベルごとに全然違う形状になっていても大丈夫なようです。

これで、軽くて崩れないメッシュが出来ました。
めでたしめでたし^^


「ちょっとまって!
崩れないのは分かったけど、
4種類の LOD 用のモデルを
それぞれ一から作るのは大変すぎない?」

はい、ごもっともです。

実は Blender にも、ポリゴン数を自動で削減する機能があります。

それは、「Decimate モディファイア」です。

Doc:JA/2.6/Manual/Modifiers/Generate/Decimate - BlenderWiki

Blenderモディファイア(Decimate)





Decimate モディファイアを使うと、セカンドライフビュアーのポリゴンの自動削減機能のようにポリゴン数を簡単に減らすことが出来ます。

セカンドライフビュアーの自動削減機能と違うのは、
  • Blender のオブジェクト毎に Decimate モディファイアを適用出来る
  • Decimate モディファイアを適用したあと、修正したい場所があれば、その場で直すことが出来る
という点です。

Decimate モディファイアでもメッシュが崩れてしまうことはありますが、崩れた部分をその場で修正出来るというところが、大きな特徴です。

もちろん、手作業で修正する手間は掛かりますが、LOD 用の 4 種類のモデルを全部一から作るよりは、ずっと手間は省けます。
ぜひ試してみてください。


もともと「最低」レベルのポリゴン数で作ってあるようなモデルの場合は、LOD 用のモデルを別途用意する必要はありません。
その場合は、「中」「低」「最低」に「上記の LoD を使用」を設定するだけです。


これで、自動設定ではポリゴン数が少なすぎて崩れていたモデルも、カメラが遠くにあってもきれいに表示されるようになります。

左:LOD を自動設定にして崩れてしまったもの
右:「上記の LoD を使用」を設定したもの

ただしこの方法はあくまでも、LOD 用にもうこれ以上ポリゴンが削減出来ないモデルの場合のみ行なってください。



LOD 用の低ポリゴンモデルを作成する際は、SIM 全体の環境を考慮して、可能な限り少ないポリゴン数で表現するようにしてください。

円柱も、一番遠い LOD では“箱”にしちゃうくらいさっぱりした表現にしても、遠くにあるものですからそんなに気付かないと思います。

作り手側としては、遠くにあるものも出来るだけきれいに見せたい…という気持ちもあるとは思いますが、

ポリゴン数=パソコンの描画の負荷

に直結しますので、そこは可能な限り抑えるようにしてください。
そうしていけば、メッシュで作っていても快適な環境になるはずです。



どうですか?
重い、崩れると言われているメッシュですけれど、メッシュが悪いわけじゃないのが分かりましたよね?^^

「軽くなりましたし、崩れなくなりましたし、
これで完璧ですね!」

実は、もう1点あります。

「え?」

長くなっちゃいましたので、それは次回のお楽しみにー^^/
このエントリーをはてなブックマークに追加