トップページ > 記事閲覧
3Dモデルが描画されているスクリーン上の座標の取得
名前:nn 日時: 2017/04/17 20:06

描画した3Dモデルにバックフェイスを使わず輪郭線を描画したり そのモデルにマウスオーバーすることで描画した輪郭線の色を変えたり 等のプログラムを組みたくて、そのためにモデルが描画されているスクリーン上の 二次座標を1pxずつ取得できる方法を模索していたのですが、なかなか見つからず困っています。 シェーダはこちらのサイトにある「剛体メッシュのライティング無し描画」と ほぼ同じものを使用しています。射影変換後の、スクリーンにモデルを描画する段階の 座標数値にアクセスできれば解決できそうなものですが、どうもまだいまいち シェーダが入出力する数値に関するメカニズムが把握しきれていません・・・。 したがって既存のDXライブラリ関数による方法でも一向に構いません。 お手数ではございますが、解決策のご教授のほど、検討よろしくお願いします。
メンテ

Page: 1 |

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でも流石に画面の全ピクセルに対して当たり判定をできるほどの 性能はありませんので、ピクセルシェーダーか、バックファイス法を使うことになると思います
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存