Re: 3Dモデルが描画されているスクリーン上の座標の取得 ( No.1 ) |
- 名前:管理人 日時:2017/04/19 03:01
ワールド座標をスクリーン座標に変換するための関数 ConvWorldPosToViewPos で事足りますでしょうか?
// ワールド座標をスクリーン座標に変換する
VECTOR ConvWorldPosToScreenPos( VECTOR WorldPos ) ;
|
Re: 3Dモデルが描画されているスクリーン上の座標の取得 ( No.2 ) |
- 名前:nn 日時:2017/04/20 20:40
回答ありがとうございます!その関数は完全に見落としていました・・・!
ですが、思い通りのプログラムにはまだ一歩及びませんでした。
まず組んだプログラムはモデルと「スクリーンから見て同座標の画面奥へ直線に進む線分(ConvScreenPosToWorldPosの方を使用して線分を設定)」を衝突判定し、
衝突が検出されたスクリーン座標を取得する、というものでしたが、毎フレーム万単位の衝突判定をしなければならなく処理の関係上不可能でした。
私が実装したいプログラムは簡単に言えば、例えば
Char Model_to_Screen[(ウィンドウサイズのX成分)][(ウィンドウサイズのY成分)] = {}
と宣言された配列の
Model_to_Screen[(モデルが描画されているスクリーン座標のX成分)][(モデルが描画されているスクリーン座標のY成分)]
の要素に0以外の値を返す(1でよいです)というようなものなのですが、ConvWorldPosToScreenPos関数を使って直接モデルからスクリーン座標を得る場合、
モデルのどのデータへどのようにアクセスすればいいのかが、参照用メッシュに関する関数等を眺めてみてもよくわかりません。
説明が下手で申し訳ありませんが、漠然とした意見だけでも構いませんので、一つお力添えを頂けると非常に幸いです。
|
Re: 3Dモデルが描画されているスクリーン上の座標の取得 ( No.3 ) |
- 名前:管理人 日時:2017/04/21 00:26
すみません、何をされたいのかがまだよく理解できていません…
> 毎フレーム万単位の衝突判定をしなければならなく
スクリーンのすべてのピクセルの線分とモデルとの当たり判定をしなくてはならない
理由はなんでしょうか?
一般的には、マウスのカーソルがある座標のピクセルの線分とだけモデルとの当たり判定を
行うので何万回も当たり判定を行う必要は無いのですが…
> ConvWorldPosToScreenPos関数を使って直接モデルからスクリーン座標を得る
モデルの原点となっている座標は MV1GetPosition で取得することができますが、
こちらでは駄目でしょうか?
// モデルの座標を取得
VECTOR MV1GetPosition( int MHandle ) ;
|
Re: 3Dモデルが描画されているスクリーン上の座標の取得 ( No.4 ) |
- 名前:nn 日時:2017/04/21 14:05
初めに言った「輪郭線の色を変える」というプログラムならばマウスポインタのスクリーン座標だけ衝突判定させれば済むのですが、
「輪郭線を描画する」というプログラムの方は「スクリーン上のどこにモデルが描かれているか(モデルの不透明部分はどこか、
と言った方がわかりやすいかもしれません)」というのを、マウスポインタ上だけではなく、画面全体から毎フレーム検出したいのです。
そのようにして取得した配列(上で言うModel_to_Screen)の各要素を参照して、数値が0でない要素の周囲1pxで数値が0の座標に
DrawPixelで点を表示する、という感じで輪郭線を表示するやり方です。(多少省略して書きますが)具体的には
-------------------------------------------------------------------------
static const int WindowSize_X=(ウィンドウのサイズのX成分),WindowSize_Y=(ウィンドウのサイズのY成分);
static char Model_to_Screen[WindowSize_X][WindowSize_Y];
-------------------------------------------------------------------------
(Model_to_Screenのモデルが描画されているスクリーン座標の各要素に1を代入)←ここが知りたい!
-------------------------------------------------------------------------
for(int x=1;x<=WindowSize_X-1;x++)
for(int y=1;y<=WindowSize_Y-1;y++)
if(Model_to_Screen[x][y]!=0)
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if(Model_to_Screen[x+i][y+1]==0)
{
DrawPixel(x+i,y+j,GetColor(0,0,0));
Model_to_Screen[x+i][y+1]=1;
}
-------------------------------------------------------------------------
といった具合です・・・が、輪郭線を表示するだけなら、他にやり方があるような気がしてきました。最悪バックフェイス法を使ってどうにかできますし。
ここまで付き合っていただいた手前大変申し訳ないのですが、とりあえずこの件は解決ということで、
しばらくは別のアプローチでも試してみることにします。
が、もし私がやりたいことをご理解していただけた上でよい解決法があれば、そのときは是非ともご教授願いたいです・・・!
|
Re: 3Dモデルが描画されているスクリーン上の座標の取得 ( No.5 ) |
- 名前:管理人 日時:2017/04/30 21:11
> といった具合です・・・が、輪郭線を表示するだけなら、他にやり方があるような気がしてきました。最悪バックフェイス法を使ってどうにかできますし。
そうですね…現在の高性能なCPUでも流石に画面の全ピクセルに対して当たり判定をできるほどの
性能はありませんので、ピクセルシェーダーか、バックファイス法を使うことになると思います
|