読者です 読者をやめる 読者になる 読者になる

2017/5/4薬研VR体験会

概要

刀剣乱舞の薬研藤四郎のVR体験会です。
MMD用に配布されている、ぱぴこ式薬研藤四郎モデル、グリ式薬研藤四郎モデルを使用させていただく予定です(許可をいただきました)。

  • 日時 : 2017/5/4 15:30-18:00(主催は15時からいます)

  • 場所 : パセラリゾーツ 新宿靖国通り

  • 定員 : 7名

  • 参加費用 : 会場代(カラオケ部屋代金)のみ

  • 連絡先 : おおもり (@nyanko_omori) | Twitter

  • 備考
    展示機器は1台のため、体験時間は1人10分前後程度になる予定です。 それ以外のほとんどの時間は他の方が体験されているのを見ていることになります。 そのため、ご体験が終わりましたら退出は自由です。

体験について(予定)

薬研さんと縁側でのんびりする

※VR内での刀剣乱舞プレイはできなくしたverの予定です。

薬研さんを顕現する

注意事項

Oculus Rift CV1(通称オキュ)を使用します。頭にかぶるゴーグルのような機器です。

  • 13歳未満の方の使用はできません。

  • ふちの大きいメガネをかけたままでは装着できないことがあります。可能であればコンタクトレンズの使用をおすすめします。

  • 高い位置でのアップなどの髪型は装着しづらいため、おすすめしません。

  • 顔に密着する機器のため、化粧が崩れる場合があります。

参考: 髪は、化粧は…?女性がVRを体験する際にオススメしたい3つのこと | Mogura VR - 国内外のVR最新情報

その他

他の方主催の体験会の様子です。

Oculus体験会まとめのまとめ - Unity+Oculus+MMD とりあえず書き留めておく場所

OculusRiftDK2で好きなキャラクターに会う動画 - YouTube

OQ体験(某猫の生音) by しろねこ - ニコニコ動画

【MikuMikuDance】名古屋オキュでの綾鷹Pの様子【体験レポ】 by Magasus(綾鷹P) - ニコニコ動画

VR薬研さん作ったものまとめ

概要

刀剣乱舞というゲームの薬研藤四郎さんが好きです。 薬研さんで作ったVRとかのものをまとめておきます。(最終更新:2017/2/19)

www.nitroplus.co.jp

作ったものまとめ

(時系列順) 下に行くほど古いです。

VR審神者

Image Effectsとかの練習

モーション作業中のひとこま(お蔵入りのもの)

薬研くんをなでなでしてみた

Oculus Touchハンズオンの先生役をしている話

この記事はOculus Rift Advent Calendar 2016 の7日目です。

qiita.com

記事概要

「VR道場 Unity × Oculus Touch ~VRで手を動かしてみよう~」ハンズオンの先生役を務めさせていただいています。先生役を務めるにあたって留意したことなどについて、ゆるりとまとめておきます。あまり技術的な話はないかもしれません。
ありがたいことにレギュラー化しました。次回は未定ですが、ご興味があればお越しくださいませ。※対象者は「今までゲームエンジンUnityを触ったことのない人」です。

unity-oculustouch-handson.peatix.com

peatix.com

ハンズオンについて

UnityとOculus Touchを使用して、「ユニティちゃんに触れる」簡単なVR体験を作ってみよう!という趣旨のハンズオンです。UnityやVRを簡単に楽しく体験してもらうことが目的です。 Unity × Mogura VR × ツクモ(敬称略)の共同開催です。会場はツクモデジタル.ライフ館イベントスペースをお借りしています。また、ご厚意で一般には未配布の「Hop Step Sing!」のモデルを扱わせていただいています。
定員は10名ほどの小規模なハンズオンですが、ありがたいことに毎回30、40名ほどの応募をいただいているそうです。

TSUKUMO 店舗情報

hopstepsing.com

ハンズオンの構成

以下のような構成にしてみました。

  • ハンズオン概要
  • 基礎:Unity超基礎
  • 実践:VRでユニティちゃんを触ってみよう
  • 応用:アレンジしてみよう

第一回資料
VR道場 Unity × Oculus Touch ~VRで手を動かしてみよう~

第二回資料

www.slideshare.net

ハンズオン概要

ハンズオン自体の概要を説明。自己紹介と、ユニティちゃん / Hop Step Sing! ライセンスの話も。

基礎:Unity超基礎

Unityの入手方法(ハンズオンでは予めインストールしたものを使用) ~ 簡単な操作方法まで。

実践:VRでユニティちゃんを触ってみよう

5ステップに段階を設定し、ほぼドラッグアンドドロップのみでできるようにしました。イメージは3分クッキングです。

応用:アレンジしてみよう

各人が好きなアレンジをできるようにして欲しいとのことだったので、コードを書かずにできるようにしました。 モデル変更、モーション変更、Hop Step Sing! モデルの観賞の3つです。

留意したこと

ハンズオンの対象者が「今までUnityを触ったことのない人」かつ、ハンズオン中には「プログラミングの知識・経験を一切必要とせず、プログラミングを行わない」という条件でした。 自分の中ではもう当たり前になってしまっていることなどにも、細やかな配慮が必要だと気づきました。以下、箇条書きで挙げておきます。

「Unityが初めての人」へ

  • シーンを再生中の作業は消えてしまうことへの注意
  • こまめに作業のセーブをするよう呼びかけ
  • 画面のレイアウトを揃える(説明画面とタブの位置が違うだけでも戸惑ってしまうようでした)
  • あらかじめプロジェクトを開いた状態にする(なにかポップアップが出るなど、説明外のことがあると戸惑ってしまうようでした)
  • スクリーンショットを多用し、口頭説明ではゆっくり繰り返し説明する(特に、オブジェクトの親子構造が複雑だと戸惑いがちでした)

VRに不慣れな方へ

  • VR体験したことがあるかなど聞き、その様子によって説明の分量を調節する
  • Riftの被り方を説明する
  • Touchの持ち方を説明する

おわりに

実は、自分が先生だなんておこがましいかなあと思っていましたが、お声を掛けていただいたときに「初心者にやさしく教えてくれそう」と言っていただいたのが嬉しかったこともあり、先生役を務めさせていただいてます。どうすれば分かりやすいかなあ、スムーズに進められるかなあ、と試行錯誤しつつ頑張ってます。前回「楽しかった」と感想をいただけたのが嬉しいしありがたいなあと思いました。資料のここはこうしたらいいんじゃない?や、こんなことも気にしたらいいんじゃない?なんてことがありましたら、気軽に教えてください。

OcuFesに出展したものまとめ

概要

OcuFes(次回からJapan VR Fest)に出展させていただいたものについてまとめておきます。 以下の2つです。

「ちびミクさんとあそぼ!」

概要

youtu.be

バレンタインライブが終わった後のミクさんにプレゼントを渡しに行きます。 特にクリア目標などはなく、ただミクさんをつんつんしたい、いちゃいちゃしたいと思って作りました。
プレイヤー視点ではミクさんの等身が小さく見えています。手に持った割りばしでキャンディを操作しています。プレゼントは視線選択です。

環境

備考

  • 目標・コンセプト

    • ストーリーにスタートとゴールを作る。
    • ミクさんは、やりすぎなくらい思いっきり、あざとくする。ファンシー全開にする。
  • MMDモデル / モーションに関して
    本来、MMDにおいての使用を前提としているものを、個別にご相談をして使用許可を得ました。 MMDモデル / モーションの作者さま方、ご厚意をいただきありがとうございました。

  • メモ 「ミクさん可愛いなあ」、「ミクさんにきゅんきゅんさせたい」と思いながら作りました。体験中にミクさんが可愛いと言ってくださる方もちらほらいたので嬉しかったです。できることに対して体験時間が長かったかもしれない。時間短縮もしくはリアクションや操作可能な対象を増やしてもよかったかもしれない。何をしていいかわからないという意見もあった。ただいちゃいちゃしたかっただけだけれど、ゲームとして作るなら、目標があるほうがプレイヤーを迷わせてしまわなさそう。

「Sweet Coaster」

概要

youtu.be

女の子とお茶を飲んでいたプレイヤーが、つい、うたたねをしてしまいました。夢の中でティーカップのジェットコースターが走り出します。
不思議の国のアリス」×「可愛いジェットコースター」がテーマです。「ジェットコースターを作る」研修課題で作成しました。

環境(すみません詳細忘れました)

  • ノートPC
  • Oculus Rift DK2
  • Unity
  • MMD4Mecanim
  • 扇風機
  • バニラオイル水

備考

  • 目標・コンセプト

    • ストーリーにスタートとゴールを作る。

    • そもそもジェットコースターってなんだろう?要件を満たしたうえでやや変化球を狙う。
      乗り物に乗って(なにかのものに自分が付随して)、スリリングな軌道で、(ある程度)速く移動する、が要件?

    • 先行のものとの差別化
      VRでジェットコースターは沢山ある。定番ネタだと思う。カッコいいものが多いので可愛い方向に振ってみる。

    • 酔い対策
      カーブが緩やかになるようにコース設定。速度も緩急をつけつつも全体的にゆっくりめにした。

    • 視覚、聴覚以外の体感を付与する 扇風機で風(触覚)、バニラオイル水を霧吹きで噴霧して甘い匂い(嗅覚)を感じさせる。

  • MMDモデル / モーションに関して
    同上

  • メモ
    気づいたら出展から一年くらい経っていて驚きました。きちんと記録に残していなかったのでちょっと後悔しつつ、掘り返して出てきたメモをまとめておきます。

wifi搭載マイコンでSlackに日本語投稿

概要

ESP8266(Arduino IDEで書けるwifi搭載マイコン)で、ボタンを押したらSlackに投稿できるようにしました。日本語も使えました。NodeMcu v3(Lolin)というESP8266搭載ボードを使いました(以降Lolin)。(名前が可愛いですね)。
弊社はSlackで出退勤やお休みや遅刻連絡のログを残しています。具体的には「おはようございます」や「ぞい」と投稿すると出勤時間が記録される、といったような感じです。以下に、ボタンを押すとSlackの任意のチャンネルに「ぞい」と投稿するスクリプトを載せます。
はじめての電子工作。先生(すぺしゃるさんくす):@izm

作業前の確認事項(初歩)

まず、LEDを光らせました。Arduino Unoと違ってLolinは内蔵LEDがないのでLEDを刺さなければいけませんでした。ピン配置図はボードの名前で検索すると出てきました。

f:id:nyanko_omori:20160814141607j:plain

これを見ながら、VCC GNDにLEDをつないで、ボードが生きてるか(初期不良がないか)確認をしました。 じわじわと熱くなるし、そのまま放置すると破裂すると聞いてこわごわ確認をしていました。(本当は抵抗が必要なんだそうです)。

スイッチ関連の確認

タクトスイッチ(INPUT_PULLUP)がLolinでも動くことを確認しました。 また、スクリプトチャタリングを防止する記述を書きました。 Lolinは書き込み速度が比較的遅い(らしい)ので、ProMicroで先にwifiを使わなくていい部分などの簡単な動作確認をしておきました。

f:id:nyanko_omori:20160801224237j:plain

slackへの投稿

以下の記事を参考にさせていただきました。

www.iotforest.com

Arduino IDEは内部ではutf-8ArduinoのシリアルモニタはSJISなのでシリアルモニタ上では文字化けしてしまいますが、Slackはutf-8なので文字化けせずにそのまま投稿することができました。

参考文献

以下の記事を参考にさせていただきました。

qiita.com

qiita.com

スクリプト

以下にスクリプトを載せます。 もしご使用の際は、適宜ご自身の環境に合わせて書き換えてください。 動作確認のために、Slackに投稿する際にLEDを光らせるようにしました。

#include <ESP8266WiFi.h>


int input=D5;
int led=D7;
//チャタリング防止
int prev=1;


// your wifi details
const char* ssid = "ssid";
const char* password = "pass";


// slack webhook host and endpoint information
const char* host = "hooks.slack.com";
const char* SlackWebhookURL = "url";


// SSL Certificate finngerprint for the host
const char* fingerprint = "fingerprint";

void setup() {
pinMode(input, INPUT_PULLUP);
pinMode(led, OUTPUT);

Serial.begin(115200);
delay(100); 
// We start by connecting to a WiFi network

Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("WiFi connected"); 
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void loop() {


int sensorVal = digitalRead(input);
//押してる間はsensorval=0;
//print out the value of the pushbutton
//スイッチオンになった瞬間に動作
if(prev==1 && sensorVal==0){
Serial.println(sensorVal);
Serial.println("find switch on");
}
//スイッチオフになった瞬間に動作
//ここでslackに書き込む
if(prev==0 && sensorVal==1){
Serial.println(sensorVal);
Serial.println("find switch off");


String channel = "#channel";
String username = "nyanko_omori";
String message = "ぞい";


Serial.print("connecting to ");
Serial.println(host);


// create a secure connection using WiFiClientSecure
WiFiClientSecure client;
const int httpPort = 443;
if (client.connect(host, httpPort)) {


// verify the signature of the ssl certificate
if (client.verify(fingerprint, host)) {
Serial.println("ssl cert matches");
} else {
Serial.println("ssl cert mismatch");
}

String PostData="payload={\"channel\": \"" + channel + "\", \"username\": \"" + username + "\", \"text\": \"" + message + "\", \"icon_emoji\": \":ghost:\"}";
Serial.println(PostData);

client.print("POST ");
client.print(SlackWebhookURL);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(host);
client.println("User-Agent: ArduinoIoT/1.0");
client.println("Connection: close");
client.println("Content-Type: application/x-www-form-urlencoded;");
client.print("Content-Length: ");
client.println(PostData.length());
client.println();
client.println(PostData);

delay(500);

// Read all the lines of the reply from server and print them to Serial for debugging
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}

Serial.println();
Serial.println("closing connection"); 
}

delay(6000);




}
prev = sensorVal;

delay(10);
// Keep in mind the pullup means the pushbutton's
// logic is inverted. It goes HIGH when it's open,
// and LOW when it's pressed. Turn on pin 13 when the
// button's pressed, and off when it's not:

if (sensorVal == HIGH) {
digitalWrite(led, LOW);
} else {
digitalWrite(led, HIGH);
}


}

あんまりにもアレだったので

過去の記事をいったん非公開に。放置しすぎた(´・ω・`)