このPartは主に「ARとは」・「ARの歴史」・「ARの事例」などが記載されています。ARの研究は1960年代とかなり前からされており昔からこのような発想があった事にすこし驚きました。
また昔のARはエンターテインメントというよりは仕事の効率化という側面で多く研究されていたこともわかりました。「ARの事例」にはここ最近のARを使った作品が紹介されており、画像とその作品の詳細ページのURLも記載されていたのでとてもわかりいやすかったです。
目次通り、このPartでは学習するための道具の準備について説明されています。必要機材・ソフトウェアのセットアップについて書かれています。
丁寧に書かれていたので、筆者は何のトラブルもなくセットアップができました。
Processingには様々なライブラリが標準で備えられていますが、このPartではARアプリケーションを作るのに便利な別のライブラリが紹介されています。
また、それぞれのライブラリの紹介が8つのChapterで構成されています。
主に、この本の進め方について記載されています。
先ほど言った通りこのPartでは外部ライブラリを使うので、その導入法が記載されています。ダウンロードしたライブラリのフォルダをどの階層に入れるか図で示されているのでわかりやすいです。
ここから本格的にARのプログラムを実行していきます。このChapterではマーカ上にARを表示する最も基本的なことをします。
下の画像が実際に実行したときの様子です。

ARプログラミングライブラリとしてARToolKitがありますが、それをProcessing用に対応させた「NyAR4pg」というライブラリを使います。
ソースは全て本に書かれておりますが、ここで一つ注意が必要です。
この本の当時のProcessingのバージョンがver1.5.1であったため、ver2.0,3.0
では動きません。もしver1.5.1以外のProcessingをインストールされた方はもう一度ver1.5.1を入れてみてください。
ver2.0以降で実行できないのはたぶんCamera関係のエラーだと思います。ver2.0からは「cam.start()」(camはChapture型)をvoid setup()内で入れないとキャプチャが始まらない仕様になっています。しかし、これを入れても筆者は実行できませんでした。
「java.lang.NoClassDefFoundError:processing/core/PGraphics3D」というエラーが出てしまい、調べてみましたがよくわからなかったのでver1.5.1で実行することにしました。
プログラムを実行するためには「パターンファイル」が必要になってきます。こういうやつです↓

自分でパターンファイルをつくる事ができますが、筆者はNyIdマーカを使いました。
NyIdマーカは「NyID Marker Maker」に配布されています。ソースを書くときもIDの番号を指定するだけなので簡単です。
あと、boxを描画するときに注意点が2つあります。
1つ目は、描画するときに透過率を設定しなければなりません。
これも考えれば単純な事ですが、透過率を設定しなかった場合boxを描画したときにマーカが隠れてしまうからです。
2つ目は、translateでboxの位置をずらしてあげる事です。そのままの位置に描画してしまうとマーカの中心にboxの中心がきてしまうのでboxの辺の半分の長さ上にtranslateすればちょうどマーカの上に描画されるようになります。
メタセコイアは3Dポリゴンモデルを作るためのソフトウェアです。このChapterではメタセコイアのモデルをProcessingで表示した後にARマーカ上に表示する方法が記載されています。Processingでメタセコイアのモデルを表示させたものと、それをARマーカ上に表示させたものを下に示します。


プログラムソースの解説はされていますが、細かいことが描かれていないことが多いです。「不親切だな」と思うかもしれませんが、あくまでARで活用するためならば光の色・モデルの表示位置などそれらの部分だけおさえておけば大丈夫だと思います。筆者の場合、プログラムのソースを全体的に理解したかったので細かい部分まで書いてほしかったですが…。
画面に表示されているCGをクリックしてドラッグさせるためには、そのCGに当たり判定をつける必要があります。このChapterではその方法が記載されています。
「Picking library」というライブラリを使います。このライブラリは、生成するCGにID番号を付与することができます。ID番号を付与することによってクリックしたときにどのID番号のCGがクリックされたかすぐに判別することができるようになっているので、一からピッキング用のプログラムを書かなくても済むようになります。
下に実行結果を載せます。

しかし、このライブラリで認識できるのはCGやrectなどの図形のみで画像を認識することができません。画像をピッキングしたい場合は、画像の下にrect()関数で画像と同サイズの四角形を書き、四角形の座標と画像の座標を同じ変数にする必要があります。
ポップアップメニュとはよく右クリックしたときに出てくるメニューのようなものを指します。このChapterではポップアップメニューを簡単に表示できるライブラリの紹介をしています。下の画像がサンプルプログラムの実行結果です。

ポップアップメニューには「red・green・blue」とあり、描画されているCGの色を変えることができます。このメニューに表示されている項目はそれぞれ色を変える関数となっています。よって、関数の内容を変えてやれば、跳ね上げたり大きさを変えたりなど他の動作を実行することもできるようになります。
Chapter 7~10はやっていないので割愛します。
このPartではPart 3で使ったライブラリを利用しARの作品を作る方法が紹介されています。全部で7つのRecipeに分かれています。筆者はこの中のRecipe 2「ARキャンドル」を実践してみました。以下に「ARキャンドル」でできること・詰まったところを挙げながら解説していきたいと思います。
本文から引用すると「ARキャンドルは「現実に右クリック」を体験できる作品」です。これだけではよくわからないと思うので下に実行したときの画像を示してみます。

このようにカメラで映し出されたLEDを右クリックしてメニューを表示させ、項目を選択することで点灯・消灯を操作できるものとなっています。
(1)でいった通り、LEDをARを使って点灯・消灯することができます。基本的にはPart 3のChapter3,5,6を組み合わせればできるようになっています。そのため、新しい知識はいらならいのでわかりやすくてとても良いです。
個人的に詰まったところはLEDの点灯・消灯をする関数の部分です。この本では「2色LEDカソードコモンOSRB5131A」を使っていますが、手元になかったので青色、赤色の1色LEDを使いました。そのためプログラムの修正に少し時間がかかりました。
まず、ピンの指定です。2色LEDは足が合計3本ついていますが、1色LEDは2本です。

サンプルプログラムのpinRed,pinBlueの配列数を2つに変えます。ここで配列を2つにした理由があります。
下のソースをみてください。

ピッキングでやった通り、オブジェクト(LED)にIDを付与します。筆者の環境では赤色が0番、青色が1番で付与されました。selected_idにはマウスのカーソルで合わせたオブジェクトのIDを格納されています。
そして次のソースです

点灯・消灯の関数ですね。pinRed[selected_id]またはpinBlue[selected_id]のピンを点灯・消灯します。先ほども言った通り、筆者の環境では赤色が0番、青色が1番になっています。(なぜそうなるかはよくわからない)
赤色LEDはArduinoの6番のポートに、青色は7番のポートにつながっているので、マウスで右クリックされたらそれぞれpin○○○[selected_id]は6か7にななければなりません。赤色はselected_idが0なので6番が指定されますが、青色は1番なのでpinBlueの配列の1番目である7番が指定されなければなりません。そのため、2つの配列を追加しました。つまり、pinRed,pinBlueに含まれる0の要素はただの数合わせになっています。
また、マウスカーソルをLEDにおいてメニューを表示するとき、LEDを囲む透明な直方体のCGが表示されていないとうまく実行されません。
この本で学んだことはとてもいい経験になりました。ソースを書いたり、わからないことをネットで調べたり、ソースを書き換えて理解したりなど、試行錯誤することで得られたものは大きかったです。そして、なによりやっていて楽しかったです。この経験を今後の作品作りに活かしていきたいです。
]]>構成としては次の通りだ。
・タイピングで使う単語帳のtxtファイルをつくる(メモ帳などで)
・ファイルを読み込む
・読み込んだファイルから日本語とローマ字の情報をそれぞれ変数に格納
・ランダムでどの単語を入力させるか選び表示させる
・入力させた後、表示された単語と入力された単語が一致するか確認
・正しく入力された文字数を記録
・時間制限の機能も実装
このような流れになっている。
唯一つまずいたのがファイル読み込み。
テキストファイルは以下のようになっているが、

ファイルを読み込むときに空白で区切って単語を読み取ることができるか
わからなかった。
実際は簡単なことで
fopen=(FP,”%s %s,word1[wc],word2[wc])
と%sと%sの間に空白を入れて書けばいいだけだった。
FPファイルポインタの名前、word1とword2はそれぞれ日本語とローマ字
を格納するための変数
wcは単語数。上のソースをもう少し書くと
while (fscanf(FP, “%s %s”, word1[wc], word2[wc]) != EOF){
wc++;
}
となっている。1行読み込んだらwc++してまた繰り返し…
こうすることで単語数を取得してる。
ランダムや時間制限などは問題文にヒントがあったのでそこまで苦戦
しなかった。
ファイル読み書きは昨年習ってるはずなのに全然覚えてなかったから
いい復習になった。
なんか、ほぼ自分の整理のために書いただけの文章になってしまった…(笑)
ご朗読ありがとうございました。
今まで私はクリエイターはすごいなとしか思っていなかった。
自分はクリエイターは無理と決めつけていたので、ゲームプログラマーや
システムエンジニアに将来なるだろうと勝手に考えていた。
しかし、やっぱり自分はクリエイターには憧れていると思う。
「Splatoon 2D」なるものを作った結果
やっぱり、グラフィックの部分も自分で作れるようになりたいと思った。
また、自分はセンス、想像力が欠けていると思う。
「こんなデザインの素材がほしい」といったイメージがあまりできないからだ。
想像力を鍛えるには、いろんな映像作品をみたり、本を読んだり、絵を描いたり…
今まで、全てやってこなかったことだ。
私は文字を読むことがどうしても苦手で、
1行文字を読むとき一回では理解できないことが多い。
だから、読書は好きではなかった。
それに伴い物語を理解する事も苦手だった。
映画などは話が理解できなくて、見てこなかったのも
それが原因だと思う。
大学では今まで避けてきたことに挑戦したい。
むしろチャンスは今しかないと思う。
どうやって技術を鍛えるか考えると、最初は模倣が一番早いしとっかかりやすい。
とりあえず、比較的簡単なものから地道に難易度を上げていこうと思う。
ブログに書いたから、明日からやるべきことがはっきりした気がする。
今思えば、整理したかったからブログに書いたんだと思う。
最後まで読んでくださった方はありがとうございました。
]]>input3.txtから読み込んだ文字を格納したchar型変数inputの配列と、入力した文字をstrcmp()で処理すればいいだけじゃん♪
と考えたので次のようなプログラムを書いた。
#include<stdio.h>
#include<string.h>
int main(){
FILE *FP;
int loop;
char str;
int count = 0;
char input[81];
scanf(“%c”, &str);
if ((FP = fopen(“input3.txt”, “r”)) == NULL){
printf(“File open error”);
return 1;
}
while (fscanf(FP, “%s”, input) != EOF){
for (loop = 0; loop < strlen(input); loop++){
if (strcmp(input[loop], str) == 0){
count++;
}
}
}
fclose(FP);
printf(“%cと同じ単語は%d個あります\n”,str,count);
return 0;
}
しかし、キーボード入力した後にエラーがででしまった・・・
は?なんでよ??っと思って調べること数分。
strcmp()は文字列しか比較できないということが分かった。
つまり、文字の比較はできないという事だ。
ということなので赤文字と青文字と緑文字の部分を次のようにかえた。
char str[2];
scanf(“%s”, str);
if (strcmp(input[loop], str) == 0)
と変えてもできないし!!
もういいわ。strcmp()使うのやめた(笑)
char str;
scanf(“%c”, &str);
if(input[loop] == str)
はい、できた(笑)
この課題だけで2時間持ってかれるとかあほすぎる・・・
今度からは、しっかり教科書読むようにしよう。
]]>
そこで、USBカメラを使おうと考えたがデバイスをインストールしても内蔵カメラが反応してしまう・・・
調べたところ、リファレンスにこんなことが書いてあった。 リファレンス サイト
下の方にCapture(parent, requestWidth, requestHeight, cameraName)とある。このcameraNameにカメラの名前を書けばいいのではないか!
でも、カメラの名前わかんないじゃん・・・
と思いきやlist()のページにとんだら、この関数をprintlnで表示させればわかることに気付く。
やってみたら予想通り、これでできた!!!
]]>しかし、次の日の授業の課題やらバンド練習やらで思っているより上手くいっていない・・・
今も、明日のReadingの勉強を必死になってやってる始末。
一日のスケジュールをはっきりさせて時間管理すべきだと改めて感じました。
明日からは、ARの事も書けるように心がけて行きたいです。
]]>TOEICのパートごとに絞った勉強ができるからとても使いやすい!
まあ、問題を解くと知らない単語が出てきて焦るし、時間制限もあるからなおさら。
試験もあと1週間ちょいだからできるだけ多く問題を解いて本番に備えたいですね。
]]>このブログには、主に自分の日々の勉強について書いていきたいなと思ってます。
最初に言っておきますが、自分は文章書くのが下手です。
まあ、このブログで文章力を鍛えて行けたらなとも思います。
ということで、気が向いたら是非読んでください!
]]>