トップページ > 記事閲覧
ワールド座標→スクリーン座標わかりません。
名前:わからんこ 日時: 2013/09/29 00:23

http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=1554 この過去の記事を参考にモデルの頭の上に名前を表示させるプログラムを作ろうとしたのですが、 思うところに表示されません。 間違っている所はどこでしょうか? VECTOR TmpPos; MATRIX mat_view; // ビュー行列 VECTOR vec_from=cam.pos; // カメラの位置 VECTOR vec_lookat=cam.target_pos; // カメラの注視点 VECTOR vec_up=VGet(0, 0, 1); // カメラの上方向 MATRIX mat_pro; // 射影行列 //ビュー行列の作成 CreateLookAtMatrix( &mat_view, &vec_from, &vec_lookat, &vec_up); //射影行列取得 mat_pro = GetCameraProjectionMatrix(); TmpPos=VTransform(mod.pos,mat_view); TmpPos=VTransform(TmpPos,mat_pro); TmpPos=ConvWorldPosToScreenPos(TmpPos); DrawFormatString( TmpPos.x, TmpPos.y, GetColor(0,0,255), "Name"); ワールド座標→スクリーン座標の変換方法は以上の様に行いました。
メンテ

Page: 1 |

Re: ワールド座標→スクリーン座標わかりません。 ( No.1 )
名前:レモン茶 日時:2013/09/29 22:24

ConvWorldPosToScreenPosに自前での行列変換は必要ありません。 渡す引数はワールド空間上での3次元座標で良いはずです。 なので、ソースコード上で言えばmod.posをそのままConvWorldPosToScreenPos関数に渡してやれば解決すると思います。 おそらく、DxLib側に設定されたカメラ行列からスクリーン座標変換が行われるのだと思うので、期待された結果を得るためには事前にカメラに行列が設定されていないといけないと思います。 それらはSetCameraViewMatrix関数とSetupCamera_ProjectionMatrix関数などを使えば大丈夫だと思います。
メンテ
Re: ワールド座標→スクリーン座標わかりません。 ( No.2 )
名前:わからんこ(解決) 日時:2013/09/29 22:45

ありがとうございます。 考えすぎましたw
メンテ
Re: ワールド座標→スクリーン座標わかりません。 ( No.3 )
名前:レモン茶(解決) 日時:2013/09/29 23:43

すいません、追記です。 自前でスクリーン座標変換を行いたい場合は以下のとおりになります。 // ビュー行列と射影行列の取得 MATRIX view = camera->GetViewMatrix(); MATRIX proj = camera->GetPerspectiveMatrix(); // ビューポート行列(スクリーン行列)の作成 float w = (float)screenSize.x / 2.0f; float h = (float)screenSize.y / 2.0f; MATRIX viewport = { w , 0 , 0 , 0 , 0 ,-h , 0 , 0 , 0 , 0 , 1 , 0 , w , h , 0 , 1 }; VECTOR screenPos , tmp = model->pos; // ビュー変換とプロジェクション変換 tmp = VTransform(tmp , view); tmp = VTransform(tmp , proj); // zで割って-1~1の範囲に収める tmp.x /= tmp.z; tmp.y /= tmp.z; tmp.z /= tmp.z; // スクリーン変換 screenPos = VTransform(vec , viewport);
メンテ

Page: 1 |

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

   クッキー保存