Archives

エロ駆動型Unity+MMD+Oculus Rift その1 既存のエロコンテンツまとめ

私は激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。私にはUnityが分からぬ。私は、一介のオナニストである。マスをかき、息子と遊んで暮らしてきた。けれでも規制に対しては、人一倍に敏感であった。きょう未明私はOculus Riftを手に入れ、Runtimeを入れファームウェアアップデートをして、愕然とした。

とは言ってもエロコンテンツが無いわけじゃない。例えば最近鳴り物入りで発売したPlayGirlsというやつがある。しかし体験版をやってみてみな一様に感じていることと思う。

違う、そうじゃない

と。

まだ仮想空間は(解像度的制限により)記号空間として認識されてしまう。記号空間であるからにはアニメ・漫画キャラクターこそが唯一絶対の正義なのである。化粧をしなければ男性と代わり映えしない顔面容姿であるところの三次元人間が仮想空間入りしたところで、「セカンドライフじゃねーんだから(冷笑)」とこれにはメロスも呆れ顔である。

一方でMikulusは素晴らしい。よもや自分が初音ミクに見つめられてドキドキしようなどとは夢にも思わなかった。(どちらも@GOROman先生だけど)

かようなエロをもっと!わっふるわっふる!という気持ちでいっぱいだが、残念ながらそれは叶わない。

PCLだ。

クリエイターができないこと
宣伝や広告のために二次創作物を使うこと
他の人の作品を、自分のものだと偽って使うこと
キャラクターの価値を下げるような使い方をすること
他の人を不快にさせ、または傷つけるために二次創作物を使うこと

piapro(ピアプロ)|ピアプロ・キャラクター・ライセンス(要約)

いや、分かる。みんなが楽しくコンテンツを制作する環境に秩序が必要だということは。

とにかく問題は、PCLのもとではR-18コンテンツは暗めのグレーゾーンっぽいということだ。

またボカロでなくとも、MMDの製作者様側で規約を設定されている場合もある(MMDモデルデータ付属の”Readme.txt”や”よんでね.txt”などに記載)。

だとすれば答えは一つ。

自分で作る

である。何人も個人利用に制限をかけることは出来ない。メロスが走ることを制限することは出来ないのだ。

というわけで次回からUnity + Oculus + MMDでの作り方を書いていきます。実体は無くとも、型だけが語り継がれる「日本的なるもの」をみんなで作ろう。(文化的発言)

今回は、既に存在する「そっち方面のコンテンツ」を紹介するにとどめておきます。

無料コンテンツ

not R-18

R-18

有料コンテンツ

 

次回予告

こういうのを作る

スクリーンショット_120814_124419_AM

Three.jsでobjファイルをアップロードして操作

できました!(画像クリックで飛びます。ロードは長い。)

「ファイルを選択」で.objか.mtlをアップロードしていきます。.mtlのみはムリです。

最初は某住宅が表示されますのでいじってみてください。

ソースコードはこちら。php使ってるのでサーバ必要です。

******

アップロードするってことはobjファイルが私の手に渡りますので、それが嫌な方はソースコードを落としていじってください。

******

なんに使えるかっつーとビミョーだなー。細かい話はまた追加します。

Three.jsのOBJMTLLoaderで影を描画

Three.jsはとても便利な関数が用意されていて、OBJMTLLoader = three.js-master/examples/js/loaders/OBJMTLLoader.js もそのひとつです。

<script src="three.js-master/examples/js/loaders/MTLLoader.js"></script>
<script src="three.js-master/examples/js/loaders/OBJMTLLoader.js"></script>

でインクルード(って言うの?)。

んで、とりあえずobj(3DCGファイルの方)を表示させてみたんだが、影が描画できない。

影の描画のやり方はググれば出てくるが、端的に言えば

  • レンダラの設定:renderer.shadowMapEnabled = true;
  • オブジェクトの設定:cube.castShadow = true; cube.receiveShadow = true;
  • ライトの設定:light.castShadow = true; light.shadowCameraVisible = true;

が必要になる。

lightはTHREE.SpotLightじゃないとダメとかいろいろややこしいが、なんとかできた。

だけど、cubeとかプリミティブには影が付いてるけど、OBJMTLLoaderで読み込んだオブジェクトはできてない。あとPlaneGeometryもなぜか影が計算されない。

 

まず、planeに影が描画されない方は公式に解答がありました。

要は

renderer.shadowMapCullFrontFaces = false;

を加えなさいと。

で、肝心のOBJMTLLoaderの方。読み込みはexampleのwebgl_loader_obj_mtl.htmlに従って

var objPath = "files/Sanple.obj";
var mtlPath = "files/Sample.mtl";

var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
    var object = event.content;
    object.position.x = -1000;
    object.position.z = 1000;
    object.castShadow = true;
    object.receiveShadow = true;
    scene.add( object );
});
loader.load( objPath, mtlPath );

みたいな感じにしていたのですが、これではダメなようで、OBJMTLLoader.jsを見てみるとloaderが返す値はどうやらオブジェクトの配列?のようなもののようでした。

そこで、OBJMTLLoader.jsの207行目以降の関数finalize_mesh( group, mesh_info )に次のように追加しました。

function finalize_mesh( group, mesh_info ) {
    mesh_info.geometry.computeCentroids();
    mesh_info.geometry.computeFaceNormals();
    mesh_info.geometry.computeBoundingSphere();
    var tmpMesh = new THREE.Mesh( mesh_info.geometry, mesh_info.material );
    // 以下2行を加える
    tmpMesh.castShadow = true;
    tmpMesh.receiveShadow = true;
    group.add( tmpMesh );
}

できた!

でもよく見るとなんかおかしい。影になってるはずのところがなんか光ってる。

しばらく考えて、最初のコレ

renderer.shadowMapCullFrontFaces = false;

のせいだと気づき、コメントアウトすると、ちゃんと表示されました。

影の計算で、最初の面を無視しますよってのがデフォルトでtrueなんだけど、それをfalseにしちゃうと面で構成されたモノがちょっとおかしくなるかもよってことだろう。

デモスクリプトはもうちょっとだけ追加するもん追加してからにします。

OpenGL(freeglut)ラッパーつくったよー

ここに上げてます。

github初公開レポジトリです。

win/mac/linいけます。openGL素晴らしい。

winではcygwinがfreeglutがなぜかダメだったのでvisualstudioで使って下さい。
あとmacもfreeglutがうまくいかないので、OpenGLWindow.cppの61行目”glutMouseWheelFunc(mouseWheelFunc)”をコメントアウトして下さい。
macports用のMakefileになってるので通常のmacでやりたい方は書き換えて下さい。

linはubuntu12.04で動作確認。でもvirtualbox上だからかもしれんがマウスホイールを拾ってくれませんでした。

とりあえず使い方は、

・OpenGLBase.cppの変数DIMENSIONを変えると平行投影、遠近法が切り替わります。(2で並行、3で遠近)
・同じくOpenGLBase.cppのmain内のwindowコンストラクタの引数でウインドウサイズと背景色決定(width, height, DIMENSION, red, green, blue)
・描画はDrawerクラスのdraw関数内に。
・時間変化はDrawerクラスのupdate関数内に。

・q or ESCで終了。
・sでアニメーションスタート。
・マウスホイール使えない時もzでズームイン、xでズームアウト。

だいたいこんな感じです。
ただのみんな持ってるラッパークラスなので機能は無いです。

詳しいこととか改善はまた気が向けば。

f:id:Drunkar:20120602051311p:image
謎すぎるサンプル画像。

netbeansでC++でOpenGL(GLUT)を動作させるまで

いままで初心者なりにvc++でコーディングをしていたのですが、windowsに特化した環境に慣れてしまうのはどうもなあ、と思ったのでとりあえず人気と言われるIDEのnetbeansを使ってみることにした。その導入の備忘録です。

まず、netbeansのサイトに行ってnetbeansをダウンロード&インストール。c++入のやつ。

それで次はcygwinのダウソ&インスコ。環境変数PATHにC:cygwinbinを追加。
ここで重要なのはOpenGL, GLUT関係のものと、X11をインストールすることと、すでにBorlandのC++コンパイラとかをインストールしている場合は、環境変数PATHに、C:borlandbcc55binよりも前にC:cygwinbinを置くこと。でないとErrorになります。

ここでnetbeansのツール>オプション>C/C++を見て

ベースディレクトリ:C:cygwinbin

Cコンパイラ:C:cygwinbingcc.exe

C++コンパイラ:C:cygwinbing++.exe

アセンブラ:C:cygwinbinas.exe

makeコマンド:c:cygwinbinmake.exe

となっていることを確認してください。

そしてnetbeansでC++アプリケーションを作って<GL/glut.h>をincludeして、ここで左上のウインドウのプロジェクトフォルダ(名前を付けなければCppApplication_1となるやつ)を右クリック>プロパティ>リンカー>ライブラリ>ライブラリを追加でGL.dllとかGLUT.dllとかglutを追加します。(ライブラリは通常C:cygwinlibにある)

あと、これが一番大事ですが同じく右クリック>実行>環境の、名前にDISPLAY、値に:0.0を追加します。これをしないとfailed to open display ‘ ‘というエラーが出ます。

そしてC++コードを実行する前に、スタートメニューに登録されていると思われるXWin Serverを起動し、タスクバーにアイコンが表示されていることを確認します。

これで、netbeansでOpenGL(GLUT)が実行できるはずです。winとmacとlinuxを使いこなせるね!(使いこなせたらいいな!)