工学ナビBBS



ここは工学ナビの掲示板です

画像の貼り付けも出来ます
絵文字も使えます

【書き込みに関するお願い】

・記事についての質問、意見などは遠慮なくどうぞ
・質問に対する回答はみんなでしていただけると幸いです
・利用者を著しく不快にする書き込みがあれば消すことがあります


【ARToolKit関係の質問をされる方へ】

・最低限,Googleなどで検索して調べてから質問してください
・過去ログから同様の質問がないか確認してください(下の「ワード検索」から検索できます)
・件名を書くときは,質問内容がわかるように書いてください
・自己解決した場合は,なるべくどうやって解決したのかを報告するようにしてください
・「動かない」「コンパイルできない」系の質問は,PCのスペックや使用しているカメラ,
 開発環境などを詳細に書かないと答えられない場合があります


ex-twoview kaz

2008/05/27 (Tue) 16:33:00

 はじめまして、kazといいます。
私は、ARToolkitのサンプルプログラムでexviewとtwoviewを合わせた「ex-twoview」なるプログラムを作りたいと思っています。(といっても、exviewのカメラ出力画像を2台同時出力するものですが)
 twoviewのプログラムをベースにexviewのプログラムを加えていこうとしていますが、twoviewのプログラムが複雑でどのようにプログラムを書き換えたら良いか悩んでいます。
 どなたか少しでも良いのでアドバイスをお願いします。
 ちなみに、twoviewは正常に実行できます。

OS : WindowsXP
開発環境 : VisualC++ 6.0

Re: ex-twoview - なおき

2008/05/28 (Wed) 06:57:16

>kazさん
はじめましてこんにちは.

twoViewはちょっとしかいじったことがないのですが,思うところをコメントさせていただきます.

twoViewの解読(?)にはかなりの時間を要すると思いますが,まずはGLUTの関数(glut****という名前)でやっている部分とARToolKitの関数(ar****という名前)でやっている部分に分けて注意深く読んでみることをおすすめします.

ウィンドウを2個表示したり,描画を更新したりしている部分はほとんどがGLUT(およびOpenGL)の機能によって実現しています.また,2個のキャプチャの操作は,1個の場合と異なり,ar2VideoCapNextのようなar2で始まる関数が使用されています.仕様はマニュアルで確認してください.

私の考えとしては,まずOpenGLでウィンドウを2個表示して同時に更新するプログラムを作成し,そこにexviewを移植していったほうが良いと思います.


# exviewのほうでわからないところはありますか?

Re: ex-twoview kaz

2008/05/28 (Wed) 10:58:25

お返事ありがとうございます。
すみませんが、いくつか質問を。

マニュアルというとARToolkitのホームページにある「ARToolKit Documentation」ですか?

OpenGLのウィンドウの表示はglutCreateWindow()で良いですか?(OpenGLは初心者なもので)

exviewのビデオ出力画像で、カメラCG等が映っているCG画像と実際のマーカを映し座標軸をオーバーラップする画像の2つを表示していますが、主にどの関数を使っているのでしょうか?

長文になりました。すみません。

Re: ex-twoview - なおき

2008/05/29 (Thu) 16:12:48

>マニュアルというとARToolkitのホームページにある「ARToolKit Documentation」ですか?

そうです.関数の解説はAPI Documentationにあります.
http://artoolkit.sourceforge.net/apidoc/

ちなみにARToolKit\docフォルダにも収録されています.

>OpenGLのウィンドウの表示はglutCreateWindow()で良いですか?(OpenGLは初心者なもので)

そうです.

>exviewのビデオ出力画像で、カメラCG等が映っているCG画像と実際のマーカを映し座標軸をオーバーラップする画像の2つを表示していますが、主にどの関数を使っているのでしょうか?

>カメラCG等が映っているCG画像
draw_object.cの中の
draw_exview()という関数内でやっています.

タイル状の床を描いているのは for( j = -300; j <= 200; j+= 100 )
というforループの中です.

カメラを描いているのはdraw_camera()です.
立方体を描いているのはglutSolidCube()です.
座標軸を描いているのはdraw_axis()です.

>座標軸をオーバーラップする画像
draw_object.cの中のdraw()の中でやっています.
さらにその中ではdraw_object()が呼ばれ,
その中でdraw_axis()によって座標軸を描画しています.

ついでに言うと文字を書いているのはprint_string()です.

Re: ex-twoview kaz

2008/05/29 (Thu) 19:58:09

お返事が早くて助かります。

draw_object.cがCGの設定をしているのに対してexview.cは1つのウィンドウで3つの画像を表示していると思うのですが、そこらへんの仕組みがいろいろ調べてもよくわかりません。どなたでも良いので教えてください。お願いします。

Re: ex-twoview - b2ox

2008/05/29 (Thu) 22:21:59

仕組みを理解しようと思うなら、まずはソースコードを部分的にコメントアウトしてコンパイル&実行して、3つの画像のそれぞれの部分を表示している関数や命令を絞り込んで行くべきだと思います。

Re: ex-twoview - なおき

2008/05/29 (Thu) 23:47:20

ソースを読むときは,関数名や変数名から処理内容を推理することが基本です.幸い,exviewは割と真っ当な名前付けがされています.例えば,ウィンドウ関係ならwinと名のつくところに注目です.

そうやって「ここは多分こんな処理をやっているところ!」とあたりをつけながらコメントアウト→実行を繰り返し,自分が知りたい部分のコードを絞り込むのが良いです.デバッガのステップ実行などを活用しましょう.わからないところはマニュアル頼みです.

ちなみに表示領域を3つに設定しているのは,
argInit関数です.

Re: ex-twoview kaz

2008/06/02 (Mon) 13:50:49

ソースコードでexview.cとtwoview.cはプログラムの構成がかなり違うことは皆さんご存知だと思います。
例えば、exview.cではargMainLoop()のところがtwoview.cではglutMainLoop()となっています。
なぜ、このように違うのでしょうか。また、どちらかに統一できないものでしょうか。

Re: ex-twoview - b2ox

2008/06/03 (Tue) 04:27:51

argMainLoopはARToolKitのソースコードの1つgsub.cに記述されています。
やっていることはglutの各種イベント処理関数の設定とglutMainLoopの呼び出しです。

exviewでは定型的な処理なのでgsubのargMainLoopを使い、
twoviewはそれからちょっと外れた処理なのでglutMainLoopなどを使って直接書いてあるといった感じです。
なので、argMainLoop(とargInitLoop)の中身を展開してまとめ直すといったことをすれば統一できるでしょう。

Re: ex-twoview - kaz

2008/06/06 (Fri) 17:32:42

b2ox様ありがとうございます。

b2ox様のアドバイスを受けて、argMainLoop()とargInit()の中身を展開してまとめ直そうとしています。例えば、argMainLoop()はmouseとkeyboardとmainloopをglut〜で書き直しています。
しかし、argInit()の中身がよくわかりません。どう書き直せばよいでしょう。

Re: ex-twoview - b2ox

2008/06/06 (Fri) 21:31:57

argInitはおおざっぱには
・カメラパラメータからカメラ画像のサイズを取り出す
・ウィンドウサイズとかカメラ画像を貼り付けるテクスチャのサイズとかを計算
・ウィンドウを開く
・OpenGLの初期設定
といった感じのことをやってます。

とにかく少しずつ読んで理解して、
今回の目的のためにはどれが必要でどれが要らないのかを見極めていくしかないでしょう。
まぁ完全には理解できなくてもその処理を外して動かしてみてうまく動かなければ必要な処理だし、
外しても問題なら必要ない処理だっていう判断でも十分だと思います。

Re: ex-twoview - kaz

2008/06/13 (Fri) 15:41:50

遅れてすみません。またまたb2ox様ありがとうございます。参考になります。
いろいろ調べていますが、知識や技術不足でわからないところが多いです。

また、初歩的な質問かもしれませんがアドバイスしてくれたら幸いです。

gsub.h 内の関数、argDrawMode3D()、argDrawMode2D()、argDraw3dCamera()、 argConvGlpara()はgsub_lite.h の中の関数のどれかに相当すると思うのですが、どれかわかりません。
ひょっとしてOpenGLの関数の方に同じ機能の関数があるんでしょうか。
知っている人がいたら教えてください。お願いします。

Re: ex-twoview - b2ox

2008/06/13 (Fri) 16:15:07

.hだけ見てわかるものではないよ。
ちゃんと.cを見ないと。
gsub.hで宣言してある関数はgsub.cに、
gsub_lite.hで宣言してある関数はgsub_lite.cに書いてあるんでしっかり読みましょう。
挙げてある4つの関数はどれも数行程度のものです。

ARToolKitで使っているOpenGL関数の大半は
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
で解説されているような基本的な物ばかりです。
テクスチャ周りの関数は
http://marina.sys.wakayama-u.ac.jp/~tokoi/?blogcategory=%A5%C6%A5%AF%A5%B9%A5%C1%A5%E3
で解説されている物で大体事足ります。

Re: ex-twoview - モチ

2008/06/16 (Mon) 14:07:34

すみません。gsub.cやgsub_lite.cがあるとは知りませんでした。
実際gsub.cを見て思ったのですが、
例えば、argSwapBuffers()は
void argSwapBuffers( void )
{
glutSwapBuffers();
}
となるので、書き換えるときは
glutSwapBuffers()
だけで良いと思うのですが、
argDrawMode3D()は
void argDraw3dCamera( int xwin, int ywin )
{
if( xwin == 0 && ywin == 0 ) {
glViewport(0, gWinYsize-(int)(gZoom*gImYsize),
(int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
}
else {
glViewport((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
gMiniXsize, gMiniYsize);
}

argSetStencil( 0 );

glMatrixMode(GL_PROJECTION);
glLoadMatrixd( gl_cpara );
}
となります。この場合はそのまま置き換えるのではなく、自分のプログラムにあわせて調整しなければなりませんか。

お名前
件名
メッセージ
画像
メールアドレス
ホームページ
アイコン
削除キー (半角英数字のみで4〜8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)


レンタルサーバー - アクセス解析 - 携帯日記 - - キャッシング - 出会い

FC2無料掲示板

Copyright ©2004-2005 FC2 Inc. All Rights Reserved.