ページ 11

dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 18:54
by kazuoni
お邪魔します。

現在、憂煉様の制作されたDXライブラリPortableを用いて
プログラムをしているのですが、
普通ならば、dxlibp.aにリンクをするのですが、
本家互換との事なので、本家のライブラリとリンクさせたいのです。
が、方法がイマイチ分かりません。VECTORのあたりは、PSPSDK中心で組まれているので、
そのあたりは省くとして、それ以外を本家からリンクしたいと思っています。

dxlibp.hを「プロジェクトに追加すべきファイル_VC用」に追加するとして、
dxlibp.hにはどの様な追記が必要になるのでしょうか?

本家のDxLib.hに書いてある「ライブラリリンク定義」を
dxlibp.hにそのままコピぺし、
main.cppでDxLib.hをインクルード
Func.cppでdxlibp.hをインクルード
の様にし、Func.cppでDXライブラリ関数を使用するとリンクエラー(LNK2019)が出てしまいます。

よろしくお願いします。

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 20:24
by Justy
 本家のライブラリとリンクって、Windows用のライブラリと、ってことですか?

 DXPはあまりよく知らないのですが、普通に考えて「本家互換」とはDXライブラリと同じ関数を使えば
同じような挙動になるといった関数名・引数などのインターフェースとその挙動に関する
互換ではないでしょうか。

 WindowsPCと PSPでは OSも CPUも違うので中間言語でもなければバイナリーレベルでの
互換はないのでWindows用のライブラリをリンクすることは出来ないかと。

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 20:43
by kazuoni
ご回答ありがとうございます。

申し訳ありません。コンパイラはVCを使います。
つまり、PC用のアプリケーションを作ります。
結局はDXPの関数のみをインクルード出来ればよいと言うだけです。

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 20:58
by Justy
 なるほど、そういうことですか。

 dxlib.hと dxlibp.hを混在させたい、と。
 なんか無理がありそうな気がしてならないのですが、リンクエラーとは具体的に
どんなメッセージを出していますか?



※ dxlibpの方は当然と言えば当然ですが double型が全面的に取っ払われていますね。
 これはエラーを起こす原因になるのかも。

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 21:07
by kazuoni
現在、Func.cppは以下の様になってます。
#include "dxlibp.h"

int Func()
{
    return DrawString(0,0,"TEST",0xffffff);
}
1>Func.obj : error LNK2019: 未解決の外部シンボル _DrawString が関数 "int __cdecl Func(void)" (?Func@@YAHXZ) で参照されました。

よくみるやつですが・・・。

> dxlibpの方は当然と言えば当然ですが double型が全面的に取っ払われていますね。
すっかり忘れていました。。
これじゃ拡大、縮小、回転系全部まずいですね。。
結局は現在DXPに存在する関数をすべてをラップして、新たなヘッダが必要になりますかね。。
やりたい事は、DXライブラリにはあって、DXPにはない関数が登場する場合、
コンパイルエラー(関数が存在しない)が出てくれれば用が足りるんですが・・・。 画像

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 21:13
by Justy
 あー、シンボル名で気付きましたが dxlibpの方は全部 extern "C"が入っていますね。
 これを削除するとどうなりますか?

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 21:34
by kazuoni
お次はこのエラーです

1>Func.obj : error LNK2019: 未解決の外部シンボル
"int __cdecl DrawString(int,int,char const *,int,int)" (?DrawString@@YAHHHPBDHH@Z)
が関数 "int __cdecl Func(void)" (?Func@@YAHXZ) で参照されました。

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 21:56
by Justy
 後は名前空間くらいでしょうか。
 本家 3.0から関数が名前空間に囲まれてますんで。

Re:dxlibp.hとDxLib.libのリンク方法

Posted: 2010年4月03日(土) 22:09
by kazuoni
見事にコンパイル通りました。

うーん・・・。しかし、やはり、すべてdouble→floatとなっているところが
気持ち悪いですね。「一応」は動くみたいです。
ここはラップした方がいいですね。
ってことは結構全体的に手間がかかりそうで、結局全部手を加えそうな。。

質問は解決しましたので、今回はこれで解決とさせていただきます!
ご回答ありがとうございました。 画像

複数シルエット画像からの三次元オブジェクト再構築

Posted: 2010年4月16日(金) 09:24
by ろしなんて
コンピュータグラフィックスアルゴリズムの課題で、複数シルエット画像からの三次元オブジェクト再構築にとりかかっています。

8台のカメラで人物を撮影した白黒のシルエット画像が8枚あります。(白:人物 黒:背景)
8台のカメラはキャリブレーションされており、それぞれのカメラの透視投影行列は、与えられています。
この8枚のシルエット画像から、視体積交差法で人物の三次元点群を求め、Paraview等のアプリケーションで点群を可視化するという課題があるのですが、どのように始めたらいいのか、よくわかりません。

現在の自分の考えとしては、world座標に人物より大きな立方体を作り、視体積交差法でその立方体を削っていけばいいのかと思っているのですが、立方体のサイズや、定義の方法など、具体的なやり方がまったくわかりません。

シルエット画像をスキャンし、もし、あるピクセルの色が白ならば、そのxy座標を、透視投影行列とあわせて、
どのように使えばいいのでしょうか? 透視投影行列は3x4の行列で、3次元座標[x, y, z, 1]を
2次元座標[x, y, w]に変換すると聞いたのですが、とすると、この場合、シルエット画像のxy座標は、どちらに代入すればいいのでしょうか? 3次元座標のほうに、z座標を決めて代入すればいいのでしょうか? その場合どのようにz座標を決定すればいいのでしょうか?

また、ボクセル法を使う方法もあると聞いたのですが、それで3次元点群を求められるのでしょうか?
使うならば、どのようにボクセルを定義すればいいのでしょうか?

質問さえも、整理されてなくて、すみません。
うまく質問もできないぐらい混乱しています。

8枚のシルエット画像と、8台のカメラの、それぞれの透視投影行列を添付します。

課題の提出期限は来週22日までです。
よいアドバイスをよろしくお願いします。

言語:C++を使う予定ですが、課題自体に言語の制限はありません。

Re:複数シルエット画像からの三次元オブジェクト再構築

Posted: 2010年4月16日(金) 10:45
by たいちう
かなり難しい課題ですね。授業で十分な説明があったか、
高度な応用力を要求されているのだと思います。
授業で別の説明があったのならば、以下の方針は無視してください。

まずは条件を簡単にして作成し、徐々に仕様を満たしていくのが良いでしょうから、
次の条件で開始してはどうでしょうか?

物体は、-1 <= x, y, z <= 1の立法体内にある。
カメラはA(+∞, 0, 0), B(0, +∞, 0), C(0, 0, +∞)の3台。
カメラAはY座標正の方向を上とする(他の2台も適当に決めてください)。

図形もまずは単純なもので始めます。
3方向の画像が全て円ならば、できあがる立体は球に近いものになるでしょう。
その他、円筒とか三角錐や四角錐等が簡単な立体でしょう。

ここまでできたら残る難問はカメラの位置を自由に選べるようにすることのみですが、
これは後で心配すれば良いでしょう(ここまで辿り着けないなら心配の必要はありません)。


この条件で少しはイメージが固まりますか?
判りにくいところがあれば、その部分を質問してください。

Re:複数シルエット画像からの三次元オブジェクト再構築

Posted: 2010年4月16日(金) 12:41
by ろしなんて
回答ありがとうございます。

イメージはつかめたと思うのですが、いかんせんコーディングのスキルが伴いません。
このクラスで、初めてコンピューターグラフィックスプログラミングに触れました。
この一つ前の課題では、逆マッピング変換を使用した2D画像の変形を行いました。
今回の課題が二回目のコンピュータグラフィックスプログラミングです。
ですので、上の単純化した例ですら、どのようにコーディングしたらよいのか、さっぱりわかりません。
どこかに良い例となるソースコードがないかと探してみたのですが、どこもコンセプトのみであまり役には立ちませんでした。もし、テンプレートとなる様なソースコードがあれば、お教え頂けたら幸いです。

Re:複数シルエット画像からの三次元オブジェクト再構築

Posted: 2010年4月16日(金) 13:05
by たいちう
Web上には多種多様なソースコードがありますので、
うまく見つけて修正することで課題をクリアできていたのでしょう。
自分の役に立つソースコードをうまくみつけることも大切なスキルです。

しかし仕様が高度・専門的になるにつれて、求める仕様に近いソースコードが
みつかりにくくなるのは当然のことですので、その場合は、自分の持つイメージを
ソースコードにするという応用力が必要です。
今までの課題で身に付けられなかったのでしょうか。


> ですので、上の単純化した例ですら、どのようにコーディング
> したらよいのか、さっぱりわかりません。

それでは、もっと単純化しましょう。
2次元にします。

図形は -1 <= x, y <= 1 の範囲。
カメラは(+∞, 0)と(0, +∞)の2台。
カメラの画像は(-1 <= a <= b <= 1)という情報です。
2つのカメラからの画像を基にして、元の図形を再現してください。

プログラム作成の前に、紙の上で考えてみてください。

Re:複数シルエット画像からの三次元オブジェクト再構築

Posted: 2010年4月16日(金) 15:07
by ろしなんて
本当にこんな質問に付き合って頂きありがとうございます。

すみません。2次元で考えたら、更によく分からなくなってしまいました。
というか、2次元で、カメラをあつかうというイメージすらつかめてません。


もう一度、自分が課題で何が分からないのか整理してみました。
課題で自分がよく分からないのは、
-どのようにコード内でworld座標の立方体を定義すればよいのか?
-どのように立方体の大きさを決めればいいのか?
-どのようにシルエット画像の座標を、透視投影行列(projection matrix)を使って変換すればいいのか?
-どのように上で得られる座標を使って、立方体を、視体積交差法で削っていけばいいのか?
です。

とくによく分からないのは、透視投影行列の使い方です。
 w[u, v, 1] = [3x4 projection matrix] * [X, Y, Z, 1]

となると思うのですが、この時、シルエット画像のxy座標はu,vかX,Yのどちらに代入すればいいのかがよく分かりません。もしu,vだったらどのようにwを求めるのか?もしX,YだったらどのようにZを求めるのか?がよく分かりません。
また、X,Yに代入し、適切なZも得てu,vを求めた場合、x = u/w, y = v/wとなると思うのですが、
この2次元座標は、いったい何であり、どのようにこの座標を使って視体積交差法を使えばいいのかがよくわかりません。

すみません、書き出してみたら、分からないことだらけだと言うことに改めて気づきました。