Aizu-Progressive xr Lab blog

会津大学のVR部であるA-PxLの部員が持ち回りで投稿していくブログです。部員がそれぞれVRに関する出来事やVRにちなんだことについて学んだことを書いていきます。

連絡はサークルTwitterのDMへお願いします。
「面白法人カヤックVR分室」としても活動しています。詳細はこちら

学校案内

VR部が主に活動をしているM6教室への案内です

 

 

VR部プログラミング勉強会

今回ブログを担当します、三年のなおしです。

紹介する内容はプログラミング勉強会です。 勉強会では部活のみなさんのサポートがあったのでとても助かりました。 また、新入生からの質問などで私自身の復習、反省にもなりました。

勉強会で行った内容はC言語の基本的な文法
1 出力 / 入力
2 if文 / switch文
3 for文 / while文
4 配列
5 関数
6 構造体

です。 これらの機能をもとに、簡単なゲームを作成しました。

f:id:aizu-vr:20170525125534p:plain
よくあるターン制のゲームを真似て作りました。
このプログラムでは配列以外のすべての内容を使いました。

まずは、キャラクターの構造体を作ります。

typedef struct {
      int HP;
      int panch;
      int kick;
      int destroybeam;
}Character;

この構造体を使って、プレイヤーとモンスターを宣言しそれぞれステータスを設定します。

次に、while文で無限ループを作ります。ループ内では、モンスターの出力、プレイヤーの出力、攻撃方法の入力、プレイヤーの攻撃、モンスターの攻撃を順に行います。

モンスターとプレイヤーの出力では関数を使って出力しました。例えば、モンスターの出力では

void printMonster(int HP) {
    printf("モンスター\n");
    printf("\n");
    printf("     \\_\\ ☆ ---------------\n");
    printf("    (^q^)/ < 楽にしてやろう|\n");
    printf("  -- ( )/   ---------------\n");
    printf("     /|\n");
    printf("\n");
    printf("HP:%d\n", HP);
}

と、しました。

次に、攻撃方法の入力を行います。入力された値をもとにswitch文を使ってダメージを求めます。もし、指定されていない入力がされた場合はcontinue文を使って入力をやり直します。

scanf("%d", &attack);
switch(attack){
case 1:
     dmg = player.panch;
     break;
case 2:
     dmg = player.kick;
     break;
case 3:
     dmg = player.destroybeam;
     break;
}
if(attack < 1 || 3 < attack){
     printf("入力が間違っています。\n");
     continue;
}

ダメージを求めたら、ダメージ分の値をモンスターの体力から引きます。もし、このときモンスターの体力が0以下になればbreak文を使ってループから抜け出します。 また、同じようにプレイヤーもダメージを受けて、体力が0以下になればループから抜け出します。

printf("モンスターは %d のダメージを受けた\n", dmg);
monster.HP -= dmg;    
if(monster.HP <= 0){
     printf("モンスターを倒した!\n");
     break;
}
printf("モンスターの攻撃! %d のダメージを受けた\n", monster.panch);    
player.HP -= monster.panch;
if(player.HP <= 0){
     printf("あなたは力尽きた!\n");
     break;
}

これで、while文を閉じればゲームが完成です!

また、乱数を使用することで攻撃力に幅を持たせり、モンスターが様々な攻撃を行うようにできます。

このプログラムの他に、2次配列をしようしてマップを作りました。

以上の機能を使えばオセロなども作成することもできます。

プログラミングは大変ではありますが、何かを作り始めると楽しくなります。私も前にカードゲームなどを作ってみたことがあります。 「これプログラムにできるんじゃね?」と思ったらプログラミングしてみましょう!

Particle System

こんにちは。
今回のブログを担当するVR部部員のタマです。
ブログを書くのは初めてなので、どうか温かい目で見てください。


今回のテーマはパーティクルシステム です!!

f:id:aizu-vr:20170514010800p:plain

今回はUnity5.5で追加されたLightsモジュールの各種設定を見ていきたい思います

 

 

さっそく、CreateボタンからParticle Systemを押してInspectorを見てみます。

f:id:aizu-vr:20170514012107p:plainf:id:aizu-vr:20170514012114p:plain

すると、下の方にLightsモジュールが追加されてます!

f:id:aizu-vr:20170514012400p:plain

 

今回は光ってる感を分かりやすく表現するためにMain CameraにBloom スクリプトをつけました。

Bloom スクリプトはImport package から Effects をインポートすることで使えます。

f:id:aizu-vr:20170514012826p:plain

 

それでは、ライトモジュールを見てみましょう!!

これが初期状態です

f:id:aizu-vr:20170514012905p:plain

 

・Light

・Ratio

・Random Distribution

・Use Particle Color

・Size Affects Range

・Alpha Affects Intensity

・Range Multiplier

・Intensity Multiplier

・Maximum Lights

 

と、9つの項目があります。

 

Light

これはパーティクル1つ1つにどのようなライトをつけるか設定できます。

このLightで使えるライトは Spotlight か Point light しか使えません。

そして、このライトはシーン内もしくはPrefabにないと使えません。

 

実際に、Point light を Prefab 化してつけてみます。

f:id:aizu-vr:20170514013610p:plainf:id:aizu-vr:20170514013618p:plain

 

こんな感じで、パーティクル1つ1つにPoint light がつきました。

パーティクルの下辺りが光っています

f:id:aizu-vr:20170514013754p:plain

 

 

Ratio & Maximum Lights

Ratioは生成されるパーティクルがどのぐらいの割合でライトを持っているかを設定することができます。

Maximum Lights はライトを表現できる最大数です。

しかし、Ratioを1に設定して、Maximum Lightsを十分大きな数(300ぐらい)にしても全てのパーティクルにライトがつきません。

f:id:aizu-vr:20170514014027p:plainf:id:aizu-vr:20170514014033p:plain

 

いろいろ調べた結果、Renderingの設定でどうにかできるらしいです。

カメラのRendering PathをForwardに設定している場合、一度に置けるライトに制限があるらしいです。

これを変更するためには、Project Settings > Quality の Pixel Light Count の値を変更すれば一度に置けるライトの数を増やすことができます。

f:id:aizu-vr:20170514014231p:plain

やってみると見事全部にライトがつきました!

しかし、ライトはとても重い処理なので数には注意が必要です。

 

Use Particle Color

Use Particle Color は On にするとパーティクルの色が光に影響します.

 

f:id:aizu-vr:20170514014635p:plainf:id:aizu-vr:20170514014641p:plain

 

Size Affects Range

パーティクルが大きければ光の影響する範囲が大きくなります。

 

Alpha Affects Intensity

Onにすると、パーティクルのアルファ値が小さければ輝度が下がり、アルファ値が大きければ輝度も上がります。

f:id:aizu-vr:20170514014938p:plainf:id:aizu-vr:20170514014943p:plain

 

Range Multiplier & Intensity Multiplier

Range MultiplierとIntensity Multiplierはそれぞれ手動で光の範囲と輝度を設定することができます。

これはPrefab化したLightの設定をいじってもできます!

 

今回はこの辺で終わりたいと思います。

時間があったらこの機能を使って何か作ってみたいと思います。

 

 

 

 

 

VRアカデミー 4/22, 4/29

今回は第3回目と第4回目に行われた講座についてまとめていきたいと思います。

4/22(第3回)

ゲストにInstaVRのエバンジェリスト平山智予(ひらやま ともよ)様が来てくださいました。 jp.instavr.co 聞いたところによるとInstaVRの使用率は9割が外国のようで・・・。やはり外国の方がVRに対する意識は高いですね。
InstaVRは実写系のVRを簡単に作ることができるWebアプリケーションです。360度カメラ(THETAやGoProなど)で撮った画像などを使います。 f:id:aizu-vr:20170430001316j:plain ↑VR部のVR勉強会の途中で撮った写真(今回はTHETA Sを使いました)
VR勉強会ではこの画像を使ってみんなでInstaVRを使って実写VRアプリを作りました!1年生から全員、無事何事もなくつくることができたので、InstaVRは本当に簡単にVRアプリを作ることができるなと実感しました。

「CGでのVRと実写VRの違い」

  • 実写系のVRは、自分が映像世界にいるのではなく球体の内側にマップされた映像を見ている

  • 撮影ポイント間を移動するので、自由な移動ができない

VRのUI/UXがなぜ大事か

UI/UXがひどいと

  • 眼精疲労

  • 方向感覚の喪失

  • 吐き気などが組み合わされた苦痛

が引き起こされるからです。
感覚を奪い脳を騙し続けるには細かな配慮が必要になります。

VRのUI・・・迷わない設計
VRのUX・・・快適なユーザー体験、酔わない設定

そのためには・・・?

  • Head-Up Display をなるべく使わない

  • 移動を少なくする

  • 傾きに注意

  • フレームレートによるちらつきに注意

  • 頭の動きを強制しない

  • 音声によるナビゲーション

  • UIなど見て欲しいものを2、3m以上離す

  • アクションさせる数を減らす

  • 移動先へのガイド表示を作る

などをあげていらっしゃいました。ただこれらを全部細かく注意して作っていってもつまらないものになってしまうとも言っていました。
「傾き」に関しては、コンテンツの地平線に対して水平状態をキープするという意味で言っていたのですが実写VRを作る際、素材を360度カメラで撮るときカメラを傾けないように気をつけてねとも言ってました。ただInstaVRにはこれらの傾きを修正する機能も備わっています。すごい。

今注目していることとして、「アイトラッキング(視線追跡)」をあげていました。ただ視線追跡は乱視の人が結構大変だとか。。。もしアイトラッキングができればその注視しているところだけを主に綺麗に描画して、レンダリングの処理削減にもつながりますね!→sksk動いて酔いも削減される!

最後に平山さんが言っていた言葉の中で印象に残った言葉を。

みなさんが吐いた数だけ世の中のVRユーザーが救われる

4/29(第4回)

第4回目のゲストの方は、カディンチェ株式会社 CTOの内田和隆様でした。内田様にはVRウォークスルーについてお話ししていただきました。
移動はVR体験の醍醐味の1つですよね

  • 無限に広がる空間

現実世界では味わえない仮想体験

VR酔いとの戦い

  • 現実感とVR空間で体の動きにミスマッチが起こるのが原因


<理想>ユーザーの目の位置と方向に完全に合わせて連動して、VR空間のカメラを常に動かすこと(=酔いにくい)

<現実>目(頭)の位置や方向をトラッキングできるのは数メートル四方が限界

ウォークスルー方法1:コントローラーで視点移動

「酔い対策」

  • ヘッドトラッキングとカメラの連動は常にON

  • ヘッドトラッキングおよびコントローラーの入力だけでカメラを連動させる

  • それ以外の要因でカメラを動かさないようにする

  • 一定のスピードで移動する

  • ユーザーが予測できない動きをしない

  • 見えない力で勝手に動くのを避ける

  • モノにぶつからないようにする

  • 壁などにぶつかって止まるよりも、壁を通過させる方が酔いにくい

  • 壁を通過してしまったら、暗転して本来のコースに戻すなどの工夫をする

  • 近すぎるオブジェクトは表示しないようにする


ウォークスルー方法2:自動移動

「酔い対策」

  • ユーザーが見ている方向に進む

  • 視点に対して横移動しない

  • カメラの動きが前方に向くように工夫する

  • カメラの動きを安定させる

  • 上下方向にカメラをなるべく動かさない

  • ガイドになるものをつける(視点と一緒に追従するオブジェクトをつける)

  • トロッコ、車のダッシュボード、鼻などを視界に入れる

  • 周辺視野は動きに敏感なので(ベクションを起こしやすい)、早く移動するときは周辺視野をマスクする

  • 周辺のテクスチャをぼかすだけでも効果がある

  • 自動で動く場合でも、開始、停止はユーザーの制御でできるようにするべき


ウォークスルー方法3:ワープ

「酔い対策」

  • 視点の位置は固定なので、最も酔いにくい

  • 移動元と移動先で視点の方向を変えないようにする

  • 方向が変わると方向感覚が狂う

  • ワープ前後では黒画面のフェードをはさむ


ウォークスルー方法4:トラッキング装置を使った移動(HTCViveなど)

「酔い対策」

  • ラッキングに完全連動させる

  • レイテンシーをゼロに近づける

  • 体、頭の動きが速映像に反映されるようにする

  • 実空間とVR空間のスケールを合わせる


ウォークスルー方法5:移動用の入力装置を使って移動(トレッドミルや自転車)

「酔い対策」

  • 手元のコントローラーで操作するよりかは実際の移動感覚に近くメリットはある

  • しかし運動しながらVRを体験するため映像と体感覚のズレが逆に増加する恐れがある


ウォークスルー方法6アバターの動きに第3者目線で近づいていく

「酔い対策」

  • なめらかにアバターを追従するようにする

  • アバターが激しく動いても、カメラの動きはなめらかに保つ



次回、修了制作の中間発表らしいのでちょっと家にこもって開発します。。。

written by Akiyama

Blenderのエッジで分かりずらいところ

こんにちは、VR部副部長のノジです。

今回は私がBlenderを使い初めたばかりのころ、分かりづらかったところを書こうと思います。※Blenderのバージョンはv2.77で、日本語化してあります。

  • 円柱を側面部分だけ滑らかにしたい

3Dモデリングをしていると思わぬところで思い通りにならないところがでてきます。そのひとつを円柱をつかって説明していきたいと思います。

f:id:aizu-vr:20170424181223p:plain

まず物体を滑らかにするためにシェーディングをスムーズにし、再分割曲面のモディファイアーを下図のように追加します。

f:id:aizu-vr:20170424182659p:plain

すると上下の面まで曲面化し、円柱にはなりません。この解決策はたくさんありますが、今回は分かりやすいものを2つ紹介します。

f:id:aizu-vr:20170424182952p:plain

  • 解決策1

上下の辺ぎりぎりにループカットで辺を追加してあげます。ひとつ追加したら、今度は今追加した辺と立たせたい辺の間にもうひとつ辺を追加すると、角がよりはっきりします。

f:id:aizu-vr:20170424183433p:plain

  • 解決策2

辺を追加する方法でも問題ないのですが、辺を追加することでメッシュ数が多くなり、処理の速度にも関係してきます。それを辺を分離させることで簡単に解決できます。 まず分離したい辺を選択してCtrl+Eをします。そして画像の'辺を分離`を選択するときれいに円柱になります。

f:id:aizu-vr:20170424185552p:plain

f:id:aizu-vr:20170424191054p:plain

  • まとめ

解決策1だと辺の丸み具合まで調節することができるが、完璧に辺を立たせることができなかったりメッシュ数が増えてしまう。

解決策2だと完璧に辺を立たせることができるが、辺が分離してしまっているため後から編集するのが面倒。

どちらも十分使えるので用途にあった方を使うのがいいと思います。

会津大学VR部の部員が持ち回りで投稿していくブログです。特にテーマに縛りを設けずに書いていきます!