2017年1月8日日曜日

three.jsで影を表示するには

影を描画する

リアルタイム3DCGでリアルな表現をさせたかったら、誰もが影をまず描画させたいと思うはずです。
本来なら必ずShader言語を記述しライトの位置から深度情報をレンダリングして、影を描画する場所の判定などをしなければいけません。
ですがThree.jsはその点凄く便利!フラグを何個か立てるだけで影の描画ができてしまいます。(!!!)
いや~Three.jsって便利ですねぇ~

順序

Rendererの設定

var renderer = new THREE.WebGLRenderer();
renderer.shadowMapEnabled = true;

Lightの設定

var light = new THREE.DirectionalLight(0xffffff, .8);
light.castShadow = true;
light.shadowMapWidth = 1024;//影の描画用テクスチャの横解像度
light.shadowMapHeight = 1024;//影の描画用テクスチャの縦解像度
light.shadowCameraNear = 1; //四角錐台の上面の位置
light.shadowCameraFar = 30; //四角錐台の下面の位置
light.shadowCameraLeft = -10;    //描画範囲左範囲
light.shadowCameraRight = 10;    //描画範囲右範囲
light.shadowCameraTop = 10;  //描画範囲上範囲
light.shadowCameraBottom = -10;  //描画範囲下範囲

影を描画したいMeshの設定(キャラクターや、木など)

var mesh = new THREE.Mesh( geometry, material );
mesh.castShadow = true;

影を落とす対象のMeshの設定(地面など)

var mesh = new THREE.Mesh( geometry, material );
mesh.receiveShadow = true;

以上です!!!!

注意点 (^o^)/

メッシュやカメラの倍率がでかすぎると、影が描画されているにもかかわらず、画面内に表示されないことがあります。
なので、もし影が表示されないときはカメラやメッシュの倍率・サイズを小さくしてみたりしてみてください。
これは本当にあるあるです。

2016年11月28日月曜日

three.jsで3Dモデルをボーンアニメーションさせるには

ボーンアニメーションとは

ボーンアニメーションとは、
3Dツールで骨のように連なる軸を基準として
それに合わせてメッシュをアニメーションさせる技法のことを言います。

three.jsでは主にBlenderという3Dソフトからアニメーションつきのthree.js用の3Dモデルを書き出すことで用意することができます。
Unityのようなゲームエンジンと違い、three.jsではBlenderファイルを放り込んだらパースしてくれるような便利な機能はありません。
ここがもっとやりやすければthree.jsももっと流行りそうなものなのですが・・・

three.jsでボーンアニメーションさせるのに必要なもの

Blender
Blenderとはオープンソースの3Dソフトのことで、以下のサイトから無料でダウンロードできます。
Blenderの公式サイトへ
Blender three.jsエクスポーター
エクスポーターとは3Dソフトから three.jsで使用できる3Dモデルを書き出すためのプラグインのことです。
three.jsをダウンロードした際に解凍したファイルの以下のディレクトリにあります。
three.js-master\utils\exporters\blender\addons\io_three

three.jsから3Dモデルを書き出す順序

  • 1.Blenderにエクスポーターをインストール
  • 2.Blenderでアニメーションモデルを用意
  • 3.Blenderからthree.js用のモデルを書き出す
  • 4.three.jsのjsonLoaderで書き出したモデルを読み込み、アニメーションを再生する

1.Blenderにエクスポーターをインストール

エクスポーターをBlenderにインストール

上に書いたようにthree.jsをダウンロードしたときに入っている以下のエクスポーターを、
three.js-master\utils\exporters\blender\addons\io_three
(io_threeのフォルダリごと)以下のディレクトリに配置(2.78はBlenderのバージョンですので、インストールしているバージョンによってかわります)
C:\Program Files\Blender Foundation\Blender\2.78\scripts\addons

Blenderを起動し、エクスポーターを有効化する

Blenderを起動し、左下のボタンでエディターのウィンドウタイプをUser Preferencesに変更する。

次に以下の画像上部メニューから「Add-ons」を選び、左の検索窓に「three」を入力しEnter、「Import-Export: three.js format」横のチェックボックスを入れる。
この設定を保存する場合は、下の「Save User Settings」をクリックする。こうすることでBlenderを再度立ち上げてもthree.jsのエクスポーターが有効化された状態になります。
これでthree.jsエクスポーターのインストールがされました。

2.Blenderでアニメーションモデルを用意

次にBlenderでアニメーションモデルを用意します。今回は割合します。
注意として、以下を気をつけてモデリングしてください。
書き出しエラーになったり、思ったとおりのアニメーションにならなかったり、やたら大きなサイズで書き出されてしまったり、やたら動作が重くなってしまう原因になります。

  • 一つのArmatureに一つのメッシュ
  • 原点は必ずx:0 y:0 z:0の位置にする
  • 3DモデルのサイズはBlenderの升目以内に入るサイズにする
  • ポリゴン数は5万以内程度
  • IKは書き出し時に無視される
  • 必ず頂点を取りこぼすことなくウェイトペイントすること

3.Blenderからthree.js用のモデルを書き出す

いよいよBlenderから3Dモデルを書き出します。
注意点としては・・・

ClearTransformする

PoseModeでボーン全てを選択後、以下の画像のようにPose→ClearTransform→Allを実行します
この工程は地味ですが、これをやらないとアニメーションがハチャメチャになることがあります。

書き出し時にObjectModeにしてメッシュを選択すること

これをやらないとエラーがでることがあります。

注意事項を読んだら早速書き出しましょう

書き出す

File→Export→Three(.json)をクリックして書き出しましょう。

書き出し設定は以下のとおりです。
※three.jsのエクスポーターはr73バージョン以降とそれ以前では違いがあります。

r73以前

r73以降

4.three.jsのjsonLoaderで書き出したモデルを読み込み、アニメーションを再生する

r73以前とr73以降ではアニメーションの実行の仕方が大幅に違い、ここが大いにはまるポイントだったりします。

r73以前

animationsというオブジェクトにアニメーションデータを格納し、play関数でアニメーションの再生をしています。
毎フレーム処理の中でTHREE.AnimationHandler.update関数を実行する必要があります。

  
var mesh;
var animations = {};

var jsonLoader = new THREE.JSONLoader();
var url = 'models/hellknight/hellknight.json';
jsonLoader.load(url, function( geometry, materials ){
  
  var material = new THREE.MeshFaceMaterial( materials );
        mesh = new THREE.SkinnedMesh( geometry, material );
        animations[ 'animName0' ] = new THREE.Animation( mesh, geometry.animations[0] );
        animations[ 'animName1' ] = new THREE.Animation( mesh, geometry.animations[1] );
  animations[ 'animName0' ].play();
});


//毎フレーム処理
function animate() {
    
    if( mesh ){
        THREE.AnimationHandler.update( .03 );
    }

}
setInterval( animate, 1000 / 30 );
  
r73以降

r73以降ではTHREE.Animationクラスが廃止され、THREE.AnimationMixerに変更されました。setEffectiveWeightはアニメーションを2つ同時に再生した場合に2つのアニメーションをどのぐらいのブレンド具合で混ぜるかを設定します。
こちらも毎フレーム処理でanimationMixer.update関数を実行する必要があります。

  
var clock = new THREE.Clock();

var mesh;
var animationMixer;

var jsonLoader = new THREE.JSONLoader();
var url = 'models/hellknight/hellknight.json';
jsonLoader.load(url, function( geometry, materials ){
  
  var material = new THREE.MeshFaceMaterial( materials );
        mesh = new THREE.SkinnedMesh( geometry, material );

        animationMixer = new THREE.AnimationMixer( mesh );
        for ( var i = 0; i < geometry.animations.length; ++ i ) {
            animationMixer.clipAction( geometry.animations[ i ] );
        }
        animationMixer.clipAction( 'animName0' ).setEffectiveWeight( 1 ).play();
});


//毎フレーム処理
function animate() {
    
    var delta = clock.getDelta();
    if( animationMixer ){
     animationMixer.update( delta );
    }

}
setInterval( animate, 1000 / 30 );
  

編集後記

three.jsでのアニメーション再生の流れをざっと説明しました。如何でしたでしょうか。おそらく多くの人がつまづくのはBlenderとthree.jsの連携だと思います。
今までhtmlやjavaScriptだけ書いていればよかったのが、急に3Dソフトを使う必要があり、しかもそれが癖のあるBlenderとなれば少し躊躇してしまうかもしれません。
しかし、three.jsはwebGLのコードを直接書くのに比べかなり簡略化されており、それに比べればかなり楽にはなっているとは思います(シェーダーも触る必要がありませんし・・・)
3Dコンテンツを作る以上、3Dソフトとの連携はUnityなどの環境でも必ず必要になっているので、やっといて損はないかと
さくっと説明するつもりがかなり長くなってしまった・・・

2016年7月2日土曜日

testテスト

h4 えいち4

テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

h5 えいち5

テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

ボタン ボタン
ボタン
h6 えいち6

テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

  • てすと0
  • てすと1

2013年12月20日金曜日

2013年11月25日月曜日

fireFoxでFlashPlayerが異常に重たい場合

ニコニコ動画のテキスト入力や、
マウスイベントで動作がカクカクするあなた。
flashPlayerのセーフモードをオフにしたら解決。
セキュリティ的にはあまりよくない模様。

環境:fireFox25 flashPlayer11.9

参考 - http://fushigineko.jugem.jp/?eid=466

2013年11月24日日曜日

Unity3d : iTweenを使う上での注意点

■FadeToでモデルをフェードアウトさせたい場合
・シェーダーがTransparent(透明)になっていないと使えない。




■oncomplete(コールバック関数)に関して
たとえばhogeManager.jsといった管理系のスクリプト内で以下のようなコードを記述した場合・・・

iTween.RotateTo( player, { "rotation":targetRotation, "time":.5f, "transition":"easeOutCubic", "oncomplete":"compHandler" });

この場合はhogeManager.js内のcompHandlerという関数が実行されるのではなく、
playerにaddComponentされたスクリプト内部のcompHandlerが実行される。

この部分は2年ほど前Unityを触り始めたころに
FlashやjavaScriptになれている人ほどハマりやすいところだと思ったのでここに記す。
みなさんにこれを伝えたかった。

Flash stage3dでのATFについて

■ATFってそもそも何? 
・FlashのiPhoneアプリ、Androidアプリ、windowsアプリ、macアプリ、FlashPlayerなど各プラットフォームごとに最適なテクスチャを保持すことができるファイルフォーマットらしい。(今後はFlash以外にも展開されるのかな?)

・取り入れれば簡単にfpsが向上する・・・というわけではなく、主に起動時の初期化の負荷を下げることができるらしい。(起動時間の短縮)
初期化には負荷がかかる(これはUnityやHTML5コンテンツも同じ)ので、低スペックな環境でアプリを立ち上げた時に突然落ちるといったことの改善につながる。

・windowsはコマンドプロンプト、macではターミナルでATF作成の作業をする。(後述のATFGeneratorを使えばUI上での作業も可能)


■ATF作成方法(windowsの場合) 
・ まずは ATF SDKをダウンロード - https://dl.dropbox.com/u/7009356/atftools.zip

・作業ディレクトリにpng2atf.exeを配置する必要がある

・コマンドプロンプトを起動して対象ディレクトリに移動
「dir」でディレクトリの情報を表示
「pushd ××××」で対象のディレクトリに移動

・以下のコマンドを入力
png2atf -i 対象ファイル名.png -o 出力ファイル名.atf


■わざわざコマンドプロンプトやターミナルを使わないといけないの?
ATFGeneratorというAIR製のツールを使えば簡単にATFを作成できる模様


■書き出したATFを実際にAway3dで使う場合
・away3d 4.1.4では最新のatfToolから書き出したatfでエラーが出るため、こちらのコードでATFData.asを上書きする必要がある。


■参考サイト

・コマンドプロンプト上でのatfToolの解説 - http://www.adobe.com/jp/devnet/socialgaming/articles/atf-users-guide.html
 
・ATF SDK の公開 - http://cuaoar.jp/2012/10/atf-sdk.html
 
・ATF SDKを使った圧縮テクスチャの使い方入門 - http://www.adobe.com/jp/devnet/socialgaming/articles/introducing-compressed-textures.html
 
・コマンドプロンプトのコマンドの解説 - http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/