HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0416
youdaiHGIMG4のgpcameraと固有の透視図変換系行列のuniformの関係について教えてください5解決


youdai

リンク

2023/4/16(Sun) 16:12:21|NO.99307

HGIMG4のgpcameraと固有の透視図変換系行列のuniformの関係について調べています。
gpcameraはカメラを生成する命令ですが、それはGLSLシェーダーのuniformのmatrixやvec4にどのように反映されているか教えてください。

gameplay3d - github
https://github.com/gameplay3d/gameplay

gameplay3dでは以下の定数が列挙されています。

matrix系?

・WORLD_MATRIX
・VIEW_MATRIX
・PROJECTION_MATRIX
・VIEW_PROJECTION_MATRIX
・WORLD_VIEW_PROJECTION_MATRIX
・INVERSE_TRANSPOSE_WORLD_MATRIX
・INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX

vec4系?

・CAMERA_WORLD_POSITION
・CAMERA_VIEW_POSITION
・MATRIX_PALETTE
・SCENE_AMBIENT_COLOR

例えば、HGIMG4上のgpcameraが以下の場合で、


gpcamera id_camera, 45.0, 1.5, 0.5, 768.0, 0

例えば、uniformがWORLD_VIEW_PROJECTION_MATRIXの場合、そのmatrixの行列の中身とgpcameraに入れた数値の関連はどうなっていますか?
どの行列のどの部分にfovの45.0が反映されているのでしょうか?


// gpcamera id_camera, 45.0, 1.5, 0.5, 768.0, 0 の場合 WORLD_VIEW_PROJECTION_MATRIX = (?,?,?,?, ?,?,?,?, ?,?,?,?, ?,?,?,?)

この行列は透視図変換系の行列だと思うのですが、仕様書がないため、この部分の具体的な仕様が分かりません。
ご存知の方がいらっしゃれば、ぜひご教授お願い致します。



この記事に返信する


ギバロウ

リンク

2023/4/17(Mon) 04:21:31|NO.99308

レンダリングに必要な行列は、gameplayが勝手に作ってくれます。
プロジェクション変換行列とカメラの設定に関しては、下記のサイトがわかりやすいかと思います。
https://yttm-work.jp/gmpg/gmpg_0004.html



youdai

リンク

2023/4/17(Mon) 10:07:29|NO.99309

> ギバロウ さん

アドバイスありがとうございます。
教えて頂いたサイトは大変参考になります。

HGIMG4(gameplay3d)の透視図変換系行列の仕様を調べている理由ですが、シェーダーで動的な投影テクスチャをやりたいと思ったのが切っ掛けです。
動的な投影テクスチャをやる場合、シェーダーに対して2つ以上のカメラ設定の関係の行列をuniformで送ってやる必要がある(2つ目以降のカメラ関係の行列を投影テクスチャ座標用の計算に使用する)のですが、HGIMG4では1つのカメラの設定の行列関係しかuniformで送っていないので、自前で計算して他のカメラの行列を送ってやる必要があるようです。
また、他にも特殊なシェーダーを作成する時には、複数のカメラ関係の行列や、そのカメラの行列などを元にした特殊な行列の自前の計算は必要になるケースが多いようです。
カメラ系の行列を自前で計算できるようになると、色々な表現に応用できるみたいです。

教えて頂いたサイトを参考に、やってみようと思います。



usagi

リンク

2023/4/18(Tue) 22:23:36|NO.99312

もし勘違いしてたら申し訳ございませんが、
hspの実装はopenHSPに公開されてますので、
gqmat.cppあたりを参照すれば欲しい情報が得られそうでしょうか?

※Bindingで検索するなど

https://github.com/onitama/OpenHSP/blob/b3f5abe784f94ba22efa37e114deeff922f6692a/src/hsp3dish/win32gp/gpmat.cpp



usagi

リンク

2023/4/19(Wed) 20:48:13|NO.99313

ついでで、gpcamera についてはgame->makeNewCam()が呼び出されてますが、
NodeやCamera、Matrix関係をみると。。。

・getWorldViewProjectionMatrix() : ワールドビュープロジェクション取得

 // 中身はビュープロジェクションとワールドの乗算
 Matrix::multiply(getViewProjectionMatrix(), getWorldMatrix(), &worldViewProj);


・getViewProjectionMatrix() : ビュープロジェクション取得

 // 中身はアクティブなカメラのプロジェクションとビューの乗算
 camera->getViewProjectionMatrix();
 Matrix::multiply(getProjectionMatrix(), getViewMatrix(), &_viewProjection);


・getViewMatrix():カメラのビュー取得
 _node->getWorldMatrix().invert(&_view); ※ノードの逆行列だったり
 _view.setIdentity(); ※単位行列だったり

・getProjectionMatrix():カメラのプロジェクション取得
 ★透視投影だけ抜粋 視野角、アスペクト比(横÷縦)、近景、遠景
 Matrix::createPerspective(_fieldOfView, _aspectRatio, _nearPlane, _farPlane, &_projection);

★中身抜粋★
float f_n = 1.0f / (zFarPlane - zNearPlane);
float theta = MATH_DEG_TO_RAD(fieldOfView) * 0.5f; ★FOVはラジアンにして半分
float divisor = tan(theta);
float factor = 1.0f / divisor;
★ここが多分知りたいところ?かも?
dst->m[0] = (1.0f / aspectRatio) * factor;
dst->m[5] = factor;
dst->m[10] = (-(zFarPlane + zNearPlane)) * f_n;
dst->m[11] = -1.0f;
dst->m[14] = -2.0f * zFarPlane * zNearPlane * f_n;


・getWorldMatrix()
 親がいる場合: Matrix::multiply(parent->getWorldMatrix(), getMatrix(), &_world);
 ※親のワールドにローカルを乗算
 親がいない場合;_world = getMatrix();
 ※そのままローカル座標


と調べるのに必要そうな情報をつらつか書きましたが、
まとめると、一般的な3Dの座標変換をしているだけの様で、特別な仕様は無さそうでした。
(ローカル*ワールド*ビュー*プロジェクション)

>どの行列のどの部分にfovの45.0が反映されているのでしょうか?
★の所が、おそらく知りたい具体的な仕様という所なのかと思いますが、
透視行列だけなので、実用は求めたい所まで行列を掛け合わせる必要があるとは思います。

たぶん、"Matrix.cpp"を参照されると欲しい情報(計算式など)があるかと思いました。
何かご参考になれば幸いです。



youdai

リンク

2023/4/22(Sat) 13:18:39|NO.99323

> usagi さん
> ★ここが多分知りたいところ?かも?

まさにこういう部分を調べようとしていました!
大変助かります。

> まとめると、一般的な3Dの座標変換をしているだけの様で、特別な仕様は無さそうでした。

ありがとうございます。
これが一般的な変換かどうかもよく分からなかったので、判断の基準になります。

教えて頂いた情報を元に学んでいこうと思います。



ONION software Copyright 1997-2023(c) All rights reserved.