三次元空間データの新しい形?IVR展2015にて点群データについて聞いてきました。

 

こんにちは!神奈川工科大学 情報学部 情報メディア学科 3学年の須貝孝明です。

本記事では自分がIVR展に行って、見てきたブースについて聞いたこと・感じたことをお伝えします。

 

「きもと」

20150625162103
点群データビューアで見た工場の点群データ

まずお伺いしたのがこちらの「きもと」ブース。ここでは特殊なスキャナーによってスキャンされた膨大な点群データを高速でビジュアル化できるという超高速データビューアが展示されていました。この点群データの1つひとつには座標の情報と、色(RGB)の情報が含まれているので膨大なデータ量になるのですが、それをより早くビジュアル化できるというのはすごいことですね。撮影した画像の解像度のせいもあって、ただの写真のようにも見えますが、これも点群データです。拡大すると点の間隔が大きくなって、点群データであることが分かります(差分用意できませんでした)。

お話を聞いていく中で、さきほどの画像(建物はきもとの工場の点群データだそうです)のような広大な点群データがどのようにスキャンされているのか気になったので「きもと」の方に質問したところ、これらの点群データをスキャンするのに使用したスキャナーが展示されているというお話を伺ったので早速見に行きました。

 

「三徳商事」

こちらの「三徳商事」ブースでは先ほどお聞きした3Dレーザスキャナー「Z+F IMAGER 5010C」( www.san-toku.co.jp/JOHOweb/p_ZF.html )の姿がありました。ゆっくりと水平回転しながら中心の黒い部分が垂直回転しています。こうやって全方位360度の点群データをスキャンしているのですね。ちなみにこのスキャナーを開発しているのはドイツのZ+F社で三徳商事はZ+F社製品の国内正規輸入代理店ということだそうです。このスキャナーはお話によると、工場を持っている人が工場に機械が入るかどうか確かめるのに使用されたり、文化財や事件現場の空間データ保存の目的で使用されたりしているようです。

他にも、このブースではHMDを使った危険・事故体感ソフトも展示されており、セミナー内で近い研究をしていた私にはとても興味深いお話が聞けました。

 

最後に

今回これらの技術を間近で見て、近い将来、この膨大な点群データの技術がVRでの三次元空間構築や、ネットワーク間での三次元空間の高速表示・共有などに応用され、シリアスな用途だけでなく、エンターテイメントVR業界でも役立つ技術になってくれたらおもしろいなと思いました。

急ぎ足でしたが自分の見たものを説明しました。いかがだったでしょうか?うまく説明できていたか分かりませんが、今回IVR展へ行ったことはとてもいい経験になりました。

きもとの皆さん、三徳商事の皆さんご協力ありがとうございました。

私が白井研究室セミナーを通して学んだこと(齊藤弘朗)

11805922_436792039838865_1059627164_n

こんにちは、神奈川工科大学情報学部情報メディア学科
学籍番号1323133の齊藤弘朗です。
今回は私は前期セミナー配属で白井研究室セミナーに配属されました。先日で最後の講義が終了しましたので私が白井研究室セミナーで行ったこととそこから学んだことを書いて行きたいと考えています。私が白井研究室で行った主なことは2つあります。

1つ目にIVRCの企画書と企画概要の制作と提出

2つ目に自分のやりたいことであるオンラインゲームについての
本を読み知識を深める

以上の2つのことです。

まず一つ目に1つ目のIVRCについてです。

まずIVRCとは正式名称は国際学生対抗バーチャルリアリティコンテストと言い、学生が企画・制作した作品を作品の新規性、技術的チャレンジ、体験のインパクトを競うコンテストです。このコンテストは1993年から開催されています。

まず私たちがIVRCに提出する企画書を作るためにしたことは各自別々の年度の過去作品を調べ過去のどのような作品が存在していたのかと言うことを調べました。
これを行うことで過去にあった作品との差別化を行いました。

次にどのような作品を作るかの意見を出し合ってそこから各自チームに分かれての制作になりました。
チームでの作業も最初はどのような形で意見を実装するのかと言う点とその技術は過去の作品で使われていないのかということと、技術的な挑戦があるのかと言うことを考えていきました。そうやって意見を詰めていき企画書を作り上げていきました。
はじめはわからない事だらけで何からどうはじめていけばよいかわからなかったり、チーム内での連絡がうまく取れずなかなかうまく進みませんでしたが、先生や先輩方、他のチームの人たちに添削やレビューを行ってもらったり最後はお互いうまく協力し合うことによって企画書を無事に仕上げることができました。

最終的に提出した企画は通りませんでしたが。
私はこの企画書を作ることにとってチームで動く際の連絡の重要性と、過去の作品を調査して同じような作品があってもそれとの差別化をすることと、過去の作品から発想を得ることの大切さを学ぶことができたと感じています。

以下に実際に仕上げた企画概要の画像です。

 

企画概要

 

 

次に自分のやりたいこととして、私はオンラインゲームに対する理解を深めるということを行いました。
このとき使った資料はオンラインゲームのしくみ
Unityで覚えるネトワークプログラミングという本を参考にして行いました。

はじめただオンラインにするだけと甘く見ていましたが実際に読み進めて行くと接続と切断や相手との通信のタイミングなど考えることが多く予想以上に大変でした。

しかしこのオンラインゲームのしくみと言う本ではサンプルをネットで配布しているので簡単に実行結果を見ることができます。なのでそのサンプルを実行しながら本に書いてある解説を読んでい少しずつでしたが理解することができました。

オンラインゲームについて何も知らない自分がネットワークプログラミングについて理解を深めるための取っ掛かりを作るための資料としてとてもわかりやすい教材であったと感じています。

これからは、まだ全てのサンプルを理解することができていないのでその理解と自身で一つ作品を作ることを目標としていきたいと考えています。

ここからは白井研究室セミナー全体を通して学んだことを書いて行きたいと思います。
はじめに自身の情報を発信することの重要性を学びそこからブログの書き方を学びました。 IVRCでは企画書の書き方やチームで動くことの難しさや楽しさを学ぶことができたと感じています。
IVR展に行くことで今どのような技術が使われているのか最先端の技術の一端を見ることができとても貴重な体験であったと感じています。
最後に行った自分のやりたいことでは、自分で目標を設定しそこから行動を起こしていくということをしなくてはいけませんでした。ここから私は一人で物事を進めて行く大変さというものを学ぶことができたと感じています。

最後になりますがセミナーを受講した感想を書きたいと思います。

正直私はこのセミナーが第一希望ではなく配属された当初はあまりモチベーションが高くありませんでした。しかし、セミナー内でのディスカッションやIVRCやIVR展、日本未来館に行くなど様々な課外活動を通し自分にとって新しい発見がいくつもありました。

モチベーションが低い自分がいることを内心快く思っていなかった人もいるかもしれませんが、この約3ヶ月付き合ってくださりありがとうございました。私はとても充実した3ヶ月を過ごせたと感じています。
ここでの経験を生かし更に自分を高めることができるようこれからも精進して行きたいと考えております。

最後にIVRCやセミナーについて相談に乗っていただいた先輩方および先生に感謝を、一緒にセミナーを受け苦楽をともにしたメンバーに感謝を述べたいと思います。

この約3ヶ月間、迷惑を掛けたりもしましたがここまでお付き合いいただきありがとうございました。

 

白井研究室セミナーを通して学んだこと(菊崎駿介)

こんにちは、神奈川工科大学情報メディア学科3年生の菊崎駿介です。

先日で最後のセミナー授業が終わりました。
今回は今までのセミナーでどういうことをやってきたか、そして学んだことをまとめていきます。

IVRC2015

前半は「IVRC2015」出場を目指し、同じセミナー生の強矢君と協力して『めかくしんどう -BliVib-』の企画書、企画梗概作りを行いました。
以下はめかくしんどうの企画梗概になります。
めかくしんどう_企画梗概

まずはじめに企画アイディアを考えるにあたって、過去IVRCで発表された作品の調査と既存研究の調査を行い、考えたアイディアの新規性を確認しました。
既存研究の調査はIVRCだけではなく、オリジナルの作品開発や研究でも必須の手順なのできちんと覚えておきたいです。

アイディア出しから予備実験、試作機開発、ワードでの企画書作りといった一連作業を期限内に終わらせるにはチームでの連携が重要ですが、最初は連絡不足で話し合いの場が少なく、結果的に一連作業のスタートがかなり遅れてしまうことになってしまいました。このことから連絡の重要性を学び、以降はお互いの状況を報告しあうようになりました。

企画書にかぎらずですが、自分の作ったものをより良いものにするためには誰かの評価が必要です。企画書作りにあたって、何度も先生や先輩方のレビューをいただき修正を繰り返しました。このことから途中経過でも頻繁にレビューしていただくことが大切だと学びました。

先輩の論文レビュー

後半は卒業論文の書き方を学ぶため、白井研究室の先輩方が「第20回日本バーチャルリアリティ学会」で発表する論文のレビューを行いました。
先輩の論文をレビューしていて気づいたこと、考えたこと箇条書きでまとめていきます。

・文章中に「の」が連続してしまうと違和感を感じること(例、○○の△△は□□の~)
解決方法として言い回しを変える、または句読点で区切ってしまうのが良いと思われます(例、○○は△△である。□□は~)

・主語と結び間の記述が長いと、主語を見失ってしまう(例、○○を……より△△する)
解決方法として主語を結びの直前に持ってくるのが良いと思われます(例、……より、○○を△△する)

・文章間で表現は統一する(例、合わせて、合体させて)
この場合はどちらかで統一します。

・文章中の引用で、引用元名称はきちんと書く(例、[1]で示された~)
突然記号が出てくると違和感を感じます。解決方法として「引用[1]では」「○○[1]」のように書くと良いと思われます。

他の人の文章を読んでみると、今まで意識してこなかった書き手順が見えてきました。
しかしいざ自分で書くとなると難しいところです。何度も文章を書いてレビューを受けることが大切だと学びました。

まとめ

私が半年間のセミナー授業で学んだ一番のことは「作ったものを評価してもらう大切さ」です。
自信のない作品、文章だからこそ、誰かの目に触れることを恐れるのではなく、むしろ積極的に発表して評価されなければ改善することができないからです。
今後作るものは必ず友人、先生に見せて評価をしていただくことを意識していきます。

白井先生、先輩方、セミナーの皆さん、半年間ありがとうございました。
これからもどうぞよろしくお願い致します。

コミックマーケットにおける実践的マーケティングの研究

こんにちは!神奈川工科大学 情報学部 情報メディア学科 3学年の山口裕太です。
今回は「コミックマーケットにおける実践的マーケティングの研究」についてお話したいと思います。

まずみなさん「コミックマーケット」というものをご存知でしょうか?
コミックマーケット(通称コミケ)とは、年2回(夏と冬に)開催をしている日本最大級のマンガ・アニメ・ゲームなどの同人即売会のことで、参加者が50万人を超える一大イベントです。毎年東京ビッグサイトにて行われていて、今年は8月14日から3日間行われます。

Comicmarket62_00
コミックマーケット会場内の様子

私は、このイベントでサークル(出店者)として参加します。その中で、今回は表題にもあるように「実践的マーケティングの研究」をしていこうと思っています。
参加者50万人いる中で、自分のサークルの前を通る人は1万人ほどだと思われます。その中で私の作品を見てくれるのはほんの一握り、さらに財布を開いてくれるのはもっと少ないのです。
私の作品を立ち止まってみてくれた人たちにどう訴えかけられるかが今回のポイントになっています。

10888548_1524096071172875_4699109345178086171_n
コミックマーケット 86 に参加した時の様子

私は去年も参加していました。ですが去年は無料配布での参加で、「モノを売る」ということをしていませんでした。今回は値段を付けて販売するため、その値段以上の付加価値をどれだけ出せるかが重要です。
去年実際にやって見ていってくれた人にはこんな方々がいました。

スライド06
見ていくお客様(最終発表スライドより)

こういった人たちに訴えかけられるモノを作っていく中で、私は一番伝えたい人としてさらなる狙いを付けました!

 

スライド07
目標のターゲット(最終発表スライドより)

実践的マーケティングを体験すると同時に「自分を売っていく」ということも意識しています。今後就職に向かっての糸口となるような、爪痕を残せるような、そんな機会にしたいと考えており、メタルスライムほどの確率の方々に「かいしん の いちげき!」を与えられるように頑張っていきます。

このセミナーを受け、IVRC企画書作成の時に得た「魅力的なパッケージングの方法」や、ニコニコ超会議での宣伝、ポートフォリオ制作で学んだ「自分を売り出すこと」を存分に活かし、今回のゴールである「興味を持ってくれた人(先生の経験則では全体の1〜3%)に訴えかけられるものを作る」「自分を買ってくれる人はどんな人なのかを調査」「自分を発信していく」ということを意識し、今回の研究及び自分の発信を成功させたいと思います!

 

ここまでご覧いただきありがとうございました!
もし会場に足を運ばれる方がいらっしゃいましたら是非お立ち寄りください!!

日時:8月16日(日)
会場:東京ビッグサイト 東地区 Rブロック 48b
サークル名:亜空間盆地

何かございましたら私の Facebook までお願い致します。

山口裕太の Facebook ページ

プログラミングができない大学3年生がオンラインゲーム作りに挑戦する。

こんにちは、神奈川工科大学情報学部情報メディア科3年の齊藤です。今回私はUnityを使ったオンラインゲームの開発に挑戦したいと考え行動しました。
そして私は私と同じようにオンラインゲームに興味を持ち作りたいと考えている人たちの助けになるようにと私が参考にした本と自分が行った流れをこのブログに載せていこうと考えました。

私が使った本は河田匡稔著の「オンラインゲームのしくみ Unityで覚えるネットワークプログラミング」という本です。
本の内容に触れる前に一つ注意事項があります。
この本はタイトルにある通りUnityを使って様々なサンプルを実行するためUnityのインストールが必須になりますのでご注意ください。
以下この本を書いてくれた著者に感謝して記事を書いて行きます。

1章ではオンラインゲームを作るうえで考えていかなくてはいけないことやオンラインゲームならではの考え方などが載っています。正直なところ速くサンプルを使ってみたいという人たちからすると読み飛ばしたくなる場所ではあるかもしれないですが、個人的には軽くでもいいから一通り眼を通すべき場所だと思いました。
前知識なしで飛ばしてしまおうと考えた人でも1.3は確実に読んでもらいたいと感じました、個々では本書を読み進めるにあたってというタイトルで本の構成やサンプル、用語についてと、あるので本書を読み進める上で助けになります。

2章では通信プログラムの基礎知識というタイトルで通信の仕組みについてや送受信プロトコルであるTCPとUDPの違いなど、通信についての基礎知識の紹介になります。
TCPとUDPについて知っているからといってこの部分を全て飛ばさないでほしいと私は考えます。この章では基礎的な部分に加えオンラインゲームでよく使われるプロトコルや通信の遅延に対しどのように考えるべきかが書かれています。

3章から待ちに待ったサンプルプログラムを使用した演習になって行きます。3章ではソケットプログラムを用いたデータの送受信のサンプルを使います。

実行画面は以下のもののように非常に地味なものであります

サンプル実行画面

空白の部分に相手のIPアドレスかあるいはローカルホストでテストを行うならばlocalhostと入力して自分をサーバーとして動かすか、サーバーに接続するかを選択します。
相手との接続が成功していればサンプルが入っているファイルのbinフォルダの中にあるTCPを使ったサンプルのほうならばSocketSampleTCP_Dataを開いてUDPならばsocketSampleUDP_Dataを開く、そうすると中にoutput_log.txtができておりこれが通信の履歴になります。

ここからプログラムの解説を行いたいと思います。
まずはじめに待ち受けようのソケットの生成を行います。

// 待ち受け開始.
void StartListener()
{
Debug.Log("Start server communication.");

// ソケットを生成します.
m_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 使用するポート番号を割り当てます.
m_listener.Bind(new IPEndPoint(IPAddress.Any, m_port));
// 待ち受けを開始します.
m_listener.Listen(1);

m_state = State.AcceptClient;
}

こちらにm_listenerと言う変数がありますね?こちらが待ち受けを行う専門のソケットでリスニングソケットと呼ばれるものです。
そしてそのすぐ下の部分でソケットの種類をStreamと選択しプロトコルをTCPと指定しています。その次にm_listenerにポート番号を割り当てます。そして最後に待ち受け状態にするためにListen関数を呼び出します。

次にクライアントからの接続要求受付についてです。

// クライアントからの接続待ち.
void AcceptClient()
{
if (m_listener != null && m_listener.Poll(0, SelectMode.SelectRead)) {
// クライアントから接続されました.
m_socket = m_listener.Accept();
Debug.Log("[TCP]Connected from client.");
m_state = State.ServerCommunication;
}
}

サーバーはクライアントからの接続要求の受付を行うためにこちらのAccept関数を呼び出します。この関数はクライアントからの接続要求があるまで処理をブロッキングします。
ブロッキングとは呼び出した関数の処理が完了するまで処理の制御が帰ってこないようにすることです。
しかしこのままだとゲームを作る際にブロッキングされてしまうとゲームとして成り立たなくなってしまうためPoll関数でクライアントからのデータ受信を監視して、データを受信したときだけACcept関数を呼び出すようにします。
Poll関数とは複数のファイルディスクリプタを監視、制御するものである。
ファイルディスクリプタで処理を待ち合わせるシステムコールを実行すると、データが到着するなどの一連の処理が完了するまでシステムコールから処理制御がリターンされなくなります。

次にサーバーへの接続、メッセージの送信、通信の切断の説明です。

void ClientProcess()
{
Debug.Log("[TCP]Start client communication.");

// サーバへ接続.
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ・・・①
m_socket.NoDelay = true; ・・・②
m_socket.SendBufferSize = 0;
m_socket.Connect(m_address, m_port); ・・・③

// メッセージ送信.
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, this is client.");
m_socket.Send(buffer, buffer.Length, SocketFlags.None);

// 切断.
m_socket.Shutdown(SocketShutdown.Both);
m_socket.Close();

Debug.Log("[TCP]End client communication.");
}

サーバーとの接続を行うためのソケットの生成を行います。
m_soketにsoketクラスのインスタンスを生成します。これが①の部分です。次に小さなパケットをバッファリングしないようにSoket.NoDelayプロパティをtureにsoket.SendBufferSizeの値を0に設定する、これが②の部分です。最後にm_soketに接続先のIPアドレスとポート番号を指定して接続要求を行います、これが③の部分になります。

ソケットの送受信にはSend関数とReceive関数を使ってデータの送受信をすることができます。この2つの関数はペアで扱われる関数であり、Send関数で送ったデータをReceive関数を呼び出すことによってデータを取り出すことができるようになっています。

最後に切断についてです。通信を終了させるときはShutdown関数を使用してパケットの送受信を遮断します、そしてClose関数を使用して通信の切断を行います。

// 待ち受け終了.
void StopListener()
{
// 待ち受けを終了します.
if (m_listener != null) {
m_listener.Close();
m_listener = null;
}

m_state = State.Endcommunication;

Debug.Log("[TCP]End server communication.");
}

お互いに送信したデータを全て受け取ってから通信を終了させる場合は、Shutdown関数で送信だけ終了させて、全ての受信が終了してからClose関数を呼び出して終了します。

サーバーの待ち受けを終了する場合は、リスニングソケットを、Close関数を呼び出して破棄します。

UDPのソケットプログラミングではTCPと違い接続処理を行わずに通信することができる。なので待ち受けを行う必要がありません。
UDPの送信、受信ではSendTo関数とReceiveFrom関数を使用します。TCPのほうで使われていたSend関数とReceive関数と同じようにこの二つの関数はペアで扱われる関数でありUDP通信時(コネクションレス型のデータ送信時)にデータ送受信を行う関数です。
UDPでのポート番号の割り当てを行って通信可能になるまでのプログラムを以下に示します。

void SendMessage()
{
Debug.Log("[UDP]Start communication.");

// サーバへ接続.
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

// メッセージ送信.
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, this is client.");
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(m_address), m_port);
m_socket.SendTo(buffer, buffer.Length, SocketFlags.None, endpoint);

// 切断.
m_socket.Shutdown(SocketShutdown.Both);
m_socket.Close();

m_state = State.Endcommunication;

Debug.Log("[UDP]End communication.");
}

このように接続の処理がないだけでソースがかなり短くなります。

 

次に4章のチャットプログラムについての解説をします。チャットプログラムを作る際考えておくべきことがあります。それは会話の流れです。相手が送っている間自分が入力できないなんて仕様だと会話として成り立たなくなってしまいます。他にもチャットを打ち込んだはずなのに相手に届いていないという事態になってしまっても会話が成り立ちません。なので相手に確実にデータを届け、かつ相手とのデータのやり取りで片方が待たなくてはいけないという状況を作らないようにしなくてはいけません。

このプログラムは確実にデータを届けるためTCP通信を使います。なので通信ライブラリ、TransportTCPクラスを使用を使用して作成されています。
チャットプログラムはプレイヤーが自分でルームを作るか参加するかを選択するシーケンスと実際にチャットを行うシーケンスの2つで作られます。

チャット

はじめにチャットルームの選択を行う処理のソースについてです。

void SelectHostTypeGUI()
{
float sx = 800.0f;
float sy = 600.0f;
float px = sx * 0.5f - 100.0f;
float py = sy * 0.75f;

if (GUI.Button(new Rect(px, py, 200, 30), "チャットルームの作成")) {

m_transport.StartServer(m_port, 1);

m_state = ChatState.CHATTING;
m_isServer = true;
}


Rect labelRect = new Rect(px, py + 80, 200, 30);
GUIStyle style = new GUIStyle();
style.fontStyle = FontStyle.Bold;
style.normal.textColor = Color.white;
GUI.Label(labelRect, "あいてのIPあどれす", style);
labelRect.y -= 2;
style.fontStyle = FontStyle.Normal;
style.normal.textColor = Color.black;
GUI.Label(labelRect, "あいてのIPアドレス", style);

Rect textRect = new Rect(px, py + 100, 200, 30);
m_hostAddress = GUI.TextField(textRect, m_hostAddress);


if (GUI.Button(new Rect(px, py + 40, 200, 30), "チャットルームへの参加")) {
bool ret = m_transport.Connect(m_hostAddress, m_port);
if (ret) {
m_state = ChatState.CHATTING;
}
else {
m_state = ChatState.ERROR;
}
}
}

この部分でサーバーとなるかクライアントを選ぶかで接続の方法を変えています。サーバーとして部屋を作るボタンを選択すると3章であったようにStartSeaver関数を呼び出し待ち受け状態になり相手からの接続を待ちます。
既存のサーバーに接続する際はテキストに記入された相手のIPを読み取りそのIPアドレスに接続します。サーバーに接続できればチャットに移行し、接続に失敗すると再度チャットルームの選択に戻ります。

次にチャットルームでのメッセージのやり取りの部分になります。

enum ChatState {
HOST_TYPE_SELECT = 0,    // ルーム選択.
CHATTING,                // チャット中.
LEAVE,                    // 退出.
ERROR,                    // エラー.
};

 

void Update()
{
switch (m_state) {
case ChatState.HOST_TYPE_SELECT:
for (int i = 0; i < CHAT_MEMBER_NUM; ++i) {
m_message[i].Clear();
}
break;

case ChatState.CHATTING:
UpdateChatting();
break;

case ChatState.LEAVE:
UpdateLeave();
break;
}
}


void UpdateChatting()
    {
        byte[] buffer = new byte[1400];

        int recvSize = m_transport.Receive(ref buffer, buffer.Length);
        if (recvSize > 0) {
            string message = System.Text.Encoding.UTF8.GetString(buffer);
            Debug.Log("Recv data:" + message );
            m_chatMessage += message + "   ";// + "\n";

            int id = (m_isServer == true)? 1 : 0;
            AddMessage(ref m_message[id], message);
        }    
    }
    

Update部分はチャットを退出するまで繰り返すというものである。
UpdateChatting関数は送受信するメッセージをキャラクターごとのバッファに保存されます。このバッファはm_messageに保管されています。

次にチャットの送受信を行う部分のソースについてです。

void ChattingGUI()
{
Rect commentRect = new Rect(220, 450, 300, 30);
m_sendComment = GUI.TextField(commentRect, m_sendComment, 15);

bool isSent = GUI.Button(new Rect (530, 450, 100, 30), "しゃべる");
if (Event.current.isKey &&
Event.current.keyCode == KeyCode.Return) {
if (m_sendComment == m_prevComment) {
isSent = true;
m_prevComment = "";
}
else {
m_prevComment = m_sendComment;
}
}


if (isSent == true) {
string message = "[" + DateTime.Now.ToString("HH:mm:ss") + "] " + m_sendComment;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message);
m_transport.Send(buffer, buffer.Length);
AddMessage(ref m_message[(m_isServer == true)? 0 : 1], message);
m_sendComment = "";
}


if (GUI.Button (new Rect (700, 560, 80, 30), "退出")) {
m_state = ChatState.LEAVE;
}


// とうふやさん(サーバ側)のメッセージ表示.
if (m_transport.IsServer() ||
m_transport.IsServer() == false && m_transport.IsConnected()) {
DispBalloon(ref m_message[0], new Vector2(200.0f, 200.0f), new Vector2(340.0f, 360.0f), Color.cyan, true);
GUI.DrawTexture(new Rect(50.0f, 370.0f, 145.0f, 200.0f), this.texture_tofu);
}

if (m_transport.IsServer() == false ||
m_transport.IsServer() && m_transport.IsConnected()) {
// だいずやさんの(クライアント側)のメッセージ表示.
DispBalloon(ref m_message[1], new Vector2(600.0f, 200.0f), new Vector2(340.0f, 360.0f), Color.green, false);
GUI.DrawTexture(new Rect(600.0f, 370.0f, 145.0f, 200.0f), this.texture_daizu);
}
}

この部分には3つの処理が存在しており1つ目が相手にメッセージを送るもの、2つ目に退出ボタンが押されているかの監視をして押されたときに退出処理をするものです。3つ目にメッセージを受信してそれを表示するものです。

最後に通信を切断行う部分についてです。

void UpdateLeave()
{
if (m_isServer == true) {
m_transport.StopServer();
}
else {
m_transport.Disconnect();
}

// メッセージの削除.
for (int i = 0; i < 2; ++i) {
m_message[i].Clear();
}

m_state = ChatState.HOST_TYPE_SELECT;
}

次に5章のターン製ゲームについてです。
サンプルでは3目並べのゲームを制作して行きます。
こちらのゲームはチャットプログラムのように好きなときに操作できてしまうとゲームとして成り立たなくなってしまいます。
なので相手の操作が終わるまで自分の操作ができないようにする必要があります。しかしそうするといつまでも相手が時間を掛けてしまうとゲームのテンポが非常に悪くなってしまいます。
上記の点について考えてゲームデザインを設計して行かなければいけません
ソースについて書いて行きます。

はじめに自分のターンかを判定する部分です

public class TicTacToe : MonoBehaviour {

// ターン種別.
private enum Turn {
Own = 0,        // 自分のターン.
Opponent,        // 相手のターン.
};

// 現在のターン.
private Mark            turn;

// ローカルのマーク.
private Mark            localMark;

// リモートのマーク.
private Mark            remoteMark;

ここでは自分がマークを置く順番かを判定しています。

次に全体のターンの処理の部分になります

void UpdateTurn()
{
bool setMark = false;

if (turn == localMark) {
setMark = DoOwnTurn();

//置けない場所を押されたときは、クリック用のSEを鳴らします.
if (setMark == false && Input.GetMouseButtonDown(0)) {
AudioSource audio = GetComponent<AudioSource>();
audio.clip = se_click;
audio.Play();
}
}
else {
setMark = DoOppnentTurn();

//置けないときに押されたときは、クリック用のSEを鳴らします.
if (Input.GetMouseButtonDown(0)) {
AudioSource audio = GetComponent<AudioSource>();
audio.clip = se_click;
audio.Play();
}
}

if (setMark == false) {
// 置き場を検討中です.
return;
}
else {
//マークが置かれたSEを鳴らします.
AudioSource audio = GetComponent<AudioSource>();
audio.clip = se_setMark;
audio.Play();
}

// マークの並びをチェックします.
winner = CheckInPlacingMarks();
if (winner != Winner.None) {
//勝ちの場合はSEを鳴らします.
if ((winner == Winner.Circle && localMark == Mark.Circle)
|| (winner == Winner.Cross && localMark == Mark.Cross)) {
AudioSource audio = GetComponent<AudioSource>();
audio.clip = se_win;
audio.Play();
}
//BGM再生終了.
GameObject bgm = GameObject.Find("BGM");
bgm.GetComponent<AudioSource>().Stop();

// ゲーム終了です.
progress = GameProgress.Result;
}

// ターンを更新します.
turn = (turn == Mark.Circle)? Mark.Cross : Mark.Circle;
timer = turnTime;
}

この処理では自分のターンであればマークを配置し、相手のターンであれば相手がマークを配置するのを待ちます。

次に自分のターンの処理についてです。

// 自分のターンの時の処理.
bool DoOwnTurn()
{
int index = 0;

timer -= Time.deltaTime;
if (timer <= 0.0f) {
// 時間切れ.
timer = 0.0f;
do {
index = UnityEngine.Random.Range(0, 8);
} while (spaces[index] != -1);
}
else {
// マウスの左ボタンの押下状態を監視します.
bool isClicked = Input.GetMouseButtonDown(0);
if (isClicked == false) {
// 押されていないのでなにもしません.
return false;
}

Vector3 pos = Input.mousePosition;
Debug.Log("POS:" + pos.x + ", " + pos.y + ", " + pos.z);

// 受信した情報から選択されたマスに変換します.
index = ConvertPositionToIndex(pos);
if (index < 0) {
// 範囲外が選択されました.
return false;
}
}

// マスに目を置きます.
bool ret = SetMarkToSpace(index, localMark);
if (ret == false) {
// 置けない.
return false;
}

// 選択したマスの情報を送信します.
byte[] buffer = new byte[1];
buffer[0] = (byte)index;
m_transport.Send (buffer, buffer.Length);

return true;
}

自分のターンではマウンスからの入力を受け付け配置するマス番号を算出する処理、算出したマス番号にマークを配置する処理、配置したマス番号のデータを相手に送信する処理の3つで成り立っています。

次に相手の処理についてです。

// 相手のターンの時の処理.
bool DoOppnentTurn()
{
// 相手の情報を受信します.
byte[] buffer = new byte[1];
int recvSize = m_transport.Receive(ref buffer, buffer.Length);

if (recvSize <= 0) {
// まだ受信していません.
return false;
}

// サーバなら○クライアントなら×を指定します.
//Mark mark = (m_network.IsServer() == true)? Mark.Cross : Mark.Circle;

// 受信した情報から選択されたマスに変換します.
int index = (int) buffer[0];

Debug.Log("Recv:" + index + " [" + m_transport.IsServer() + "]");

// マスに目を置きます.
//bool ret = SetMarkToSpace(index, mark);
bool ret = SetMarkToSpace(index, remoteMark);
if (ret == false) {
// 置けない.
return false;
}
return true;
}

相手のターンでは相手から配置するマス番号の情報を受信する処理と受け取ったマス番号からマークを配置する処理の2つから成り立っています。

次にゲーム開始についての部分についてです。
ここでゲームの初期化を行います

// ゲーム開始.
public void GameStart()
{
// ゲーム開始の状態にします.
progress = GameProgress.Ready;

// サーバが先手になるように設定します.
turn = Mark.Circle;

// 自分と相手のマークを設定します.
if (m_transport.IsServer() == true) {
localMark = Mark.Circle;
remoteMark = Mark.Cross;
}
else {
localMark = Mark.Cross;
remoteMark = Mark.Circle;
}

最後にエラー処理についてです

// イベント発生時のコールバック関数.
public void EventCallback(NetEventState state)
{
switch (state.type) {
case NetEventType.Disconnect:
if (progress < GameProgress.Result && isGameOver == false) {
progress = GameProgress.Disconnect;
}
break;
}
}
}

この部分は回線切断などのゲームに大きな影響を与えてしまう通信エラーが起こってしまったときに呼び出されます。そしてゲームのモードが切断状態のGame.Progress.Disconnectに変更されます。

現状自分ができたのはここまです。
自分がここまでやるのにはおおよそ5時間くらいかかりました。
サンプルの実行だけならば1時間も必要ないのですがそれの理解となると
オフラインのものと違うところが多く時間がかかってしまいました。
サンプルはネットで配布されているのでそれをダウンロードすれば実行結果もソースもすぐに見ることができます。良ければ本も見ていただければ幸いです。

オンラインゲームを作ろうとしている人の助けになっていれば幸いです。

参考文献
・オンラインゲームのしくみ
「Unityで覚えるネットワークプログラミング」

 

白井研究室セミナーを通して学んだこと(藤澤佳記)

こんにちは。神奈川工科大学情報メディア学科の藤沢です。

まず、私が神奈川工科大学のセミナーについて軽く触れて、それから学んだことを記していきたいと思います。

私が所属する情報メディア学科では、3年次前期に行う授業としてセミナーというものがあります。これは先生ごとに内容の異なる短期のゼミのようなものであり、授業をしながら研究室について学ぶことができます。

私はこのセミナーで白井先生の行うセミナーを選択しました。白井セミナーはIVRCという、日本バーチャルリアリティ学会が主催するコンテストへの企画作品の応募がメインテーマとなっており、私はそれに興味をもち、受講することを決めました。15回という短い期間の中で自身が学んだことや得たことを書いていきます。

初回から3、4回目まではブログの書き方やIVRCの過去の調査を行いました。

IVRCの過去の調査では、過去にどんな作品があったのか、それらを鑑賞しつつ、アイデアやその作品の主たるテーマなど、作品を作るうえで知っておくべき内容を調査するものでした。この結果はブログで報告しました。

ブログは、まさにこうして文章を書く方法を教えていただきました。最初の方ではIVRCの過去の作品の調査結果を報告する手法として紹介していただきました。現在はまとめとして、さまざまな文章を書いています。

5回目以降から10、11回目くらいまでは本格的にIVRCの企画を行いました。

まずチームを決め、そこからチームでの作業が続きます。私のチームは2人で、もう一人は同じ情報メディア学科の古田君という人でした。彼はすごく行動力のある人で、私が何もわからなくて手が出せなくているとき、一人で頑張ってくれていました。そんな彼に引っ張られるように動き出して、何度も試行錯誤を繰り返し、二人で一つの企画書を完成させました。私はこのとき、行動力、積極性の大切さを知り、それらをかなり高めることができました。

IVRCには企画書、及び企画梗概を提出しましたが、私はこれらに取り組むのが初めてであり、わからないことだらけでしたが、白井先生、先輩方、そして他チームの方に添削をしていただき、何度も何度も文章を校正していくことでチームの絆が深まると同時に意見もまとまっていきました。私は文章を何度も校正するうちに、自身には文章を“書く”力があることを発見することができました。眠っていた力が開花したようです。また、古田君と協力し、期限に向けて作業を共にしたり、それだけではなくたくさん迷惑をかけたことや助けてもらったことを含め、チーム、グループの大切さや重要さに気づくことができました。そしていまではチーム、グループワークで仲間と最大限力を発揮して作業に取り組む、そんな自信もあり、企画、そしてそれにむけたチーム作業を身を以て体験することができて本当に良かったと思っています。以下は企画梗概の画像です。

kougai

IVRCに応募した企画は通りませんでしたが、機会があればまた再挑戦してみたいと思っています。

IVRCの結果は、私のチームを含めほかのチームも企画が通らなかったため、自身のやりたいことを残りの授業で行うこととなりました。

私は同じ情報メディア学科の菊崎君とともに白井セミナーの先輩方の論文を添削する、ということを残りの授業で行うことに決めました。

最初に読み始めた時、なんとも難しいことが書かれていて、一人では理解するのが大変で菊崎君と一緒に添削を行っていました。時間もかかっていて効率が悪かったように思います。後々内容が理解できてくると、1つの論文を読む時間が短縮でき、さらに的確な添削ができました。普段、他人の文章をみて添削することはしないので、IVRCの企画作成で発掘した文章力がさらにここで向上しました。

論文添削時の画像を以下に紹介します。

20150729114818

 

文章力はインターンや就活、テストやレポートなど、多岐にわたる分野で存分に生かすことができるため、うれしい気持ちとこれからくるさまざまな課題にわくわくしています。

では、神奈川工科大学のセミナーを通して学んだことをまとめたいとおもいます。

ブログの書き方、企画書についての理解の向上、企画書の書き方、を学び、授業に取り組むうえで文章力が開花し、また、チームワーク、積極的に物事に取り組む姿勢、チャレンジ精神を養うことができました。先輩方とのふれあいや仲間、先生との話し合いの中で、意見を言い合い、ディスカッションにも慣れることができました。私がこのセミナー、そしてこのメンバーで取り組んだ企画や授業で多くのことを学び得て、たくさんの経験ができて、楽しかったし、なにより白井セミナーを選んでよかったと思っています。

最後になりましたが感想を述べたいと思います。

白井セミナーでは授業外かつ課外活動が多くて楽しかったです。白井先生をはじめ、研究室の先輩方や仲間のみんな、周りの人たちの明るい雰囲気が居心地がよくて、素直な気持ちで授業に参加できてとてもさわやかな気持ちです。今回のセミナーで学んだことを今後、フル活用できるように自身の力を高め、さらに多くの経験をしていきたいと思っています。

 

ここまでお付き合いくださり、ありがとうございました。

TEPIA先端技術館にてNHKの生放送をナマ体験(2015/7/18)

こんにちは!神奈川工科大学 情報学部 情報メディア学科 3学年の山口裕太です。

7月18日の早朝4時起きで「TEPIA 先端技術館」に行ってまいりました!
この先端技術館には、様々な分野の先端技術が展示・実演されています。神奈川工科大学の技術も多く展示されています。

IMG_3604
展示風景

今回は白井研究室の「ExPixel」がNHKの番組「おはよう日本」で生中継されるとのことなので、私はその展示のお手伝いをしてきました!

先端技術館に着くと早速NHKの放送車が!

IMG_3596
NHK中継車

NHKの中継車は初めて見ました。車 1 台で全国放送できてしまうんですね!!

我々も早速放送の準備を開始!
「ExPixel」もNHK特別仕様になりました。

IMG_3623
フィルターカット作業
IMG_3622
「ExPixel」NHK特別Ver

 

私たちが放送の準備をしている中、NHKの方々も打ち合わせしてリハーサルを行っていました。生放送なので中継時間に限りがあるため、時間を常に見ながら行っていました。プロの仕事を目の前で見て、リハーサルなどにおいて「他者からのレビュー」というものがどれだけ大切かということをより感じることが出来ました。最初は時間より何十秒もオーバーしていましたが、打ち合わせで「言葉選び」や「会話のテンポ・抑揚」などそのつど変えたり、「カメラワーク」や「各ブースへの導入」など計4回のリハーサルで我々がいつもテレビで見ている中継の形になっていました。
このように、他者の目がないと自己完結にしかなりません。レビューがあればあるだけよりよいものへと変化できます。リハーサルを通して見て、プロの人がいかにそこに力を入れているかを見ることが出来てよかったです。

IMG_3603
リハーサル・打ち合わせの様子

私たちもプロに負けぬよう、ExPixelの説明をアナウンサーさんに説明したりと、本番までの準備を進めていきました。

IMG_3621
アナウンサーさんとの情報共有

全ての準備が終わり、いよいよ本番!
出演するわけではないけれどもとても緊張していました。
いろいろな作品が紹介されていくのですが、ほとんどの技術がうまく動かず・・・。
心配が募るばかりでしたが、ExPixelは何の問題も無く中継することが出来ました!

 

中継が終了し、みんなホッとして拍手していました。NHKの方は「ここがしっかり動いてくれてよかった!ありがとう!」とコメントいただきました。

IMG_3618
中継終了後のホッと一息集合写真 (左からNHKの入田PD、牛田アナウンサー、神奈川工科大学より白井先生、山口、森先輩、柴本さん、富士通SSLの広報中村さんです)

あっという間の体験でしたが、生放送の大変さというものがすごく伝わって来ました。こうやってプロの方の仕事を間近で拝見できたのはとてもいい体験になりました。そこから得たものをこれから意識して役立てていこうと思います!

 

以上で今回のNHK中継のレポートとさせていただきます。最後までご覧頂きありがとうございました!

7/3 コンテンツ東京に行って来ました!

こんにちは!神奈川工科大学 情報学部 情報メディア学科 3学年の山口裕太です。

7月1~3日に東京ビッグサイトにて行われた「コンテンツ東京2015」に行ってまいりました。

IMG_3478

このイベントは、主に企業の方の商談のためのものなのですが、私は大学の授業の一環として先進技術を実際に触れてみようと思い、7月3日にこのイベントに参加させていただきました!

この「コンテンツ東京」では、6つの商談展が同時に行われています。「第4回 クリエイターEXPO」「第3回 プロダクションEXPO」「第1回 コンテンツマーケティングEXPO」「第5回 キャラクター&ブランドライセンス展」「第3回 制作・配信ソリューション展」「第1回 先進コンテンツ技術展」の6つです。私はその中で「第1回 先進コンテンツ技術展」を主に見学して来ました。

IMG_3494

このイベントの中で、私が見て・感じてきたものの一部を紹介したいと思います!

クリプトン・フューチャー・メディア株式会社

ミストプロジェクションシステム「Thru Graph」

IMG_3487

霧を下から吹き上げ、空気の膜で包んだスクリーンに、背面からプロジェクタで映像を投影することによって「ホログラムのような存在感のある映像を空間に投影できる」システムです。この装置は霧を吹き上げているだけなので自由に通過することが可能になっています。

私がこのブースの前に来たときに一番目に目に付いたのがこのシステムでした。下から霧が出てきて、そこに「初音ミク(同社開発 DTM ソフトウェアのキャラクター)」が投影されて驚きました。浮かんで見えるシステムはいくつか見て来ましたが、どれも装置は大きかったです。しかしこの装置は、地面とプロジェクタしか場所がとらないのでさまざまな使い方が出来そうです。アミューズメントパークなどにあったらとても目を引きますし、面白そうです。

 

リアルタイム 3DCG コントロールシステム「R3」

IMG_3489IMG_3488

モーションのデータや表情の動きなどをリアルタイムでコントロールできるシステムです。ライブ演出などのその現場の状況に合わせて自在に変化することが可能になっています。また、展示装置の「R3フィルム」は、映像プロダクション専用に開発された透過スクリーンとなっており、軽量でさまざまなサイズに対応することが出来ます。このシステムが実際に使われた例としては冨田勲さんの「イーハトーヴ交響曲」や、BUMP OF CHICKENさんの曲「ray」などでこの技術が使われていました。

このシステムを以前に聞いたことはあったのですが、実際に目にしたのは初めてでした。透過スクリーンに鮮明に映し出す技術や、リアルタイムで「初音ミク」の表情などを変化させることが出来る技術は体験してみてとても驚きました。コンサートシステムのみならず、他方で面白さを提供できるすばらしいシステムだと感じました。

 

こういった「新しい技術」を目の当たりにして、この先の未来のエンタテインメントがより楽しくなっていくと感じました。これからも技術が生まれていく中で、このような「エンタテインメントシステム」を私も開発できたらいいなと、こっそり闘志を燃やしたいい体験でした。頑張っていきたいです!

それでは最後までご閲覧ありがとうございました!

人生初Blog作成

エゴサーチかけたらチアリーダーが出てしまった古田真緒です。

人生で初めてBlog、「前期白井研究室セミナーBlog」を作ってみました。

 

クリックで検索ページへ→

 

クリックでFacebookページへ→

 

 

 

 

現在アプリゲームのレビューなどをやっていこうと考えているので、これからよろしくお願いします。

 

 

ソロでIVR展見学に行った

私本日IVR展に行ってまいりました。

自分がついたのが16時だったので2時間しか見学が出来ませんでしたがとても参考になる話が多い2時間だったと感じています。

私が見た企業のVR作品の中で私がオススメしたいと感じたものがありました。

いくつかあったVRのなかで積木製作さんのOculus Riftを使ったVR作品がオススメしたいと感じました。

DSC_0205
作品画像

非常にCGのクオリティが高く見ごたえがある作品でCGの作成にはUnityを使っているとの事でUnityでもここまでのクオリティのものが作れると知りとても驚きました。

他にもIVRのところにドローンを使用した技術を出展している企業が3社ほどあり驚きました。

今回IVR展に行き自分たちが提出した企画書のないように似た作品を見つけたおかげで、その作品との差別化や対象年齢などの設定を自分の中でまとめることができました。