ARToolKitの勉強中の学生です。
"3Dキャラクターが現実世界に誕生!ARToolKit拡張現実感プログラミング入門"を購読しています。
おかげで、マルチマーカを使うサンプルプログラムを動作させることができ、よりARToolKitに興味が湧きました。
そこで私は、このプログラムを少し工夫してもっと面白いプログラムにしようと思い、
マーカが隠れたらループで音が鳴るようにしたいと考えました。
探検
ARToolKitマルチマーカを使うプログラムが難しい件
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2012/09/16(日) 20:39:52.212デフォルトの名無しさん
2012/09/16(日) 20:40:44.51 そこでまずはPlaySound関数を使用するための準備として、
#pragma comment(lib,"winmm")
winmm.libをリンクします。次に
int org = 0;
orgというオリジナルの変数(グローバル関数)を作り、そしてマルチマーカを使うサンプルプログラムの
3Dオブジェクトの描画を行う関数の3Dオブジェクトを出現させる部分のソースコードを以下のように書き足しました。
#pragma comment(lib,"winmm")
winmm.libをリンクします。次に
int org = 0;
orgというオリジナルの変数(グローバル関数)を作り、そしてマルチマーカを使うサンプルプログラムの
3Dオブジェクトの描画を行う関数の3Dオブジェクトを出現させる部分のソースコードを以下のように書き足しました。
3デフォルトの名無しさん
2012/09/16(日) 20:41:27.48 if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(20.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
org--;
}
else if(org >= 3)
{
//マーカが3つ以上隠れているとき
PlaySound("se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC); //wavファイル再生 getchar();
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0); //色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
org++;
}
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(20.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
org--;
}
else if(org >= 3)
{
//マーカが3つ以上隠れているとき
PlaySound("se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC); //wavファイル再生 getchar();
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0); //色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
org++;
}
4デフォルトの名無しさん
2012/09/16(日) 20:44:24.43 マルチマーカの6つのマーカの内1つが隠れた場合orgをインクリメント(+1)して、見えたときorgをデクリメント(-1)します。
orgが3以上になったとき、PlaySound関数を使って指定したwavファイルをループ再生するというプログラムにしたかったのですが、
このソースでコンパイルすると、Webカメラでマーカを映した瞬間映像をキャプチャしていた画面がフリーズして、
指定していたwavファイルがループ再生されるという結果になってしまいました。
どのようなソースコードを書けば正常に動作するのでしょうか?
ご教授願いますm(_ _)m
orgが3以上になったとき、PlaySound関数を使って指定したwavファイルをループ再生するというプログラムにしたかったのですが、
このソースでコンパイルすると、Webカメラでマーカを映した瞬間映像をキャプチャしていた画面がフリーズして、
指定していたwavファイルがループ再生されるという結果になってしまいました。
どのようなソースコードを書けば正常に動作するのでしょうか?
ご教授願いますm(_ _)m
2012/09/16(日) 20:48:35.76
getchar() から処理が帰ってきていないというオチではないですよね
それはそうと、この質問は同じ本を持っていない人はレスお断りですか?
それはそうと、この質問は同じ本を持っていない人はレスお断りですか?
2012/09/16(日) 20:55:20.03
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
7デフォルトの名無しさん
2012/09/16(日) 21:04:28.60 >>5
getchar();がないとwavファイルを再生してくれません。
同じ本を持っていなくてもレス構いません。
ARToolKitは基本3Dオブジェクトの描画の部分しか自分で作成しませんので。
マルチマーカとは、複数のマーカを一つのマーカとして処理するプログラムです。
6つのAからFまであるマーカの内、3つが隠れたら音を鳴らすプログラムにしたいのですが、
私のプログラムですと、説明の通りWebカメラでマーカを映した瞬間キャプチャ画面がフリーズしてしまいます。
ですのでアドバイス頂けると幸いです。
getchar();がないとwavファイルを再生してくれません。
同じ本を持っていなくてもレス構いません。
ARToolKitは基本3Dオブジェクトの描画の部分しか自分で作成しませんので。
マルチマーカとは、複数のマーカを一つのマーカとして処理するプログラムです。
6つのAからFまであるマーカの内、3つが隠れたら音を鳴らすプログラムにしたいのですが、
私のプログラムですと、説明の通りWebカメラでマーカを映した瞬間キャプチャ画面がフリーズしてしまいます。
ですのでアドバイス頂けると幸いです。
2012/09/16(日) 21:10:17.50
9デフォルトの名無しさん
2012/09/16(日) 21:24:15.32 //============================================================================
//3Dオブジェクトの描画を行う設定
//============================================================================
void DrawObject(double trans_cr[3][4], double trans_rm[3][4], int visible)
{
double Tcr[16]; //座標変換行列Tcr(基準マーカ座標系→カメラ座標)
double Trm[16]; //座標変換行列Trm(各マーカの座標系→基準マーカ座標系)
//OpenGL形式の行列変換
argConvGlpara(trans_cr, Tcr);
argConvGlpara(trans_rm, Trm);
//行列演算
glMatrixMode(GL_MODELVIEW); //モデルビュー行列を指定
glLoadMatrixd(Tcr); //現在の行列に座標変換行列Tcrをロード
glMultMatrixd(Trm); //現在の行列と座標変換行列Trmを乗算
//3Dオブジェクトの描画
glTranslatef(0.0, 0.0, 23.0); //マーカに載せるために平行移動
glRotatef(90.0, 1.0, 0.0, 0.0); //ティーポットを立たせるために回転
mySetMaterial();
これの続きが>>3です。
//3Dオブジェクトの描画を行う設定
//============================================================================
void DrawObject(double trans_cr[3][4], double trans_rm[3][4], int visible)
{
double Tcr[16]; //座標変換行列Tcr(基準マーカ座標系→カメラ座標)
double Trm[16]; //座標変換行列Trm(各マーカの座標系→基準マーカ座標系)
//OpenGL形式の行列変換
argConvGlpara(trans_cr, Tcr);
argConvGlpara(trans_rm, Trm);
//行列演算
glMatrixMode(GL_MODELVIEW); //モデルビュー行列を指定
glLoadMatrixd(Tcr); //現在の行列に座標変換行列Tcrをロード
glMultMatrixd(Trm); //現在の行列と座標変換行列Trmを乗算
//3Dオブジェクトの描画
glTranslatef(0.0, 0.0, 23.0); //マーカに載せるために平行移動
glRotatef(90.0, 1.0, 0.0, 0.0); //ティーポットを立たせるために回転
mySetMaterial();
これの続きが>>3です。
10デフォルトの名無しさん
2012/09/16(日) 21:32:32.8711デフォルトの名無しさん
2012/09/16(日) 21:35:14.26 ちなみに私がいじる前のサンプルプログラムはこちらです。
if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(20.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0);//色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
}
if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(20.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0);//色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
}
12片山博文MZボット ◆0lBZNi.Q7evd
2012/09/16(日) 22:05:43.01 PlaySoundが短い時間に何度も呼び出されて音が出ないんだと思う。
音を出すときに一回だけPlaySoundを呼んで、止めるときに
PlaySound(NULL,NULL,SND_PURGE);を呼ぶ
音を出すときに一回だけPlaySoundを呼んで、止めるときに
PlaySound(NULL,NULL,SND_PURGE);を呼ぶ
2012/09/16(日) 22:24:00.17
>>10
> getchar();から制御が帰ってきているかはどうやって確認すればいいのでしょうか?
デバッガのステップ実行をしてみて、
getchar 関数の次に制御が移動するかを確認する。
標準入力に1文字入力されるまでgetchar関数は制御を戻さない。
コンソール画面でEnterキーを押さないで、これバグってると泣いてるバカを
この板で過去に3人ほど見た記憶がある。
> visibleとは、マーカが見えているか否かを計算して出される値で、0以上であればマーカが見えているということになります。
もっと正確に。
visibleは見えているマーカーの数を表しているのか。
それとも、マーカーが1個でも見えていれば0以上の適当な値になるのか。
それとも、必要なマーカー全てが見えなければ0未満の値になるのか。
どれにしても、あなたのプログラムだとvisibleが0以上なら、
その下の else if にも else にも制御が移らないわけだが、
それは仕様通りの動作なのか?
>>12
音はループ再生されるそうだが
> getchar();から制御が帰ってきているかはどうやって確認すればいいのでしょうか?
デバッガのステップ実行をしてみて、
getchar 関数の次に制御が移動するかを確認する。
標準入力に1文字入力されるまでgetchar関数は制御を戻さない。
コンソール画面でEnterキーを押さないで、これバグってると泣いてるバカを
この板で過去に3人ほど見た記憶がある。
> visibleとは、マーカが見えているか否かを計算して出される値で、0以上であればマーカが見えているということになります。
もっと正確に。
visibleは見えているマーカーの数を表しているのか。
それとも、マーカーが1個でも見えていれば0以上の適当な値になるのか。
それとも、必要なマーカー全てが見えなければ0未満の値になるのか。
どれにしても、あなたのプログラムだとvisibleが0以上なら、
その下の else if にも else にも制御が移らないわけだが、
それは仕様通りの動作なのか?
>>12
音はループ再生されるそうだが
14デフォルトの名無しさん
2012/09/16(日) 23:32:42.72 >>13
おそらくgetchar関数で制御帰ってきてませんでしたw
getshar();を外したらキャプチャ画面が固まるということはなくなりました。
以下のように書き直してみました。
if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(20.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
org--;
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0); //色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
org++;
if(org >= 3)
{
//マーカが3つ以上隠れているとき
PlaySound("C:\\Users\\加藤和馬\\Desktop\\ARToolKit\\課題研究\\se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC); //wavファイル再生
}
}
おそらくgetchar関数で制御帰ってきてませんでしたw
getshar();を外したらキャプチャ画面が固まるということはなくなりました。
以下のように書き直してみました。
if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(20.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
org--;
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0); //色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
org++;
if(org >= 3)
{
//マーカが3つ以上隠れているとき
PlaySound("C:\\Users\\加藤和馬\\Desktop\\ARToolKit\\課題研究\\se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC); //wavファイル再生
}
}
15デフォルトの名無しさん
2012/09/16(日) 23:36:58.582012/09/16(日) 23:37:04.87
2012/09/16(日) 23:38:57.32
18デフォルトの名無しさん
2012/09/16(日) 23:47:05.45 >>17
こういう感じにしました。
if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(30.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
PlaySound(NULL,NULL,SND_PURGE);
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0); //色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
PlaySound("C:\\Users\\加藤和馬\\Desktop\\ARToolKit\\課題研究\\se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC); //wavファイル再生
}
ですがこうしたら今度は何も鳴らなくなりました。
こういう感じにしました。
if(visible >= 0)
{
//マーカが見えている場合
mySetLight(); //光源の設定
glEnable(GL_LIGHTING); //光源ON
mySetMaterial(); //材質特性の適用
glutSolidTeapot(30.0); //ソリッド表現のティーポット
glDisable(GL_LIGHTING); //光源OFF
PlaySound(NULL,NULL,SND_PURGE);
}
else
{
//マーカが見えていない場合
glColor3f(0.0, 0.0, 1.0); //色指定
glutWireTeapot(20.0); //ワイヤーフレーム表現のティーポット
PlaySound("C:\\Users\\加藤和馬\\Desktop\\ARToolKit\\課題研究\\se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC); //wavファイル再生
}
ですがこうしたら今度は何も鳴らなくなりました。
2012/09/16(日) 23:57:12.63
>>18
visible の値がどんな時にどんな値になるか把握しないまま、
その条件分岐の中に自分のコードを書いてはいけない。
元々のコードに自分のコードを追加したかったら、あるいは改変したかったら、
まず何よりも先に、いつどんな時にその部分が実行されるか把握すること。
今回の場合なら、その if ~ else の中にコードを追加したかったら、
visible の挙動を把握するのが先だ。
visible の値がどんな時にどんな値になるか把握しないまま、
その条件分岐の中に自分のコードを書いてはいけない。
元々のコードに自分のコードを追加したかったら、あるいは改変したかったら、
まず何よりも先に、いつどんな時にその部分が実行されるか把握すること。
今回の場合なら、その if ~ else の中にコードを追加したかったら、
visible の挙動を把握するのが先だ。
2019
2012/09/16(日) 23:59:46.76 文面通りに受け取って誤解されるとマズいから言っておくが、
visible の挙動を調べるために if ~ else の中にコードを追加するのはアリだからな。
visible の挙動を調べるために if ~ else の中にコードを追加するのはアリだからな。
21片山博文MZボット ◆0lBZNi.Q7evd
2012/09/17(月) 01:21:51.75 static int f=0;
...
if(visible >= 0) {
mySetLight();
glEnable(GL_LIGHTING);
mySetMaterial();
glutSolidTeapot(30.0);
glDisable(GL_LIGHTING);
PlaySound(NULL,NULL,SND_PURGE);
f=0
} else {
glColor3f(0.0, 0.0, 1.0);
glutWireTeapot(20.0);
if(!f){
PlaySound("se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC);
f=1;
}
}
...
if(visible >= 0) {
mySetLight();
glEnable(GL_LIGHTING);
mySetMaterial();
glutSolidTeapot(30.0);
glDisable(GL_LIGHTING);
PlaySound(NULL,NULL,SND_PURGE);
f=0
} else {
glColor3f(0.0, 0.0, 1.0);
glutWireTeapot(20.0);
if(!f){
PlaySound("se_sad02.wav",NULL,SND_FILENAME | SND_LOOP | SND_ASYNC);
f=1;
}
}
22デフォルトの名無しさん
2012/09/17(月) 17:19:48.63 とある質問掲示板に聞いてみたところ、
「現状のプログラムでは,いずれか「1つ」のマーカが見えていない状態
(あるいは検出エラーしている状態)でも,繰り返しorg++が実行されるため,
プログラム実行後数フレームですぐに音がなる条件を満たしてしまっています.
6つのマーカをチェックするループの直前でorg=0をする必要があると思われます」
と返信されましたが、どこにorg=0をすればいいか現在調べています。
>>21
そちらのソースコードで実際にコンパイルしてみたところ、やはりWebカメラでマーカを映した瞬間音がなってしまいます。
ですが、Webカメラでキャプチャを開始して2,3秒違う場所をテキトウに映したあとにマーカを映したところ、
まったく音がなりませんでした。不安定な動作をしてしまいました。
「現状のプログラムでは,いずれか「1つ」のマーカが見えていない状態
(あるいは検出エラーしている状態)でも,繰り返しorg++が実行されるため,
プログラム実行後数フレームですぐに音がなる条件を満たしてしまっています.
6つのマーカをチェックするループの直前でorg=0をする必要があると思われます」
と返信されましたが、どこにorg=0をすればいいか現在調べています。
>>21
そちらのソースコードで実際にコンパイルしてみたところ、やはりWebカメラでマーカを映した瞬間音がなってしまいます。
ですが、Webカメラでキャプチャを開始して2,3秒違う場所をテキトウに映したあとにマーカを映したところ、
まったく音がなりませんでした。不安定な動作をしてしまいました。
2012/09/17(月) 17:46:37.07
24デフォルトの名無しさん
2012/09/17(月) 21:37:47.412012/09/20(木) 13:08:37.50
2013/12/04(水) 16:58:03.50
うん
27デフォルトの名無しさん
2014/01/08(水) 14:44:48.93 チンポ
28群馬大学病院腹腔鏡手術後8人死亡事故
2015/06/07(日) 02:13:08.57ID:XGb13DdT マスゴミ・売国奴・医療業界が隠そうとする真実---------------------安楽死---------------------奴隷に勝手に死なれては困る
安楽死旅行企画が大人気|竹田恒泰チャンネル
https://www.youtube.com/watch?v=XmP1TRsAe88
武田邦彦:安楽死と大麻、そして売春・・・オランダに学ぶ
https://www.youtube.com/watch?v=nWV8YOY39tw
安楽死党
https://www.youtube.com/watch?v=8nU2UaSlGx0
自殺は後遺症が怖い!だから-----------------------------------安楽死制度-------------------------------------安心して生きるために
安楽死旅行企画が大人気|竹田恒泰チャンネル
https://www.youtube.com/watch?v=XmP1TRsAe88
武田邦彦:安楽死と大麻、そして売春・・・オランダに学ぶ
https://www.youtube.com/watch?v=nWV8YOY39tw
安楽死党
https://www.youtube.com/watch?v=8nU2UaSlGx0
自殺は後遺症が怖い!だから-----------------------------------安楽死制度-------------------------------------安心して生きるために
29デフォルトの名無しさん
2015/12/19(土) 10:17:24.73ID:mptVb8Su プログラマはMacを使ってるってマジ?
http://hayabusa3.2ch.net/test/read.cgi/news/1450395043/
http://hayabusa3.2ch.net/test/read.cgi/news/1450395043/
2016/07/23(土) 20:40:12.48ID:K/hEThar
嘘です
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
- おはようございます [577451214]
- 官僚「台湾有事についての質問か、『政府として逐一答えない』と…(カタカタカタ)」高市「私1人で答弁できるわよ!」 [972432215]
