てんちょーの技術日誌

自分がつまづいたこととかメモ

頭の悪いHMDのレビューをしてみる

はじめに

Oculus Rift Advent Calendar 2016の2日目です。

qiita.com

昨日は桜花一門さんのAllumetteが素敵な理由でした。

docs.google.com

N回目のVR元年ということで、いろいろHMD(Head Mount Display)が出てきました。

気付いたらうちにもたくさん生えてきました。

ということで、これらのHMDのレビューでもしようかと思います。

と言ってもだいたいのレビューはあちこちですでになされているので、別の観点からします。

題して

一番寝心地のいいHMDはどれだ選手権!!

f:id:shop_0761:20161119060017j:plain

すでに皆さんも一度は被って寝落ちしているかと思いますし、僕自身も手元にあるHMDを被ったまま(意図して)寝たことがあります。 ですが改めて記事になっているものはなかったので、チャンスだと思いました。

注)別に各HMD、コンテンツを批判したいわけではありません。どれもいいものですし、お世話になってます。

事前知識

VRについて全くわからない方はこちらのリンクとかを見てみるといいかもです。一つ目の動画は割りとイメージつかみやすいかも。

www.moguravr.com

www.moguravr.com

www.moguravr.com

www.youtube.com

www.youtube.com

評価

評価方法

実際に被って寝(落ち)ます。メガネかけてます。

Rift以外はヘッドホンを使います。

実験時間は寝てから起きるまで。最近あまり長く寝れないことが多いのでだいたい2-3時間です。

(そもそもほんとに眠いときは準備する気になれない)

評価基準

  1. 起きたときの没入感
  2. 寝返りのうちやすさ
  3. コンテンツの寝やすさ
  4. 被った状態での後頭部へのやさしさ
  5. 総合評価

をそれぞれ5段階で評価します。かなりアレなやつは☆になります。

結果

Rift

Mikulusの場合

mikulusについてはこちら。

www65.atwiki.jp

膝枕をしてもらうかのように調整してみました。 他にもたくさんやっている方がいるので、写真は割愛します。

この辺でも覗いてみてください。

twitter.com

起きたときの没入感 ★★★★

目を開けたら目があった。 びっくりした。

寝返りのうちやすさ ★★★★

ヘッドホンが付いているので便利。 しかも軽いのがいいですね。

あまりゴロゴロするとヘッドホンの部分が壊れてしまいそうなので、おとなしくしてました。

コンテンツの寝やすさ ★★★★★

あの これ 呼吸音と心拍音がいい感じに落ち着く感じ非常に良い…

こう看取られてる気分ですね…(看取られたい

被った状態での後頭部へのやさしさ ★★★★★

Riftの後頭部のつくりは以外にもクッションが効いてて、あまり違和感がありませんでした。

後頭部にもセンサーがあるそうなので、これを使ってなにか作れないかなとか思ったり。

総合評価 ★★★★

最初は寝るのにちょうどいいコンテンツを思いつかなくてVirtualDesktopにでもしようかと思ったらMikulusがよさそうだったので選びました。

参考:

store.steampowered.com

目をつぶってしまえば現段階での呼吸音の違和感もなにもなく快適でした。

というか呼吸音と心拍音が聞こえるだけの音声を聞けばいいのではという意見は受け付けません。

目を開けたらそこにいると思えるほうがいいのです。はい。

Riftだとメガネが厳しいHMDなので、そこさえなんとかなれば(というか被ってしまえば)意外とお布団でも使えることがわかりました。

HTC Vive(Pre)

The lab 丘の場合

The labについてはこちら。

store.steampowered.com

丘で横になったときはこんな感じ。鳥が飛んでます。

f:id:shop_0761:20161130230355p:plain

起きたときの没入感 ★★★

起きて外した時にあれ部屋が狭い…?っと軽く思うくらいには没入していたようです。

まあ曇り空なんですが。

寝返りのうちやすさ ★★

ちょっと重いので頭が持って行かれます。出来なくはないですね。イヤホンにしたらもっといいかも。

コンテンツの寝やすさ ☆

Thelabの丘で寝ると上で鳥が飛んでいます。いい感じに環境音があって快適…かと思いきやタイミングやら位置やらが悪かったのか例のロボット犬が周囲で暴れまくっています。

いやあの、ほんと戯れる分にはいいんですよ… 寝るのにはうるs…(めっちゃギュインギュインしてた

ロボット犬 On/Offできると嬉しい。

被った状態での後頭部へのやさしさ ★★★★

Viveだと後頭部からまっすぐコードが伸びてます。

f:id:shop_0761:20161120151847p:plain

このためコードのことを思うと頭の下にそのままコードがくることになると思います。このためちょっと違和感があるかなという感じでした。

工夫次第でよくなるかもって感じです。

総合評価 ★★★

ぱっと思いついたコンテンツがコレだったのですが、犬が…犬が…という思いで完全に失敗しました。

といっても、他にこういうのが思いつかなかったのでオススメが知りたいです。

Viveは以前VirtualDesktopをしながら寝ていたこともあるのですが、如何せん重い…首が疲れます。

寝ているとそれは多少軽減されるのですが、ちょっとでも動くとぐいっと持っていかれる感じがします。

PSVR

サマーレッスンのひかりちゃんの部屋のベッドの場合

サマーレッスンについてはこちら。

summer-lesson.bn-ent.net

ベッドの上に座った感じ

f:id:shop_0761:20161130225448p:plain

ベッドに寝っ転がった

f:id:shop_0761:20161130225506p:plain

起きたときの没入感 ★

そもそも寝れなかった 頭痛すぎ。

寝返りのうちやすさ ★

プレイエリアの外に出ると目を開けた時に気が散ってしまうので、なかなか動けません。 ヘッドホンをしているとさらに動けないです。イヤホンにしたらいいかも。

しかも全体的に大きめなので壊しそうであまり動けない。

コンテンツの寝やすさ ★★

まあ確かに誰かがいる部屋で寝てる感は出てるっぽいので、ぼちぼち。

どのタイミングで寝るかに迷うかも。(教えてる時、ハンコを押す前、押した後)

今回はハンコを押した後にしましたが、突然話しかけてきたりしてビビります。

教えてるときはBGMがかかってしまうのでやめました。ので、ハンコを押す前がいいかも。

場所を調整するのがかなり難しかったです。 なかなかベッドの位置に移動出来ないし(当たり前)、低すぎると暗転してしまいます。

被った状態での後頭部へのやさしさ ☆

良くない これは頭が痛い 後頭部のパーツが痛すぎる。

他のは薄めのバンドだったのにこれだけやたらしっかりしてるせいで、 寝っ転がった時にこの後頭部のパーツにばかり力がかかって痛い。

そのせいではずした後に頭が痛くなってしまった。

f:id:shop_0761:20161129023239j:plain

総合評価 ★

PSVRは寝るのに挑戦したのは3回ほどあります。一度だけ座椅子にもたれかかって寝ることに成功しましたが、 今回のように布団や床で寝ることを想定すると後頭部の出来のよさが仇になってしまっています。

後1回はAmazonPrimeVideoでアニメを見ていました。結局後頭部の痛みが気になり寝るにねれない状況でした。 よっぽど疲れている、眠い状況であれば寝付けるかもしれませんが、数時間でこのダメージなので ちょっと怖いですね…

番外編 GearVR + GalaxyS6 edge

niconicoVRの場合

info.nicovideo.jp

起きたときの没入感 ★★★

まあ単に動画を見ていただけなので、特にやべえコレ みたいなことにはなりませんでした。

寝返りのうちやすさ ★★★★★

これは超いい ほんとにいい モバイルの良さを思い知らされました。

なにより軽い。余計なコードがない。寝返りがうてる。こんなに違うものかと…

思わずゴロゴロ転がってしまいました。

コンテンツの寝やすさ ★★★

眠くなる動画とか見ればいいのでは 終了。

被った状態での後頭部へのやさしさ ★★★★★

こいつもやわらかバンドなので違和感は無いに等しい。 頭が痛くないのはいいことですね。

総合評価 ★★★

手元にあってすぐ試せるniconicoVRにしてみましたが、割りとパフォーマンスがいいのか 3時間くらい持ちそうです。一回も落ちてないっぽい。2時間半くらいで100%→28%だった。

正直GearVRなので寝ろと言わんばかりに熱くなっておしまいかと思ったら 長持ちしてびっくりしました。

余談ですが、起きてからGear VR Cooler!(物理)と題して、雪を詰めた袋をくっつけるだけの 記事を書こうかと思いましたが5秒でやめました。

参考: itachinx.hatenablog.com

考察

ということで、今回はRiftが一番良さそうという結果になりました。 ヘッドホンよりイヤホンがいいかもと思ったので完全に選択ミスですね。動けない。

一応どのHMDでも(AmazonPrimeVideoのような)映像を見るだけのものが出来ますが、せっかくなら いいところでお昼寝したいです。欲を言えば寝ても覚めても被って生活したいです。

UE4で言えばKiteDemoのマップは寝心地よさそうな気がします。

参考: www.youtube.com

また今回は扱わなかったハコスコなどのモバイル系は一晩も使えないのがネックですね。

ダンボールだと固定できないので、どうしてもという場合のみアロンアルファで顔にくっつけてください。

参考

http://www.hashiyansoft.com/contents/dc/death.html

hacosco.com

これからはVR Nevangelist(寝バンジェリスト)とでも名乗ってみようかな!!

ぜひこの記事を参考に寝心地のいいHMDを購入してみてはいかがでしょうか。

明日はnoshipuさんの「VRアプリ作って思った事とか書きます」です。

おまけ

ちなみにSAOのキリトくんが被っているナーブギア

f:id:shop_0761:20161119054153j:plain

ヘルメット系は詳しくないのですが、これとても首を痛めそうな気がします。

調べてみると、やっぱり何人かの方がヘルメットを被って寝たことがある模様。特に寝心地レビューみたいのが見当たらず残念。

アミュスフィアはこんな感じ

f:id:shop_0761:20161119054433j:plain

HoloLensに近い気がしますが、やはりPSVRの例から後頭部に優しくないのではと思ってしまいます。

なのでメディキュボイド型が最強なのでは!?!?

点滴してもらえそうだし。

f:id:shop_0761:20161119054537p:plain

やっぱりこっちのメガネも捨てきれませんね(もはやVRではない

こちらは確か作中では寝る時に外していたような気もします。

f:id:shop_0761:20161119055104j:plain

おまけ2

ちょっと調べてみるとこんなものがあったのを思い出しました。

www.digimonostation.jp

確かに寝る分にはいいかもしれませんが、VR空間で寝たいのでうーんという思い。

【UE4】SaveとLoad時のUserIndexについて

はじめに

時々SaveとLoadに苦戦するのでよくお世話になっているほげたつさんのサイトです。

hogetatu.hatenablog.com

ここには

セーブデータにはスロット名とユーザーインデックスが指定できます。 スロット名はセーブデータの名前、ユーザーインデックスはその中でのIDみたいなものですね。 ドラクエ冒険の書1とか冒険の書2とかそんなイメージです。

とあります。

もちろんこちらにも。

docs.unrealengine.com

For some platforms, master user index to identify the user doing the saving.

ただ実際に実装してみると、なにやら動作がおかしいので調べてみました。

ソースコード

ということで、Engineのソースコードを追います。UE4.13です。 ctrl+FとかでUserIndexをハイライトしておくと、見やすいかもしれません。

Runtime/Engine/Private/GameplayStatics.cpp

USaveGame* UGameplayStatics::LoadGameFromSlot(const FString& SlotName, const int32 UserIndex)
{
    USaveGame* OutSaveGameObject = NULL;

    ISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();
    // If we have a save system and a valid name..
    if(SaveSystem && (SlotName.Len() > 0))
    {
        // Load raw data from slot
        TArray<uint8> ObjectBytes;
        bool bSuccess = SaveSystem->LoadGame(false, *SlotName, UserIndex, ObjectBytes);
        if(bSuccess)
        {
                   (省略)
bool UGameplayStatics::SaveGameToSlot(USaveGame* SaveGameObject, const FString& SlotName, const int32 UserIndex)
{
    ISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();
    // If we have a system and an object to save and a save name...
    if(SaveSystem && SaveGameObject && (SlotName.Len() > 0))
    {
        (省略)
        // Stuff that data into the save system with the desired file name
        return SaveSystem->SaveGame(false, *SlotName, UserIndex, ObjectBytes);
    }
    return false;
}

とSaveもLoadもUserIndexに関わる処理はSaveGame、LoadGameを呼び出しているのでそちらへ。

Runtime/Engine/Public/SaveGameSystem.h

virtual bool SaveGame(bool bAttemptToUseUI, const TCHAR* Name, const int32 UserIndex, const TArray<uint8>& Data) override
    {
#if PLATFORM_HTML5_BROWSER
        return UE_SaveGame(TCHAR_TO_ANSI(Name),UserIndex,(char*)Data.GetData(),Data.Num());
#elif PLATFORM_HTML5_WIN32
        FILE *fp;
        fp=fopen("c:\\test.sav", "wb");
        fwrite((char*)Data.GetData(), sizeof(char), Data.Num(), fp);
        fclose(fp);
        return true;
#else
        return FFileHelper::SaveArrayToFile(Data, *GetSaveGamePath(Name));
#endif
    }
 virtual bool LoadGame(bool bAttemptToUseUI, const TCHAR* Name, const int32 UserIndex, TArray<uint8>& Data) override
    {
#if PLATFORM_HTML5_BROWSER
        char*  OutData;
        int        Size;
        bool Result = UE_LoadGame(TCHAR_TO_ANSI(Name),UserIndex,&OutData,&Size);
        if (!Result)
            return false; 
        Data.Append((uint8*)OutData,Size);
        ::free (OutData);
        return true;
#elif PLATFORM_HTML5_WIN32
        FILE *fp;
        fp=fopen("c:\\test.sav","rb");
        if (!fp)
            return false;
            // obtain file size:
        fseek (fp, 0 , SEEK_END);
        int size = ftell (fp);
        fseek (fp, 0 , SEEK_SET);
        Data.AddUninitialized(size);
        int result = fread (Data.GetData(),1,size,fp);
        fclose(fp);
        return true;
#else
        return FFileHelper::LoadFileToArray(Data, *GetSaveGamePath(Name));
#endif
    }

えーっとPlatformがHTML5のブラウザだけUserIndexを使っているように思います。

そしてこのUE_SaveGameとUE_LoadGameはこちらに。

Runtime/HTML5/HTML5JS/Private/HTML5JavaScriptFx.js

UE_SaveGame: function (name, userIndex, indata, insize) {
    // user index is not used.
    var _name = Pointer_stringify(name);
    var gamedata = Module.HEAPU8.subarray(indata, indata + insize);
    // local storage only takes strings, we need to convert string to base64 before storing.
    var b64encoded = base64EncArr(gamedata);
    $.jStorage.set(_name, b64encoded);
    return true;
  },

  UE_LoadGame: function (name, userIndex, outdataptr, outsizeptr) {
    var _name = Pointer_stringify(name);
    // local storage only takes strings, we need to convert string to base64 before storing.
    var b64encoded = $.jStorage.get(_name);
    if (b64encoded === null)
      return false;
    var decodedArray = base64DecToArr(b64encoded);
    // copy back the decoded array.
    var outdata = Module._malloc(decodedArray.length);
    // view the allocated data as a HEAP8.
    var dest = Module.HEAPU8.subarray(outdata, outdata + decodedArray.length);
    // copy back.
    for (var i = 0; i < decodedArray.length; ++i) {
      dest[i] = decodedArray[i];
    }
    Module.HEAP32[outsizeptr >> 2] = decodedArray.length;
    Module.HEAP32[outdataptr >> 2] = outdata;
    return true;
  },

いやあのこれ、UserIndex出番なくないですか…(引数として呼ばれているだけで未使用)

まとめ

現状だとUserIndexは出番がないようです。ちゃんと(?)設定していないはずのUserIndexでLoadしてもエラーが出ませんでした。

Forum等も漁りましたが、良さげな解答が見つからなかったので追ってみました。

どこか間違ってたり、新たに何か分かった時にはぜひ@shop_0761までお知らせください(更新します)

【UE4】自作アクションゲームにAutoPlayを仕込んでみた

はじめに

ぷちコンで作ったもろもろ紹介編2です。

元記事

shop-0761.hatenablog.com

今回はCEDECに行った際に聞いたAutoPlayのお話をもとに作ってみました。

講演はこちら。

cedec.cesa.or.jp

資料はCEDiLにあります。

cedil.cesa.or.jp

実際にAutoPlayしたものがこちら。

youtu.be

考え方

講演の内容をもとに(正確な内容はあやふやですが)AutoPlayの実装方法を簡単に説明します。

f:id:shop_0761:20160922233931p:plain

-------事前準備-------

  1. マップにConeを置く

  2. そのConeにはいくつかActionを登録しておく

-------実行時---------

  1. ConeのActionを実行する

  2. 次のConeについたら上へ戻る

これだけです。AIは使わなくても実装できます。

Actionというのは絵に描いてあるような移動だったり、ジャンプだったりと なんでもいいわけです。

管理、保守など調整しやすいように難しいことはしません。

実装

実際に実装してみると、このConeのBPだけで大部分はまかなえてしまいました。

(あとはループ処理のためのConeManagerを作ったりしたくらい)

方針

ポイントを整理しておきます。

  • 今回は予めConeを配置したあとにNextConeとして次のConeを登録しておく

  • 今ActionをしているConeとNextConeのみCollisionを有効にする(例外あり)

くらいだと思います。

一つ目はConeと同じ型の変数を公開しておき、レベル上で設定していきます。

こんな感じ。

f:id:shop_0761:20160922235034p:plain

二つ目はそのほうが安全だよねってくらいです。

そして"例外あり"とは、スタート地点はCollisionを有効にしておかなきゃそもそも動かないのでという意味だったり、不具合対処の意味が大きいです。

この辺はまたあとで触れます。(※)

実際のBPはこちら(1-2日で作ったので一応整理したけど散らかっている感)

ConstractionScript

一応確実にジャンプして欲しい場面(大きな穴とか)があるので

f:id:shop_0761:20160922235517p:plain

全体像

f:id:shop_0761:20160922235538p:plain

BeginPlay

ここでCollisionの設定をしています。

f:id:shop_0761:20160922235553p:plain

BeginOverlap

NextConeのCollisionをEnableにしたあと、Wait秒待ちます。

落ち着いてジャンプしてもらうためです。

f:id:shop_0761:20160922235611p:plain

Debug用にPrintStringしてるだけです。Duration0は便利ですね。

f:id:shop_0761:20160922235629p:plain

到着判定

NextConeにたどり着いたかどうかをチェックします。

今回はVecLengthでやりましたが、2点間の距離でもいいと思います。

そして、先程の※のお話(ポイントの2つ目)がここで出てきます。

後述するRandomJumpを使っていたりすると、偶然Coneをスキップされてしまい、 Gateが開いたまま移動処理が残ったりする場面が多々ありました。

実装方法に問題があるのは分かっていますが、今回は一定距離が離れたりした場合でも到達したとみなして、処理を打ち切ることにしました。

f:id:shop_0761:20160922235644p:plain

Move

一応Axisの向きも内積でなんとなく求めておきます。

このMoveActionはキー入力の移動と同じ処理をするだけです。そのために追加したイベントです。

f:id:shop_0761:20160922235657p:plain

Jump

こちらのJumpは一度だけ確実にジャンプする必要があるときに使います。

JumpActionも先程のMoveActionと同じです。

f:id:shop_0761:20160922235721p:plain

RandomJump

適当なタイミングで適当に長押し(したフリをして)ジャンプします。

f:id:shop_0761:20160923001012p:plain

Reset

今回はループさせたかったので、Reset処理を追加しました。

ループさせる必要がないならDestroyしてしまってもいいかもしれません。

(そうするとさっきの※のお話はなくなるはず)

f:id:shop_0761:20160922235738p:plain

AutoPlayのメリット

最初は なんかすげぇでも作れそう とおもったので勉強がてら作りました。

何がいいかというとテストプレイ(周回系)が楽です。

  • 実装に疲れたから、眺めて確認したい
  • どうせちゃんと動くだろうから、操作したくない
  • Twitterを見たい

などAutoPlayにしておけばこんなに便利です。

あとプレイ動画を撮るのも楽ですね。コミケ等の展示時に流していると面白いかもです。

まとめ

このくらいのスピード感で作ってました。

意外にあっさりできましたね。

ちなみに途中で操作介入できます。(意図的にジャンプさせたり)

なにかわからないことがあれば@shop_0761までお願いします。

【UE4】ParallaxOcclusionMappingで背景アセットを作ったお話【小ネタ】

はじめに

ぷちコンで作ったもろもろ紹介編1です。

元記事

shop-0761.hatenablog.com

HeightMapの描き方が分かりません。

けど、いい感じの背景アセットを手抜きで作りたい。

そんなこんなで出来たのが、これ。

f:id:shop_0761:20160921004208p:plain

f:id:shop_0761:20160921004225p:plain

意外に良くないですか 手抜きの割には。

作り方

Heightmapは描きました。手描き出来ます。

f:id:shop_0761:20160921004449p:plain

f:id:shop_0761:20160921004432p:plain

引っ込ませたい方を黒で塗ればいいんです。おわり。

あとはMaterialですが、ContentExampleにあったものを拝借してきただけです。

f:id:shop_0761:20160921004911p:plain

f:id:shop_0761:20160921004922p:plain

超お手軽ですね!!

深いことを考えなければ、パラメータはSampleそのまま使っていい気がします。

最初はalphaで抜こうか、なんて思ってた時期もありました。

f:id:shop_0761:20160921004420p:plain

ですが、シェーダ複雑度が真っ赤になったのでやめました。

これなら実質箱だけなので、描画負荷はalpha抜きに比べると軽いです。(上手くやれば赤いとこもなくなるはず)

f:id:shop_0761:20160921010135p:plain

試しにalpha抜きしてみました。(見栄えはおいておくとして

f:id:shop_0761:20160921010433p:plain

f:id:shop_0761:20160921010443p:plain

そりゃそうですねって感じです。

まとめ

ぱららっくすおくるーじょんまっぴんぐ ってカッコよかったので使いたかっただけです。

ContentExampleのは出来が良すぎて意味が分からなかったですが こんな手抜きの白黒絵を描いても使えるよ ということが言いたいだけです。

賞味20分くらい?だった気がします。

誰かもうちょっとまともな使い方の記事を書いて欲しいところですね。

【UE4】第6回ぷちコンに応募しました 【概要編】

はじめに

今回も2作品応募しました。

ぷちコンのページ

historia.co.jp

月にかえりたい

www.youtube.com

実行ファイル

www.dropbox.com

Android

www.dropbox.com

カノトンボ

www.youtube.com

今回もまた作品概要だけをここで紹介してUE4の技術的なお話とかはまた別記事にします。(後々検索しやすくするため

月にかえりたい

この作品は某CMとか某映画が元ネタとなってます。知ってるとより楽しめるかと思います。(知らなかったら連絡ください こっそりお教えします)

今回はちゃんとコンセプトアートを書き、グレーボクシングをし、比較的ちゃんとまとまってから作り始めたので心に余裕がありました。(毎回すべきことなのに)

f:id:shop_0761:20160919232416p:plain

ちょくちょくコンセプトとずれそうになったりしました。(得点をScoreと英語にしてたり、小判ではなく札束にしようとしてたり)

ですがふとコンセプトアートを思い出して修正できました。描いておいてよかったです。

最終的にこの敵キャラのマスクも作れたのでよかったです。

f:id:shop_0761:20160919232552p:plain

絵作りの方は当初水彩っぽくしたかったんですが、調整してるうちに今のに落ち着きました。

これを使って調整しただけです。

qiita.com

今回のBGMはMusycというiOSのアプリで作りました。作ったといってもおもちゃみたいな感じなのでガチではありません。

すごい地味ですが、残り日数が短くなると徐々に早くなったりしてます。

プレイする人によって借金を返すのか、踏み倒すのかに差が出そうですね。

カノトンボ

こちらは完全に思いつきと勢いです。VR用になにか作ろうと思ってた時にやってきたアイディアです。

虫かごのフタだけモデリングしました。

f:id:shop_0761:20160919233559p:plain

ちょうどMMD版の中野シスターズが公開されて、目の構造が変わったらしかったので大抜擢です。

参考:

qiita.com

あとはこれでカノちゃんのアニメーション、graymanのポーズを作りました。

shop-0761.hatenablog.com

スケール感的にはこのくらいです。(graymanは60倍くらい

f:id:shop_0761:20160919234526p:plain

UE4.13からのVRTemplateを使ったので他に変わったことはしてません。お手軽です。

まとめ

なぜか締切が一日早い方に勘違いしていたので、はやく終わりました。

気持ちが楽になりました。チキンレース勢もいいですが、こっちはココロにやさしいです。

近々 月にかえりたい の方は実行ファイルを公開します。

【UE4】MayaLT2017でphysXを使って服を揺らす

はじめに

第6回ぷちコンにあわせて頓挫中だった3Dモデルを作りました。 その話は、また別の機会にするとして今回はワンピースをApexClothで揺らしてみたいと思います。

結論から言えば、微妙です。

あまり期待しないでください。

MayaLTも初心者ですのであしからず。

やるなら一通り読んでからのほうがいい気がします。

テスト環境

  • MayaLT 2017
  • UE4.13
  • PhysX: Maya DCC plug-in for PhysX 3-3-3

Maxでも出来ると思います。(未確認

手順

ApexCloth自体は最後にある参考サイトの@com04さんのサイトを見るといいかと思います。 以降はある程度知ってるものとして色々省略します。

基本的に参考を最後につけているのでそちらの動画(英語)を見ていただければ実際済むお話ですが、

つらい目にあったよってところも織り交ぜながら書いておきます。

それと、服のマテリアルは別にしておきましょう。そのほうが多分安全。

分けてなかった時

服だけになりました。

ちなみに服には一切ボーンは入ってません。

プラグインを入れる

nvideaにログイン後、こちらのDownloadCenterからダウンロード出来ます。

手元のMayaのバージョン等に合わせてください。

Download Center | NVIDIA Developer

.msi形式なので、実行すれば導入自体は出来るかと。

そして、MayaLT上で言うとウィンドウ → 設定/プリファレンス →プラグインマネージャー からphysx.mllをロードすると

f:id:shop_0761:20160914000609p:plain

このように追加されます。

physX Clothingを作る

これを作るときにはジョイント(ボーン)が必要になるはずなので、準備しておきましょう。

対象のメッシュを選択して(今回はワンピース)、右から6つ目のスカートみたいなアイコンをクリックするか、上のメニューからphysXphysX Clothing → Create Clothingで作れます。

これを色々調整していく感じです。

ペイントする

スパナみたいなアイコンをクリックすると、このようにメニューが出ると思うのでPaintを選べば塗れます。

f:id:shop_0761:20160914001216p:plain

この時、マテリアルを設定していればこのように紫色になるかと思います。ならなかったら確認してみてください。

ちなみに僕は一旦ここでハマりました。

はい、原因不明ですが乗り切りました。

こんな感じで色々設定できます。

f:id:shop_0761:20160914002529p:plain

Attribute

4種類塗れます。

  • maxDistances これがきっとメインになる塗り
  • latchToNearest 動画だと服の裏地に塗ってました

あとのBackstop系はよくわからなかったです()

とりあえずmaxDistanceを揺らしたいところに強弱をつけて塗るみたいです。

参考までにこんな感じしたり。

f:id:shop_0761:20160914003020p:plain

裏も塗りました。

f:id:shop_0761:20160914003026p:plain

シュミレート自体は再生ボタンを押せば勝手にやってくれます。

ちなみにlatchToNearestを塗ると表と裏の生地が貫通したのでやめました。

RagDoll

服と体のコリジョンを作れます。

Bodyになるメッシュを選択後、藁人形みたいなアイコンをクリックしてCreate Kinematic RagDollで作成できます。

つよそう

f:id:shop_0761:20160914003620p:plain

でこのように選択して、不要なジョイントのところのコリジョンをRemoveできたりします。

f:id:shop_0761:20160914003821p:plain

個々のコリジョンを編集するには、上でジョイントを選択した後に下のshapeSetUpから目的のコリジョンを選択して、Selectすれば編集メニューがでます。

f:id:shop_0761:20160914003955p:plain

f:id:shop_0761:20160914004212p:plain

と普通に移動、回転、スケールができるみたいです。

なお

こんな目に遭っているので様子見ながら調整しましょう。

出力する

一通りおわった(ことにした)ので、UE4用に出力します。

Create Clothingしたメッシュを選択して出力するだけです。

ポイントは

ファイルの種類をphysXにした後、ここを確認しましょう。

f:id:shop_0761:20160914004651p:plain

特にunitを間違えるとおかしなことになります。

あとは.apxファイルが生成されるので適用するだけですね。

この辺はスクショでも貼って終了にします。

f:id:shop_0761:20160914005550p:plain

結果

はい すごい微妙に変わります。

まとめ

ここまでやってこれだけ…しかも微妙って…

なので、現状はボーンを入れて、Anim Dynamicsで揺らすか手付けアニメーションにするかが最適解かもしれません。(けど面倒なのでやりたくない

余裕があれば髪もやります。

AnimDynamics

unrealengine.hatenablog.com

参考

www.youtube.com

www.youtube.com

www.youtube.com

docs.unrealengine.com

物理-布シミュレーション - UE4 Document@com04

CEDEC2016に行ってきた

はじめに

今回は特に行く予定がなかったのですが、急遽就活の関係で8/27に東京に行かなきゃならなくなったので

CEDECいけるじゃん!!」

ってなったので行きました。

個人的によかった講演やらメモをまとめておこうかなというお話です。

資料はCEDiLに公開されていたりするので、そちらもできるだけリンクを貼ります。

CEDiLは会員登録が必要なのでそれだけご注意を。

順番は適当です。

手と指がVRの中にある:Oculus Touchのインタラクションデザイン

資料公開があると思うのですが、さすがにまだ見当たらず…

Youtubeの配信もあったし、主婦さんのツイートとかを見ていただいたほうが早いかも。

Touchは非常に良いコントローラーなので、よりよい体験のためにどうしたらいいか というような内容が中心で、 僕も気になったところをちょこちょこツイートしてました。

こんなところですかね。Touchが楽しみです。

ベヨネッタ2』におけるゲーム品質を上げる為の自動化 ~オートプレイと継続的なパフォーマンス計測~

cedil.cesa.or.jp

前回のぷちコンでプレイ動画を撮るのにすごい苦労したので興味がありました。

AutoPlayの実装方法について説明されているのですが、非常にイメージしやすく これならUE4でもぱぱっと作れそうという印象でした。

ざっくりした方法を紹介するなら、

  1. コーンと呼ばれるマーカーみたいなものをレベルに配置
  2. 一番近いコーンに移動
  3. Actionを実行
  4. 終わったら次のコーンへ

と2-4を繰り返すイメージです。 AIを使うわけではなくAutoPlayなのでパッド入力としてActionを行います。

Actionには移動、待機、ジャンプなどそれぞれセットするだけなので単純。

Aで攻撃して壁を壊したら、移動する ではなく「適当に10回くらいA連打、待機、移動」のような実装で十分だそうです。

パフォーマンス計測の方は専用のwebページを作って、グラフィカルに負荷をみれるようにというコンセプトで作られており

アーティストさんにもパッと見で改善されたかわかるようにとのことでした。

データベース化すると管理で死んでしまうので取ってきたデータの生XMLを置いてあるとかいうお話です。

Unreal Engine 4 のレンダリングフロー総おさらい

BPでロジック組むの大好きだったのでレンダリングはからっきしでしたが、非常にわかりやすかったです。

毎日見直してレンダリングの流れを頭に入れておきたいレベルです。

細かいことは中身を見たほうがよっぽどいいですw

www.slideshare.net

「VR ZONE Project i Can」の知見、全部吐き出します!

これはEvernoteにメモったものがあるのでそれを

VRの宣伝は人の反応を見せるほうがインパクトがある

身長が10倍になると怖さは1/10

現実との比較がないと驚きが少ない

コントローラに機体をAttachするとずれない

被写界深度を浅くすると酔わなくなる…?

完全再現ではなく厳選再現でおけ

錯覚 クロスモーダル現象 認識とか判断を端折りたい →いつものパターンは端折る →騙される

得た経験とか知識によるリアリティの感じ方に差が出る

共感力の増加

  • 実際に経験豊富
  • 妄想
  • 楽しむ心 信じる心

減少

  • VR擦れ
  • 分析心

現実 実物は実在感が大事

物理法則のインタラクション大事 炎で熱いとか

複数の情報筋から得たいつものパターンつよい

映像 音 地響きのような複数インプットがあると信じる

VR

  • 旅に出る 体験して感動
  • 自分のからだ
  • 自ら行動→行動制限不能
  • 見回せる、歩ける
  • 強烈な体験そのもの
  • ゲームルールと面白さは別

ゲーム

  • 旅番組を見る 感情移入して感動
  • レバー ボタン
  • 意思を伝える
  • 作者の狙い通りに感動体験をした気分

面白い体験を発見すること

その場にいたら、本当に起こったら、を豊かに想像する力

アニメやゲームのシチュエーションはそもそもその場で体験したらすごい

百聞は一体験に如かず 開発者にも大事

リアル体験じゃないと得られない感動をコンテンツの中心におく

f:id:shop_0761:20160828125751j:plain

f:id:shop_0761:20160828125806j:plain

f:id:shop_0761:20160828125817j:plain

欧米で日本のゲームを成功させる方法 How to make Japanese games work in the West

同時通訳のせいで激辛セッションだった気がしますw

これもEvernoteのメモを

可愛らしい動物、アニメ的な簡単に描かれた顔、ファンタジー系、刀と銃の混在欧米ではない

欧米ではファンタジーは真剣に読んだりするものなのでアニメ的な絵などにすると子供向けに思われることも

アメリカ的にはシリアスなファンタジーのがよい

アメリカゲーマーは30-40代

アメリカとinterface(UI)が違う

アメリカではキャラになりきる、プレイヤーアバターのようなものが必要

PvPとPvEは混在させない

協力プレイがよい

アイテムを後から買うのはあまり受けない(ガチャとかガチャとかガチャとか

→時間をつぎ込むことで解禁できるように 他の手段でも獲得できるように

運によって差があると欧米ではマイナスな印象に(日本だとラッキーだねと割とプラスな印象に

探索可能、動機づけ(なぜ戦うのかなど)が大事

ポケモン的な感じが一番ウケがよく分かりやすい例(PvPとPvE、探索、ストーリーの動機付けなど)

f:id:shop_0761:20160828125835j:plain

f:id:shop_0761:20160828125846j:plain

f:id:shop_0761:20160828125857j:plain

まとめ

UE4のVRロードマップはだいたいリリースノートとかに書いてる感じだったので、資料を見ていただければいいかも。

下の2つは資料が公開されていないもののはずなので、なにか参考になればと。写真もちょっとあるので後で追記します。

ちなみにガチャは英語でGachaらしいです。

ネカフェで書いたので、帰ったあとに今回CEDECにかかった額の計算をしてみようかと思います。

(2016/08/28 追記 

計算しました。 およそ84000yenですね(やばい) 全部自費です。

簡単な内訳としては

  • 1daypass 2 expopass 1 33480
  • 飛行機 19300
  • Developer's Nightなどの懇親会費 12364
  • 宿代(ネカフェ) 3 6480

残りは交通費やらですね。

食費ゴリゴリ削る人なので、一人で飲食したのはジュース1本と帰ってきてから新千歳で買ったお菓子くらいです。

Developer's Nightは5000円の烏龍茶とオレンジジュースでした()

きっと普通に食べたら9万コースですねきっと。

)

全体を通して(懇親会もほぼフル参加では)、かなり行ってよかったなと思いますが

遠方+学校の支援なしな学生にはCEDECはコスト的な意味できついですね!!

内容の質を学生向けに下げる必要は全くないと思いますので、そんな学生向けのパス代にしてくれると助かります()