黒澤優輝 – 白井研セミナー http://blog.shirai.la/seminar 神奈川工科大学 情報メディア学科 3年生 白井研究室セミナーでの学び Wed, 28 Feb 2018 23:24:58 +0000 ja hourly 1 https://wordpress.org/?v=5.1.6 パズルのピースを集める旅 (授業のまとめ) http://blog.shirai.la/seminar/2017/07/summary/ Tue, 25 Jul 2017 17:50:15 +0000 http://blog.shirai.la/seminar/?p=2829 続きを読むパズルのピースを集める旅 (授業のまとめ)]]> こんにちは(・∀・)

今回は大学3年前期の授業として行ってきたセミナーについてまとめます。

 

  • セミナーを履修する前の自分について

・ブログなどで情報を発信することに対して抵抗があった。

 →実際にやってみるといい勉強になる(特に技術系)ことが分かった。

 一番効率の良い勉強法は人に教える事なので、この勉強の仕方はいいと思いました。

 

・分かりやすく伝えることに対して、あまり意識をしていなかった。

 →どうすれば意思のすれ違いが起きないようにできるか、かなり意識をするようになった。

 

  • 今まで書いてきたブログの概要

・「挨拶&エゴサーチの結果

エゴサーチしてみた。特に目ぼしい結果はなかった。

・「個人的IVRCベスト3

好きな作品3つを挙げてみた。

・「絵を描けるようになりたい!

絵が本当に書けない(´Д⊂ヽ)。図学の教科書は買ったので夏休み中に頑張る!

・「最近の悩みの種

VR技術者認定試験どうするの?っていう話です。試験は無事合格しました。

・「レビュー & レビュー

企画案と本のレビューをしてみた。

・「触感型コントローラーUnlimitedHandを使ってみた!

タイトル通り使ってみて解説を書いた。

・「Knowledge is power

IVRCの企画書を書くうえで、「バーチャルリアリティ学」という本から得た知識が役に立ったという話です。

・「IVRC2017の審査結果

落選した。感想がもらえたことはうれしかった。

・「一生勉強 一生青春。←勉強って何?

勉強について思ったことをいろいろ書いた。

※「一生勉強一生青春」は相田みつをさんの名言です。

・「C#の便利な機能Linqについて

C#のLinqの紹介 Linqの概要を自分の言葉で説明してみた。

・「C#のLinqについての解説

C#のLinqの紹介2 メソッドを自分の言葉で説明してみた。

 

  • セミナーの感想

・ものすごい忙しかった。他の要因もあるがここまで忙しい状況を経験したことはなかった。

・他の授業とは形態が違うので新鮮だった

 

  • 夏休みにやりたいこと

・DirectXについての勉強

 本は買ってあるけど、忙しくなってからほとんど手を付けていない。

・ディープラーニングについての勉強

 なんか面白そうなので、やってみたい。

・イラストの練習

 まず、図学の勉強をして、その後にイラストについての本を買って勉強する。

 図学の教科書は買ってあるので後は手を動かす!

・Webサイトの開設

 C#で動的なページを作成したい。

 ASP.NETはかじる程度にはやったことがあるので、そこまで大変ではないはず…

・ゲーム制作

 ゲームの案を立てるぐらいまでは進めたい。後期も授業があまりないので、ゲーム制作の時間に費やそうかな…

・音楽制作

 2年後期と3年前期の授業で音楽制作について勉強したので実際に作ってみる。

・遊ぶ

 ゲームソフトやCDが積まれているので遊びたい。

 

全てをこなすには時間的に無理!! まあ、やれるところまで頑張ってみる!

 

  • 宣伝

Webページを作ります!

何か作ったらネット上のどこかにあげてるかもしれません。

 

  • まとめ

今後の人生の目標の一つとして、短時間でよい結果を出せるように効率の良い方法を模索していきたいです。

特に今期は一つの物事についてかかりきりになることで、他に時間を割けなくなる状態が起きたので、ほどほどで止めることも大事だと思いました。

効率良く物事を処理できれば今期は忙しくならなかったかなと思います。

 

今回のセミナーは自分にとって有用なピースの一つになったと思います。

 

では(´▽`)ノ

]]>
C#のLinqについての解説 http://blog.shirai.la/seminar/2017/07/linq2/ Mon, 24 Jul 2017 01:36:24 +0000 http://blog.shirai.la/seminar/?p=2692 続きを読むC#のLinqについての解説]]> こんにちは(/・ω・)/

今回もC#のLinqについての解説です。

前回でもメソッドを少し説明しましたが、今回はより範囲を広げてよく使うものと使えるものを書いていきたいと思います。

 

  • データの加工

データにフィルター処理をして必要なデータのみを集めたり、データを組み合わせて新しいデータを作ったりすることができます。

サンプルには

int[] numArray = { 1, 2, 3, 4, 5 };
int[] numArray2 = { 1, 1, 1, 2, 3, 5 };
string[] strArray = { "1", "2", "3", "4", "5" }; 
string[] strArray2 = { "6", "7", "8", "9", "10" };

を使用します。

 

  • Aggregate

アキュムレータ関数を適用する

 

アキュムレータとは?

例えば、1 + 2 + 3の計算をする時は

  1. 1 + 2を計算してその計算結果を保存する(結果をAとする)
  2. A + 3を計算する

のように2つずつ計算をしています。

この計算の過程で出てきたAのような一時的に計算結果を保持しておく領域のことをアキュムレータと言います。

このアキュムレータを使用すると、シーケンスの全要素を計算に利用することができます。

 

つまり、このメソッドを使用すればシーケンスの全ての要素を使う処理を簡単に書くことができます。

使い方次第で化ける面白いメソッドです。

var aggregate = strArray.Aggregate (( item, item2 ) => item + "☆" + item2); 
//1☆2☆3☆4☆5
/*
 * 1.itemと☆とitem2を連結させる
 * 2.連結した結果がitemになり、次の要素の計算に使用される
 */

計算結果は第1仮引数に保持されます。(上のサンプルではitemに保持されています)

var aggregate2 = strArray.Aggregate (( item, item2 ) => item2 + " " + item + " " + item2);
//5 4 3 2 1 2 3 4 5 

var aggregate3 = strArray.Aggregate (( item2, item ) => item2 + " " + item + " " + item2);
//1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1

 

オーバーロードではシードを設定する必要があります。

シードを設定すると、1回目の計算時のitemが引数で指定したものになります。

var aggregate4 = strArray.Aggregate ("☆", ( item, item2 ) => item + " " + item2);
//☆ 1 2 3 4 5

 

今回紹介する中ではこれが一番難しいと思います。後は大したことないです。

 

  • Select

シーケンスの各要素にラムダ式で指定した処理を行い、新しいシーケンスを作成する

//各要素に2倍したシーケンスを返す
var select = numArray.Select (item => item * 2);
//2 4 6 8 10

//インデックスを利用したい場合、第2仮引数に変数を宣言します。
var select2 = numArray.Select (( item, index ) => index.ToString () + " " + item * 2); 
//(0 2), (1 4), (2 6), (3 8), (4 10)

 

  • Skip

引数として受け取った数値分要素を飛ばして、残りのシーケンスを返す

 var skip = numArray.Skip (2); 
//3 4 5

 

  • SkipWhile

ラムダ式で指定した条件を満たしている間シーケンスの要素を飛ばして、満たさなくなったら残りの要素を返す

つまり、条件式がfalseになったら残りの要素を返す

var skipWhile = numArray2.SkipWhile (item => item < 2); 
//2 3 2 1

 

  • Take

引数として受け取った数値分シーケンスの要素を受け取る

var take = numArray.Take (2);
//1 2

 

  • TakeWhile

ラムダ式で指定した条件を満たしている間、シーケンスの要素を返す

満たさなくなったら処理を終了する

つまり、条件式がtrueの間の要素を返す

var takeWhile = numArray2.TakeWhile (item => item < 3); 
//1 2

 

  • Where

ラムダ式で指定した条件を満たすシーケンスの要素を返す

つまり、trueを通し、falseは通さない

var where = numArray.Where (item => item % 2 == 0); 
//2 4

 

  • Zip

2つのシーケンスの要素を使用して、新しいデータを作る

2つのシーケンスの要素数が異なる場合、少ない方に合わせる

var zip = strArray.Zip (strArray2, ( item, item2 ) => (item + " " + item2)); 
//(1 6), (2 7), (3 8), (4 9), (5 10)

 

SelectとWhereは特に使用する処理なので、覚えておくと便利です。

 

  • データの集計

サンプルには

int[] numArray = { 1, 2, 3, 4, 5 };
int[] numArray2 = { 1, 1, 1, 2, 3, 5 };

を使用します。

 

  • Average

平均値を求める

var average = numArray.Average (); //シーケンスの平均値を返す
//3

 

  • Count

要素の数を求める

var count = numArray.Count (); //要素数を返す
//5

var count2 = numArray2.Count (item => item == 1); //条件に合う要素数を返す
//3

 

  • Max

最大値を求める

var max = numArray.Max (); //シーケンスの最大値を返す
//5

 

  • Min

最小値を求める

var min = numArray.Min (); //シーケンスの最小値を返す
//1

 

  • Sum

合計を求める

var sum = numArray.Sum (); //シーケンスの合計値を返す
//15

 

特に複雑な操作は必要ありません。また、ラムダ式で指定すれば、絶対値で計算したりすることができます。

 

  • データの型変換

サンプルには

int[] numArray = { 1, 2, 3, 4, 5 };

を使用します。

 

  • ToArray

IEnumerable<T>からT[]に変換する

var toArray = numArray.Take (2).ToArray ();
Console.WriteLine (toArray.GetType ().ToString ());
//System.Int32[]

 

  • ToList

IEnumerable<T>からList<T>に変換する

var toList = numArray.ToList ();
Console.WriteLine (toList.GetType ().ToString ());
//System.Collections.Generic.List'1[System.Int32]

 

型変換についてはこの2つを使えるようになれれば、特に問題はないと思います。

 

  • データの判定

    このような状況の時にLinqメソッドで書き換えることができます。

foreach (var item in コレクション) 
{ 
    if (条件) 
    { 
        //処理 
    }
}

サンプルには

bool[] trueArray = { true, true, true }; 
bool[] boolArray = { true, false, true };
int[] numArray = { 1, 2, 3, 4, 5 };

を使用します。

 

  • All

シーケンスの全ての要素がラムダ式で指定した条件を満たしているか

var all = trueArray.All (item => item == true); 
//true

 

  • Any

シーケンスのどれかの要素がラムダ式で指定した条件を満たしているか

var any = boolArray.Any (item => item == false); 
//true

 

  • Contains

指定した要素がシーケンスに含まれているかどうか

var contains = numArray.Contains (1); //1があるかどうか
//true

 

  • データの集合

和集合、積集合、差集合の3つが扱えます。

サンプルには

int[] numArray = { 1, 2, 3, 4, 5 }; 
int[] oddArray = { 1, 3, 5, 7, 9 };
int[] evenArray = { 2, 4, 6, 8, 10 };

を使用します。

 

  • Union

2つのシーケンスから和集合を求める

var union = oddArray.Union (evenArray); //和集合 
//1 3 5 7 9 2 4 6 8 10

 

  • Intersect

2つのシーケンスから積集合を求める

var intersect = numArray.Intersect (evenArray); //積集合 
//2 4

 

  • Except

左のシーケンスから右のシーケンスを除いた差集合を求める

var except = numArray.Except (oddArray); //差集合 奇数を取り除く
//2 4
var except = oddArray.Except (numArray); //1~5の要素を取り除く
//7 9

 

  • データのソート

サンプルには

var dataArray = new[] {  
    new { A = 1, B = 1 },  
    new { A = 2, B = 2 },  
    new { A = 3, B = 2 },  
    new { A = 2, B = 3 },  
    new { A = 1, B = 0 }  
};

を使用します。

 

  • OrderBy

昇順に並び替える

//Aを基準に昇順で並び替える
var orderBy = dataArray.OrderBy (item => item.A); 
//結果 {1 1}{1 0}{2 2}{2 3}{3 2}

 

  • OrderByDescending

降順に並び替える

//Aを基準に降順で並び替える
var orderByDescenging = dataArray.OrderByDescending (item => item.A); 
//結果 {3 2}{2 2}{2 3}{1 1}{1 0}

 

  • ThenBy

昇順に並び替える

ただし、OrderByもしくはOrderByDescendingの後でないと使用できない

//Aを基準に昇順で並び替える、ただしAの値が同じ場合、Bの値を比較して昇順で並び替える。
var thenBy = dataArray.OrderBy (item => item.A).ThenBy (item => item.B); 
//結果 {1 0}{1 1}{2 2}{2 3}{3 2}

 

  • ThenByDescending

降順に並び替える

ただし、OrderByもしくはOrderByDescendingの後でないと使用できない

//Aを基準に昇順で並び替える。ただしAの値が同じ場合、Bの値を比較して降順で並び替える。
var thenByDescenging = dataArray.OrderBy (item => item.A)
    .ThenByDescending (item => item.B);
//結果 {1 1}{1 0}{2 3}{2 2}{3 2}

 

  • Reverse

順序を逆にする

var reverse = dataArray.Reverse ();
//結果 {1 0}{2 3}{3 2}{2 2}{1 1}

ThenByとThenByDescendingに関しては、それらの後ろにThenBy、ThenByDescendingを使うことによって、第3以降の並び替えの基準を設定することができます。

ソートに関してはかなり便利で、どんなデータ構造を持っているクラスであっても簡単にソートができるようになります。

 

  • データの探索

指定した要素を探して返す処理ができます。

サンプルには

int[] numArray = { 1, 2, 3, 4, 5 }; 

を使用します。

 

  • ElementAt
  • ElementAtOrDefault

引数として渡したインデックス位置にある要素を返す

引数が配列外の値だった場合、ElementAtは例外を投げ、ElementAtDefaultは型の規定値を返す(例えばintの規定値は0)

var elementAt = numArray.ElementAt (1); 
//2 
var elementAtDefault = numArray.ElementAtOrDefault (5); 
//0

 

  • First
  • FirstOrDefault

シーケンスの最初の要素を返す

もしくは、条件を満たす最初の要素を返す

シーケンスに要素がない場合、Firstは例外を投げ、FirstOrDefaultは型の規定値を返す

var first = numArray.First (item => item % 2 == 0); 
//2 
var firstOrDefault = numArray.FirstOrDefault (); 
//1

 

  • Last
  • LastOrDefault

シーケンスの最後の要素を返す

もしくは、条件を満たす最後の要素を返す

シーケンスに要素がない場合、Lastは例外を投げ、LastOrDefaultは型の規定値を返す

var last = numArray.Last (item => item % 2 == 0);//4 
var lastOrDefault = numArray.LastOrDefault (item => item == 7); //0

 

C#はなかなか奥が深い(~_~;)

他にもメソッドはありますが、(特にゲーム系のプログラミングでは)あまり使わないと思います。

一度サンプルを書いてみるとよく覚えられます

 

では(^_^)/

]]>
C#の便利な機能Linqについて http://blog.shirai.la/seminar/2017/07/linq/ Wed, 19 Jul 2017 10:42:34 +0000 http://blog.shirai.la/seminar/?p=2567 続きを読むC#の便利な機能Linqについて]]> こんにちは( ̄ー ̄)

今回はC#のLinqという機能についてです。

 

Linqとは?

Linqは配列や配列を扱うクラス(例えばList<T>)のようなデータのかたまりを扱うクラスから情報を取得するための機能です。

Linqを利用するためには「using System.Linq;」が必要になります。

 

例えば、入力された文字列を半角スペースで区切って整数にしたい場合

string[] inputStr = Console.ReadLine ().Split (' '); //入力を受け付ける
int[] numArray = new int[inputStr.Length];            //変換後の受け皿を作る

for (int loop = 0; loop < inputStr.Length; loop++)
{
    numArray[loop] = int.Parse (inputStr[loop]);      //stringからintに変換
}

というようにループを回して処理をすれば整数に変換することができます。

 

ただ、Linqを利用すると

string[] inputStr = Console.ReadLine ().Split (' ');                   //入力を受け付ける

int[] numArray = inputStr.Select (str => int.Parse (str)).ToArray ();  //stringからintに変換

 

もしくは

int[] numArray = Console.ReadLine ().Split (' ').Select (str => int.Parse (str)).ToArray ();

というように書くこともできます。

 

まあ、Linqを使わなくてもfor文やwhile文を利用すれば処理できるので、必ずしも習得しないと困るというわけではないです。

 

Linqを利用するメリットとしては

  • データのかたまりに対してfor文while文を使用せずに、処理をすることができる(書くコードの量を減らせられればその分バグの発生を抑えられる)
  • 特に複雑な処理の場合、多重ネストのコードを書かずに済む
  • 文字数が少なくて楽

があります。

 

Linqが使える条件

厳密にはIEnumerable<T>インターフェースを継承しているかどうかです。

ですが、配列やList<T>などデータのかたまりを扱うようなクラスであれば大抵継承されているはずなので、現時点ではあまり気にしなくてもよいです。

 

Linqの記法

記法は2種類あります

  • クエリメソッド

サンプルで示したようなメソッドのように書いていくC#的なスタイルです。

メソッドの後にメソッドをつなげて書くこともできます。

 

  • クエリ構文

SQLのように書いていくスタイルです。

入力された文字列を半角スペースで区切って整数にするコードをクエリ構文で書いてみると

var result =
    from str in Console.ReadLine ().Split (' ')
    select int.Parse (str);

というようになります。

 

大まかな流れとしては

  • 結果を格納する変数を宣言
  • クエリ構文内の処理で使用する変数の宣言(from~)とどこからデータを持ってくるか(in~)を決める
  • データにどのような操作をするか
  • データをどのように返すか

になります。

ですが、自分はクエリメソッドを利用している人の方が多いという印象を持っています。

 

ここで少し話が変わりますが、Linqを最大限利用するためにはラムダ式の理解が必要になります。

 

ラムダ式とは?

Select (str => int.Parse (str))の「str => int.Parse (str)」に当たる部分がラムダ式というもので書かれています。

一部のクエリメソッドではメソッドに対してどんな処理をするか、ということを伝えなければならないです(例えば型変換をしろ!や偶数の要素を探せ!など)。

ラムダ式を利用するとどんな処理をするかということが簡単に書けるようになります。(簡単ではない書き方もあります)

 

記法は(仮引数) => (式) です。

また、仮引数が2つ以上ある場合は、それらをかっこで挟む必要があります。

 

ラムダ式が使用できるようになると

  • 何をするか指定しなければならないメソッド
  • プリミティブではないクラス(Vector3や自作クラスなど)

を自由に扱えるようになります。

(例えばVector3クラスのXのみの平均を求める処理や、X、Y、Zの優先度順でソートをするなどの処理)

 

サンプル

Vector3[] v = new Vector3[10];
float xAverage = v.Average (item => item.x);        //各座標の平均を求めてみる
float yAverage = v.Average (item => item.y);
float zAverage = v.Average (item => item.z);

//昇順のソートをする 左側にある方が優先度高い
v = v.OrderBy (item => item.x).ThenBy (item => item.y).ThenBy (item => item.z).ToArray ();

 

よく使うであろうメソッド

  • ToArray()

IEnumerable<T>で返ってくるデータをT[]に変換するメソッド

クエリメソッドによってはIEnumerable<T>という型で要素が返ってくるので、そのままでは不便なことがあります。なので、IEnumerable<T>をT[]に変換することによって、配列に格納できるようにします。

例えば、IEnumerable<int>で返ってきた結果に対してToArray()を使うとint型の配列になります。

 

  • Select()

全ての要素に対して指定された処理をするメソッド

Selectの引数として渡した処理を全ての要素に対して行います。

例えば、サンプルとして書いた「Select (str => int.Parse (str))」は「stringをintに変換する処理」を全ての要素に対して行うということになります。

 

  • Where()

指定された条件に対してtrueを返すものを通すメソッド

つまり条件を満たさないものは弾かれます

 

サンプル

int[] numArray = Console.ReadLine ().Trim ().Split (' ').Select (str => int.Parse (str)).ToArray ();
numArray = numArray.Where (item => item != 1).ToArray ();        //1を通さない

foreach (var item in numArray)
{
    Console.WriteLine (item);
}

結果

入力されたものから1が弾かれています。

 

最後に、紹介したメソッド以外にも使えるものはたくさんあります。

Linqに慣れると、もの凄く便利だと思います。

では(^_^)/

]]>
一生勉強 一生青春。←勉強って何? http://blog.shirai.la/seminar/2017/07/studying/ Fri, 14 Jul 2017 17:51:01 +0000 http://blog.shirai.la/seminar/?p=2526 続きを読む一生勉強 一生青春。←勉強って何?]]> こんにちは(^0_0^)

今回は勉強に関するお話とそれを聞いて思ったことについてです。

 

主に勉強は2種類に分けることができます。

  • Study
    • 未知のことに対して行う
    • 研究などが多い
    • 成功したかどうかは関係なく、失敗してもよい(成功しないパターンが見つかったので成功とも言える)
  • Learn
    • 既知のことに対して行う
    • 暗記などが多い
    • 結果を出せないとLearnしたとは言えない

 

労力としてはLearnの方が圧倒的に楽です。Studyは大変ですが、新しい情報が生まれるので価値があります。

特に、Studyによって明かされたことは後世の人たちのためになります。(教科書に載っているような有名な定理などは全てStudyから生まれたもの)

また、Studyには情報の信頼性という面で責任を伴うことが多いです。

 

では学校生活で行ってきた勉強はどうなのか?

この問題については圧倒的にLearnが多いと思います。LearnをしないとStudyができないので当然ではあります。これは悪いことではないです。

なので、Study(例えば卒論)が難しく感じるかについては今までLearnはしてきているので慣れているが、Studyはあまりしていないからなのかな?と思いました。

また、大人になるとStudyの割合が増えるようになります。

よって、どこかでLearnとStudyの割合を意識して調整する必要があると思います(自分はやりたいことが多いのでLearnが多いです)。

答えを提示される側ではなく、提示する側になることが必要!

 

特に、新しいものを作るような職業であれば必然的にStudyを行うことになるので、今のうちにStudyに対するやり方や耐性を付けておく必要があります。

でも、StudyをするためにはLearnで知識を身に付ける必要がある( ムムッ(;・∀・) ドウスレバイイノ)

まあ、人間の仕事は悩むことだと思うので(笑) 手探りで調べる必要がありますね。

 

では(゚Д゚)ノ

]]>
IVRC2017の審査結果 http://blog.shirai.la/seminar/2017/07/judgement/ Thu, 06 Jul 2017 21:05:42 +0000 http://blog.shirai.la/seminar/?p=2468 続きを読むIVRC2017の審査結果]]> こんにちは(^_^)/

 

今回はIVRC2017の審査結果とそこから思ったことを書こうと思います。

まず、企画案の概要としては脳波を利用して難易度調整を行い、その人の耐性に合わせたホラーゲームを作るというものです。

難易度調整の具体的な内容としてはお化けの量を増減させたり、不意打ちをするかどうかなどがあります。

結果は不合格でした。(~_~)

 

いただいた審査の感想の要点

  • コンセプトは面白そうだが、脳波を使って安定したものを作れるか?
  • 既製品の組み合わせなので、新しいハードウェアを実装するなどの挑戦を期待したい
  • 脳波で分岐させることは面白そう
  • 会場の混雑が予想されるので、パーティションを利用しても環境構築が難しいのではないか?なので、環境が作れなかった場合を想定するとよかった
  • どのような体験ができるのか具体性が足りない
  • 分岐について具体的な検討がほしかった
  • 1人1人に合わせた体験を上手に演出できるかどうかが興味深い

 

感想としてはそんなに悪い評価はなかったので、「まあ、悪くないかな…。」という感じでした。

 

企画案の問題点

  • 脳波の扱いは難しく、脳波についての理解と実証が足りていないことが挙げられました。分かっていないことは下手に書けないのでそこが一番の問題だったと思います。
  • 環境構築については考えたつもりでしたが、最近はVRブームで人が多いという考慮が足りなかったです。

 

企画の立案から学んだこと

  • 人生経験が足りない
  • 画力が足りない

自分の生きている世界は狭い! )^o^(

 

画力に関しては散々ブログで書いているので飛ばします。

人間は経験や見聞きしていないものを想像出来ないです。

なので、普段とは違うことを意識的に行って少なくとも同年代の人たちよりは経験を積もうと思いました。(旅に出よう!(-。-)y-)

 

最後に、先日人生で初めてライブに行ってから、エンジニアという立場よりももっと作品や人に近い立場(デザイナー)でも、ものを作ってみたいなぁと思うようになりました。自分の中でやりたいことが多すぎますが、頑張りたいです。

 

では( ̄ー ̄)

 

 

 

 

 

 

(今思えばVR + 農業とか面白そう 田植えとか色々)

]]>
Knowledge is power http://blog.shirai.la/seminar/2017/07/impression/ Sun, 02 Jul 2017 08:24:42 +0000 http://blog.shirai.la/seminar/?p=2423 続きを読むKnowledge is power]]> こんにちは!

今回はIVRCの企画書を書いてみたことによる感想や学んだことを書き連ねたいと思います。

 

学んだこととして、面白いものを作ることと同じくらい面白さを伝えることが大切だということが分かりました。

企画が面白いかどうかは別として、人に面白そうだと思ってもらうためには一体どうすればよいのか。

特に自分は、使える時間によって伝える情報を変える必要があるのでその塩梅が難しいと思いました。

圧縮しすぎると伝わらないし、展開しすぎると最後まで読んでもらえないかもしれない。( ノД`)シクシク…

 

また、分かりやすく伝えるためにはイラストを利用した方がおおむね楽になると思いました

画力を鍛える必要がありますね…

 

役に立ったこととして、「バーチャルリアリティ学」という本を読んで得られた知識は役に立ちました。

VRにおけるAIPキューブという概念や、人間に対してそれらしい感覚を提示するためにはどうすればよいのかなど、いろいろな役に立つ情報が載っており、ためになりました。

知識は重要!

 

次に生かしたいこととしては、ある程度の規模があるものを作るときには企画書(みたいなもの)を書いてみようかなぁと思いました。

 

では(^_^)/

 

]]>
触感型コントローラーUnlimitedHandを使ってみた! http://blog.shirai.la/seminar/2017/06/unlimitedhand/ Mon, 26 Jun 2017 14:25:14 +0000 http://blog.shirai.la/seminar/?p=2338 続きを読む触感型コントローラーUnlimitedHandを使ってみた!]]> こんにちは~ ( ̄ー ̄)

今回はUnlimitedHandというデバイスを使う機会があったので、その解説をしたいと思います。

 

  • UnlimitedHandとは何?

UnlimitedHandは腕に巻いて使用するデバイスで、デバイスの入力にはフォトリフレクタという位置を計測するセンサーと加速度ジャイロセンサを使用しており、出力としては振動と電気刺激を行います。

噛み砕いて説明すると、腕の動きを値として利用したり、振動や電気刺激で触覚を提示することができるというものです。

 

  • 接続の手順について

途中で接続ができなくなったり、先駆者があまりいなくて情報が少なかったりなどいろいろ手間取りました…。なので、トラブルが起きた人や初めて使用する人用に手順を紹介したいと思います。

 

手順の説明については公式の情報を参考にしています。

 

目的:Unityで動作確認

 

必要な物

  • Arduino

Download the Arduino IDEの辺りからPCに合ったものをダウンロードする。

www.arduino.cc/en/Main/Software

 

  • Arduinoのライブラリ

Library for Arduinoの最新版をダウンロードする。

dev.unlimitedhand.com/download.html

 

  • Unity

最新版のものをダウンロードする。

unity3d.com/jp/get-unity/update

 

  • Unityのプロジェクトファイル

「Simple Project Project –Graph–」をダウンロードする。

日本語版のページからではダウンロードできません、英語版のページから行う必要があります。

dev.unlimitedhand.com/unitycontents.html

また、Unity本体と開こうとするプロジェクトのバージョンが異なると警告が出ますが、気にせずに「Continue」を選択してください。

 

検証環境

  • OS:Windows8.1
  • Arduino:1.8.3
  • Unity:5.6.1f1

 

1. USB経由でデバイスとPCを接続する

接続に関してはUSB接続とBluetooth接続の2種類がありますが、自分の環境ではBluetooth接続だと手順6が上手くいきませんでした。

なので、手順6が終わるまではUSBで接続した方が良いと思います。

 

 

2. UnlimitedHandにジェルを付ける

電気刺激を感じなくても問題ない場合は、ジェルを付けなくても構いません。

図では失敗していますが、デバイスの電極に貼り付けられている白いシールをはがしてからジェルを付けます(白いシールをはがすと銅色の電極が見えるようになります)。シールやジェルをはがす時に電極ごとはがさないように気を付けてください。

 

 

3.ダウンロードしたArduinoのライブラリを利用できるようにする

Arduinoの実行ファイル(arduino.exe)があるフォルダに「libraries」というフォルダがあるので、そこにダウンロードしたライブラリの「UH」というフォルダを入れます。

 

 

4.追加したライブラリを開く

Arduinoを起動して、「ファイル」->「スケッチ例」->「UH」->「Serial_Unity_Quaternion」をクリックする。

特に問題がなければ新規ウィンドウでファイルが開くと思います。

 

 

5.ポートを選択する

「Serial_Unity_Quaternion」プロジェクトの「ツール」->「シリアルポート」をクリックして、デバイスの接続に使用しているポートを選択します。

 

 

6.デバイスに情報を書き込む

画面左上の「マイコンボードに書き込む」をクリックして、デバイスに情報を書き込みます。

書き込み中はバイブレーションが作動します。

書き込みが完了した後はArduinoを終了しても問題ないです。

 

 

7.Bluetooth接続を行う

必ずしもBluetooth接続に切り替える必要はありません。USB接続でよい人はこの項目を飛ばしてください。

Bluetooth接続を管理する画面でデバイス名「RNBT-****」を選択します。

「パスコードを比べてください」という画面が出るので「はい」を選択します。

パスコードは毎回変わりますが気にする必要はないです。

ペアリングに成功すれば無線接続の準備は完了です。

 

 

8.ダウンロードしたUnityのプロジェクトファイルを開く

初回起動時にエラーが出ますが無視します。

特に問題なかった(´・ω・)

 

 

9.ゲームオブジェクトのスクリプトに値を設定する

UHゲームオブジェクトにあるUHスクリプトの「Port Name」に、現在デバイスを接続しているポートの名前を入れます。

 

 

10.Unityのプロジェクトを実行する

画面左下にエラーが出ていなければ接続できているはずです。

 

ボタンをクリックするとクリックしたものに応じた動作をします。

Vibration:振動

Stimulation:電気刺激

デフォルトの値での電気刺激は割と痛いのでLevel Downであらかじめ下げることをお勧めします。

UHゲームオブジェクトが見当たらない場合は「DontDestroyOnLoad」を展開すると出てきます。

 

スクリプトの値については「Update **** Flg」のようなチェックボックスを有効にしないと値が取得できません。また、AngleとQuaternionは同時に取得できません。

デバイスからの触覚提示とUHスクリプト内の数値が変わっている様子が見られれば、問題なく動作しています。

 

 

おまけ ソースを変更してみる

現状ではUHスクリプト(UnlimitedHandを制御するスクリプト)の「UH Gyro」、「UH Accel」、「UH GyroAccelData」の値が取得できておらず、チェックボックスも見当たらないと思います。せっかくなので、スクリプトを少々変更して値が取得できるようにします。

 

スクリプトの120行目辺りに

「updateUH3DGyroAccel();」を追加します。

 

372行目辺りに以下のコードを追加します。

 

//ジャイロセンサの値を読み込む

float[] gyroData = instance.readGyro();

UHGyro[0] = gyroData[0];

UHGyro[1] = gyroData[1];

UHGyro[2] = gyroData[2];

 

//加速度センサの値を読み込む

float[] accelData = instance.readAccel();

UHAccel[0] = accelData[0];

UHAccel[1] = accelData[1];

UHAccel[2] = accelData[2];

 

正常に変更できれば、ジャイロセンサの値と加速度センサの値が取得できているはずです。

 

他にもスクリプトの内容を変更することによって、例えば手順9で行ったポート番号の設定を手動ではなくスクリプト側で設定することが可能になると思います。

 

Unityで新規プロジェクトを立ち上げてUHスクリプトを利用したい場合は、ここからPlugin for Unityの最新版のものをダウンロードしてフォルダ内にあるUH.csを使用してください。

 

 

  • 使ってみた感想について

一つのデバイスでいろんなことができるので便利だなぁと思いました。

公式が用意しているAPIも使いやすいです、おまけをやってみた人はわかると思いますが、UnlimitedHandを使用した開発はそこまで大変ではないと思います。

 

今回紹介した手順はUnlimitedHandの全てを説明したわけではないのですが、部分的でも参考になれば幸いです。

 

 

では(・ω・)/

]]>
レビュー & レビュー http://blog.shirai.la/seminar/2017/06/review/ Sun, 18 Jun 2017 07:39:05 +0000 http://blog.shirai.la/seminar/?p=2225 続きを読むレビュー & レビュー]]> こんにちは(-.-)

今回は企画案と個人的にためになった技術書のレビューについてです。

 

企画案について

IVRCというコンテストには企画書の提出が必須なので、その案についてレビューしました。

やってみた感想としては他の人がどんなことを考えているのか見られる機会だったので楽しかったです。

レビューをして他の案の足りないところを見つけることにより、自分の企画案のここも直した方がいいのではないかと思ったり、また、レビューをしてもらうことによって、言葉足らずで意図が伝わっていなかった部分が見つかり、ためになりました。

 

技術書について

私は大学2年の後期ごろから自分のプログラミング能力向上のために、オンラインジャッジサイトでプログラムの問題を解くようになりました。

簡単な問題は解けましたがある難易度以上の問題になると全く解けず、これは勉強する必要があるなと感じ技術書を読み始めました。

そして、ネット上でおすすめされている本を買って読んでみました。

それがこちらの本です。

 

この本は、2005年に出版されたもので、上下巻合わせて1000ページほどあります。

本の内容についてざっくり説明するとプログラミングの基礎が詰まっている本です。

 

内容について特に自分に刺さったこととしては

  • なるべく早い段階でエラーを見つけた方が修正コストが少なく済む
  • 複雑な問題にどう対処するか
  • 分かりやすい変数名をつける
  • 凝ったものをつくらない
  • 先のことを考えて機能を追加しない
  • 人に対して分かりやすいプログラムを書く

がありました。

 

なぜオンラインジャッジで難しい問題が解けなかったかについて大きな要因としては、上手く計画を立てられなかったことが挙げられると思いました。

授業で解く問題は規模が小さいので、しっかり計画を立てずに問題へ取り組んでも問題はなかったのですが、ある程度以上の規模になると計画を立てる必要があり、自分はそれをなあなあにしていたので、修正に時間を取られ効率の悪いプログラミングをしていました。

 

この本を読んでいると自分の足りない部分がたくさん見つかりました、そりゃできないよなぁ(~_~;)という気持ちになります。

 

早い段階でこの本に出会えてよかったと思います。安くはないけれど初学者であれば役に立つ本だと思います。

 

では( ̄ー ̄)>

]]>
最近の悩みの種 http://blog.shirai.la/seminar/2017/06/examination/ Mon, 05 Jun 2017 11:21:57 +0000 http://blog.shirai.la/seminar/?p=2148 続きを読む最近の悩みの種]]>  

こんにちは (≧▽≦)

今回は最近頭を悩ませているVR技術者認定試験というものについてです。

 

試験の概要

  • 日程:6月24日(土)
  • 場所:東京大学 本郷キャンパス or 大阪大学 吹田キャンパス
  • 試験内容:セオリーコース(基礎理論を中心に行う)

 

教科書

 

試験の内容

  • 第1章 バーチャルリアリティとは
  • 第2章 ヒトと感覚
  • 第3章 バーチャルリアリティ・インタフェース
  • 第4章 バーチャル世界の構成手法

 

(6/5 Amazonの中古では14800円でお買い得な値段になっています)

 

すでに3週間切りました

やばいですね
過去問を一回分解いてみたら40点ぐらい取れたので、そこまで勉強時間を取らなくても大丈夫かなぁ(ぉ
とか思っていましたが

 

出来る出来ないに関わらず勉強しないとサボっている気になって焦りますね(勉強していると落ち着く)
さらに試験範囲の勉強が終わっていないのでさらに焦りますね (/ω\)

 

試験勉強は本を読んで過去問を解けばよいのですが… 間に合うかな?

 

話は変わりますが現時点での勉強してみた感想として

  • 2章辺りの生理学のような内容については、今まで全く手を付けたことがない分野なので0からのスタートですが、その分様々な収穫があって楽しかったです。
  • いろいろ勘違いしていたことがあり、それを正せてよかったです。

また、バーチャルリアリティ学という本を読んだことにより、企画案についてどのような方向性を持たせるべきか、どのようにすればVRらしいコンテンツにできるかなど具体的な方策で案を考えられたという点で、かなり参考になりました。

今は忙しいけど、24日過ぎればしばらくは時間ができる(はず)なので頑張りたい。
人生の中の3週間なんてあっという間だしね

 

では (^_^)/

]]>
絵を描けるようになりたい! http://blog.shirai.la/seminar/2017/06/graphics/ Thu, 01 Jun 2017 03:19:31 +0000 http://blog.shirai.la/seminar/?p=2061 続きを読む絵を描けるようになりたい!]]> こんにちは( `ー´)ノ

今回は備忘録的な意味も含めて図についての内容にします。

 

昔から自分はどうも絵や図を描くのが苦手でして…

イラストを描けるようになりたいので練習をしようとしますが、練習する→出来なくて諦める→忘れたころにまた練習するの繰り返しで上達していきませんでした。

 

ただ、今回のセミナーで図学という存在を知り、自分はまず図学というものを勉強して基礎を作ってからイラストの勉強をすればいいのではないか( ゚Д゚)!ということが分かりました。

いきなり比較的難しい曲線を描くよりも、直線で描く方が簡単ですしね(・∇・)/

 

構造や表現を学ぶためには図学!

幸い本は高くないみたいなので、夏休み辺りに勉強したいです。

 

また、現時点で意識するべきこととしては、

・最初はアタリをつけて大雑把に描くこと

自分は最初から詳細に書こうとしていたから失敗するのかなぁ、1回できれいに書けるほど実力はないので、現時点ではきれいに描くということは捨てようと思いました。

・人間が物を立体的に見るためには重なり、勾配、影などの要素が関係している

陰については中学の美術でやったのでうっすらと分かりますが、重なり?勾配(;´Д`)ということなので、そのあたりも意識する必要もあることが分かりました。

これ以上のものを描けるようになる!

絵はぜひとも描けるようになりたいのでまずは基礎を固めようと思います。

では( ̄▽ ̄)

]]>