Re: 3D11BackBufferTexture2Dの取得に関して ( No.5 ) |
- 名前:猫の湯飲み 日時:2023/02/03 16:32
管理人様->
MakeScreen で作成したグラフィックハンドルを普通に裏画面に DrawGraph で描画した場合は正常な3Dの描画結果は表示されませんでした。
確認不足で大変申し訳ありません。
//以下の場合正常に描画されます(描画先は裏画面)//
SetCameraNearFar(0.1f, 10000.0f);
SetCameraViewMatrix(GetEyeMat(vr::Eye_Right));
Render();//3Dモデルの描画
putTex((ID3D11Texture2D*)GetUseDirect3D11BackBufferTexture2D(), vr::Eye_Right);//バックバッファを渡す
putTex((ID3D11Texture2D*)GetUseDirect3D11BackBufferTexture2D(), vr::Eye_Left);//バックバッファを渡す
//以下の場合正常に描画されません(makeScreenであらかじめeyeRightとeyeLeftを作成済み。screenCenterX, screenCenterYはHMDの片目の解像度を2で割ったもの)//
//左目
SetDrawScreen(eyeLeft);
SetCameraScreenCenter(screenCenterX, screenCenterY); //カメラが見ている映像の中心座標を再設定
SetCameraNearFar(0.1f, 10000.0f);
SetCameraViewMatrix(eyeLeft);
Render();//3Dモデルの描画
putTex((ID3D11Texture2D*)GetGraphID3D11Texture2D(eyeLeft), vr::Eye_Left);//バックバッファを渡す
//右目
SetDrawScreen(eyeRight);
SetCameraScreenCenter(screenCenterX, screenCenterY); //カメラが見ている映像の中心座標を再設定
SetCameraNearFar(0.1f, 10000.0f);
SetCameraViewMatrix(eyeRight);
Render();//3Dモデルの描画
putTex((ID3D11Texture2D*)GetGraphID3D11Texture2D(eyeRight), vr::Eye_Right);//バックバッファを渡す
//裏画面
SetDrawScreen(DX_SCREEN_BACK);
DrawGraph(0,0,eyeLeft,FALSE);//裏画面に左目のグラフィックハンドルを描画
名無三様->
SetGraphModeで指定した解像度をHMDに送ると機種によって見え方がかなりずれてしまうため、
GetRecommendedRenderTargetSize()で取得したHMDの片目の画面サイズをmakeScreenで作成し解決したいと考えております。
(HMD機種によってSetGraphModeの画面サイズを変えてしまうとメインモニターで全画面表示をした際に黒帯によって見栄えが悪いという問題もあります)
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.6 ) |
- 名前:管理人 日時:2023/02/04 03:03
> MakeScreen で作成したグラフィックハンドルを普通に裏画面に DrawGraph で描画した場合は正常な3Dの描画結果は表示されませんでした。
了解です
putTex などの VR関係のAPI呼び出しを一切行わなくても正常に描画されませんでしょうか?
VR関係の API との併用が原因だった場合、私の方では対処が難しいので、一度 VR関係の API を一切呼び出さない状態で
eyeLeft と eyeRight が正しい描画結果が得られないかを確認していただければと思います m(_ _)m
また、SetDrawScreen を呼び出すと SetDrawMode や SetDrawArea など、カメラ以外の描画関係の設定も
リセットされますので、SetDrawScreen(eyeLeft) や SetDrawScreen(eyeRight) の後に描画関係の設定を
全て再設定するようにしてみてください
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.7 ) |
- 名前:猫の湯飲み 日時:2023/02/04 23:31
VR関連のAPI呼び出しを一切行わずCreateLookAtMatrixで作成したビュー行列をSetCameraViewMatrixで設定した場合
MakeScreenで作成したグラフィックハンドルに正常に描画できました。
なのでVRから取得したカメラのビュー行列がおかしいと思ったため
VR関連のAPI呼び出しを一切行わず以下のVRから取得して記録しておいたビュー行列
[0][n]->-0.710166,0.103990,0.834420,0.834142
[1][n]->0.260301,0.823944,0.128657,0.128614
[2][n]->0.447518,-0.326695,0.536523,0.536344
[3][n]->0.364111,-0.054143,0.126540,0.226497
をSetCameraViewMatrixで設定した場合も一部のモデルで部分的に透明になったりと正常に描画されませんでした。
VRから取得するビュー行列によって正常に描画されないという原因は分かったのですが、
正常に描画される3Dモデルも存在するのが釈然としないです。
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.8 ) |
- 名前:管理人 日時:2023/02/05 21:40
> なのでVRから取得したカメラのビュー行列がおかしいと思ったため
> VR関連のAPI呼び出しを一切行わず以下のVRから取得して記録しておいたビュー行列
ちょっとビュー行列っぽくない値に見えますね…
VRから行列を取得する際の API は何という名前なのでしょうか?
後は、もしかしたら VR とDXライブラリで行と列の扱いが逆である可能性もありますので
SetCameraViewMatrix( MTranspose( eyeLeft ) );
↑
このように SetCameraViewMatrix に渡す際に MTranspose関数を使用して
転置( 行と列を逆にする )するようにしてみてください m(_ _)m
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.9 ) |
- 名前:猫の湯飲み 日時:2023/02/05 23:39
SetCameraViewMatrix( MTranspose( eyeLeft ) );で描画した場合、
一部のモデルで部分的に透明になり正常に描画されませんでした。またVR機器を動かした方向とは反対向きにカメラが移動するようになりました
>VRから行列を取得する際の API は何という名前なのでしょうか?
GetProjectionMatrix
GetEyeToHeadTransform
GetDeviceToAbsoluteTrackingPose
から取得した行列の積から行列を取得しています
(下記ページにおけるmatMVPです)
VR用のAPIであるopenvrにおける行列の扱いおよび使用例についてはgithubのwikiページに書かれています
ttps://github.com/ValveSoftware/openvr/wiki/Matrix-Usage-Example
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.10 ) |
- 名前:管理人 日時:2023/02/06 00:20
ご返答ありがとうございます
> GetProjectionMatrix
> GetEyeToHeadTransform
> GetDeviceToAbsoluteTrackingPose
> から取得した行列の積から行列を取得しています
リファレンスには載っていませんが、DXライブラリには Projection Matrix を設定する関数↓がありますので
// ビュー座標からプロジェクション座標に変換するための行列を設定する
int SetTransformToProjection( MATRIX *Matrix ) ;
GetProjectionMatrix で取得した行列は SetCameraViewMatrix に設定する行列とは別に SetTransformToProjection に設定してみてください m(_ _)m
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.11 ) |
- 名前:猫の湯飲み 日時:2023/02/06 20:50
SetTransformToProjection( MATRIX *Matrix )にGetProjectionMatrixで取得した行列を設定すると
すべての3Dモデルが表示されなくなってしまいました。
(真っ暗になってしまいます)
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.12 ) |
- 名前:管理人 日時:2023/02/06 23:37
駄目でしたか…
OpenVR の行列の扱いがDXライブラリとは色々と異なる可能性がありますので、
手元で動作を確認しながら調べてみないと埒が明かない気がします…
もしよろしければ『VR の行列を使用すると正常に描画されない』現象を確認できる
プロジェクトを必要なファイルごと zipなどで圧縮した上でこちらのメールアドレス
BQE00322(あっとまーく)nifty.com
( (あっとまーく) は @ に置き換えてください )
に送っていただけないでしょうか? m(_ _;m
( ただ、私は VR機器を所持していないので、もしプログラムの実行に VR機器が必須である場合は
頂けても手元では実行できませんが… )
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.13 ) |
- 名前:管理人 日時:2023/02/08 04:53
メールありがとうございます
VR機器が無いとアップしていただいたプロジェクトは実行できませんか…
よろしければお使いのVR機器を教えていただけないでしょうか?
( もし購入する場合は同じ物を購入したほうが再現性が高くなるので )
> SetTransformToProjection( MATRIX *Matrix )にGetProjectionMatrixで取得した行列を設定すると
> すべての3Dモデルが表示されなくなってしまいました。
こちらについてですが、SetTransformToProjection に GetProjectionMatrix で取得した行列を設定した上で
if (nEye == vr::Eye_Left)
{
matMVP = m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose;
}
else if (nEye == vr::Eye_Right)
{
matMVP = m_mat4ProjectionRight * m_mat4eyePosRight * m_mat4HMDPose;
}
↑
こちらの部分から ProjectionMatrix を無くして
if (nEye == vr::Eye_Left)
{
matMVP = m_mat4eyePosLeft * m_mat4HMDPose;
}
else if (nEye == vr::Eye_Right)
{
matMVP = m_mat4eyePosRight * m_mat4HMDPose;
}
↑
このようにしても全ての3Dモデルが表示されないでしょうか?
あと、『一部のモデルで部分的に透明になったりして正常に描画されていない』状態のときの以下の値を
教えていただけないでしょうか?
m_mat4ProjectionLeft
m_mat4eyePosLeft
m_mat4HMDPose
hmdWidth
hmdHeight
m_rmat4DevicePose[使用されている要素番号]
上記の値があれば、VR機器が無くても手元で『正常に描画されない状態』を再現することができると思いますので… m(_ _)m
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.14 ) |
- 名前:猫の湯飲み 日時:2023/02/08 23:25
こちらについてですが、SetTransformToProjection に GetProjectionMatrix で取得した行列を設定した上で...
このようにしても全ての3Dモデルが表示されないでしょうか?
>全ての3Dモデルが表示されませんでした。
使用しているVR機器はVIVE Pro 2です
『一部のモデルで部分的に透明になったりして正常に描画されていない』状態の値を次の関数で取得した場合、以下の値が出力されました。
void MATRIX4_PRINT(Matrix4 val) {
const float* pos = val.get();
for (int i = 0; i < 16; i++) {
printf("pos[%d]=%f\n", i, pos[i]);
}
}
m_mat4ProjectionLef
pos[0]=0.816916
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=0.894180
pos[6]=0.000000
pos[7]=0.000000
pos[8]=-0.313354
pos[9]=-0.004750
pos[10]=-1.000007
pos[11]=-1.000000
pos[12]=0.000000
pos[13]=0.000000
pos[14]=-0.100001
pos[15]=0.000000
m_mat4eyePosLeft
pos[0]=1.000000
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=1.000000
pos[6]=0.000000
pos[7]=0.000000
pos[8]=0.000000
pos[9]=0.000000
pos[10]=1.000000
pos[11]=0.000000
pos[12]=0.031500
pos[13]=-0.000000
pos[14]=-0.015000
pos[15]=1.000000
m_mat4HMDPose
pos[0]=-0.620144
pos[1]=-0.274886
pos[2]=0.734751
pos[3]=0.000000
pos[4]=-0.140287
pos[5]=0.960361
pos[6]=0.240887
pos[7]=0.000000
pos[8]=-0.771843
pos[9]=0.046308
pos[10]=-0.634125
pos[11]=0.000000
pos[12]=-0.105748
pos[13]=0.180115
pos[14]=-0.078950
pos[15]=1.000000
m_rTrackedDevicePose[0]
pos[0]=-0.610040
pos[1]=-0.141130
pos[2]=-0.779701
pos[3]=0.000000
pos[4]=-0.274366
pos[5]=0.960761
pos[6]=0.040761
pos[7]=0.000000
pos[8]=0.743354
pos[9]=0.238789
pos[10]=-0.624824
pos[11]=0.000000
pos[12]=0.036602
pos[13]=-0.168484
pos[14]=-0.141398
pos[15]=1.000000
m_rTrackedDevicePose[2]
pos[0]=0.769317
pos[1]=0.040582
pos[2]=0.637577
pos[3]=0.000000
pos[4]=-0.253816
pos[5]=0.935255
pos[6]=0.246731
pos[7]=0.000000
pos[8]=-0.586284
pos[9]=-0.351642
pos[10]=0.729808
pos[11]=0.000000
pos[12]=-0.390341
pos[13]=-0.233292
pos[14]=0.223076
pos[15]=1.000000
HMDWidth=2996
HMDHeight=2996
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.15 ) |
- 名前:管理人 日時:2023/02/09 00:49
ご返答ありがとうございます
VIVE Pro 2 のお値段を見たら、ちょっと検証用に購入するには高額でした… orz
> 『一部のモデルで部分的に透明になったりして正常に描画されていない』状態の値を次の関数で取得した場合、以下の値が出力されました。
値を教えていただきありがとうございます
m_rTrackedDevicePose[0] と m_rTrackedDevicePose[2] は
m_rmat4DevicePose[0] と m_rmat4DevicePose[2] であると思いますが
for (uint32_t unTrackedDevice = 0; unTrackedDevice < vr::k_unMaxTrackedDeviceCount; unTrackedDevice++)
{
const vr::TrackedDevicePose_t& pose = m_rTrackedDevicePose[unTrackedDevice];
if (!pose.bPoseIsValid)
continue;
const Matrix4& matDeviceToTracking = m_rmat4DevicePose[unTrackedDevice];
matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * matDeviceToTracking;
}
↑
こちらのプログラムを拝見する限り m_rTrackedDevicePose[0].bPoseIsValid が true であれば、
常に m_rmat4DevicePose[0] だけが使用されるように思いますが、 m_rTrackedDevicePose[0] と
m_rTrackedDevicePose[2] の数値を載せていただいたということは何らかのタイミングで
m_rTrackedDevicePose[0].bPoseIsValid が false になり、 m_rTrackedDevicePose[2].bPoseIsValid が true に
なることがある、ということでしょうか?
あと、申し訳ありません、手元で計算した結果が猫の湯飲みさんの環境と同じになっているかの確認のために
DXLIB_VR::GetEyeMat(vr::Eye_Left) の際の戻り値となる MATRIX m_pos の値を教えていただけないでしょうか m(_ _;m
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.16 ) |
- 名前:猫の湯飲み 日時:2023/02/09 23:07
m_rTrackedDevicePose[0] と m_rTrackedDevicePose[2] はm_rmat4DevicePose[0] と m_rmat4DevicePose[2] です。申し訳ありません
m_rmat4DevicePose[0] と m_rmat4DevicePose[2] の数値はUpdateHMDMatrixPose()内で取得したものであり、
[0]...HMD
[2]...TrackedDeviceClass_TrackingReference(base station)
のデータでGetEyeMat(vr::EVREye eye)ではm_rTrackedDevicePose[0].bPoseIsValid が false になり、
m_rTrackedDevicePose[2].bPoseIsValid が true に になることは無くmatDeviceToTracking には常にm_rmat4DevicePose[0]...HMDのデータが代入されています
matMVP = m_mat4eyePosLeft * m_mat4HMDPose;、SetTransformToProjection( MATRIX *Matrix )にGetProjectionMatrixで取得した行列を設定したビルドで実行すると
以下の値が出力されました
HMDWidth=2952
HMDHeight=2952
m_mat4ProjectionLef
pos[0]=0.816916
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=0.894180
pos[6]=0.000000
pos[7]=0.000000
pos[8]=-0.313354
pos[9]=-0.004750
pos[10]=-1.000007
pos[11]=-1.000000
pos[12]=0.000000
pos[13]=0.000000
pos[14]=-0.100001
pos[15]=0.000000
m_mat4eyePosLeft
pos[0]=1.000000
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=1.000000
pos[6]=0.000000
pos[7]=0.000000
pos[8]=0.000000
pos[9]=0.000000
pos[10]=1.000000
pos[11]=0.000000
pos[12]=0.031500
pos[13]=-0.000000
pos[14]=-0.015000
pos[15]=1.000000
m_rmat4DevicePose[0]
pos[0]=-0.884615
pos[1]=-0.110871
pos[2]=-0.452950
pos[3]=0.000000
pos[4]=-0.165238
pos[5]=0.982827
pos[6]=0.082139
pos[7]=0.000000
pos[8]=0.436064
pos[9]=0.147506
pos[10]=-0.887744
pos[11]=0.000000
pos[12]=0.102612
pos[13]=-0.400660
pos[14]=-0.351500
pos[15]=1.000000
m_mat4HMDPose
pos[0]=-0.884615
pos[1]=-0.165238
pos[2]=0.436064
pos[3]=0.000000
pos[4]=-0.110871
pos[5]=0.982827
pos[6]=0.147506
pos[7]=0.000000
pos[8]=-0.452950
pos[9]=0.082139
pos[10]=-0.887744
pos[11]=0.000000
pos[12]=-0.112861
pos[13]=0.439607
pos[14]=-0.297688
pos[15]=1.000000
m_pos[0][n]->-0.974478,-0.029404,-0.222548,0.000000
m_pos[1][n]->0.033370,0.961394,-0.273143,0.000000
m_pos[2][n]->0.221988,-0.273599,-0.935876,0.000000
m_pos[3][n]->0.143805,0.004953,-0.555389,1.000000
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.17 ) |
- 名前:管理人 日時:2023/02/10 02:42
ご返答ありがとうございます
> のデータでGetEyeMat(vr::EVREye eye)ではm_rTrackedDevicePose[0].bPoseIsValid が false になり、
『bPoseIsValid が false になり』は正しくは『bPoseIsValid が true になり』でしょうか?
m_rTrackedDevicePose[0].bPoseIsValid が false 且つ m_rTrackedDevicePose[2].bPoseIsValid が true になることは無い
となりますと m_rTrackedDevicePose[0].bPoseIsValid も m_rTrackedDevicePose[2].bPoseIsValid も false ということになってしまうので…
m_rTrackedDevicePose[0].bPoseIsValid が true ということを前提に考えますと
matMVP は
const Matrix4& matDeviceToTracking = m_rmat4DevicePose[unTrackedDevice];
matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * matDeviceToTracking;
となり、unTrackedDevice は 0 なので
const Matrix4& matDeviceToTracking = m_rmat4DevicePose[0];
matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * matDeviceToTracking;
matDeviceToTracking は m_rmat4DevicePose[0] なので
matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * m_rmat4DevicePose[0];
GetCurrentViewProjectionMatrix() は引数が vr::Eye_Left の場合は戻り値が m_mat4eyePosLeft * m_mat4HMDPose; なので
matMVP = m_mat4eyePosLeft * m_mat4HMDPose * m_rmat4DevicePose[0];
↑
このように纏めることが出来ると思うのですが、猫の湯飲みさんが載せてくださった m_mat4eyePosLeft などの値で
上記の計算をした後の matMVP を m_pos に代入した値は以下のようになり、猫の湯飲みさんの m_pos の値とは異なりました
m_pos[0][n]->1.000000,0.000000,0.000001,0.000000
m_pos[1][n]->0.000000,0.999999,0.000000,0.000000
m_pos[2][n]->0.000001,0.000000,0.999999,0.000000
m_pos[3][n]->0.031500,0.000000,-0.015000,1.000000
単純化した計算式である matMVP = m_mat4eyePosLeft * m_mat4HMDPose * m_rmat4DevicePose[0]; について
何か私の思い違いなどありますでしょうか?
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.18 ) |
- 名前:猫の湯飲み 日時:2023/02/10 23:59
m_rTrackedDevicePose[0].bPoseIsValidとm_rTrackedDevicePose[2].bPoseIsValidはtrueでした。大変申し訳ありません。
bPoseIsValidがfalseになるのはデバイスを追跡できなかった場合のみでした。
(HMDを装着していないもしくはベースステーションの範囲外にHMDが存在する)
HMDWidth=2996
HMDHeight=2996
m_mat4ProjectionLef
pos[0]=0.816916
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=0.894180
pos[6]=0.000000
pos[7]=0.000000
pos[8]=-0.313354
pos[9]=-0.004750
pos[10]=-1.000007
pos[11]=-1.000000
pos[12]=0.000000
pos[13]=0.000000
pos[14]=-0.100001
pos[15]=0.000000
m_mat4eyePosLeft
pos[0]=1.000000
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=1.000000
pos[6]=0.000000
pos[7]=0.000000
pos[8]=0.000000
pos[9]=0.000000
pos[10]=1.000000
pos[11]=0.000000
pos[12]=0.031500
pos[13]=-0.000000
pos[14]=-0.015000
pos[15]=1.000000
m_mat4HMDPose
pos[0]=-0.969751
pos[1]=-0.240576
pos[2]=0.041298
pos[3]=0.000000
pos[4]=-0.232528
pos[5]=0.961944
pos[6]=0.143508
pos[7]=0.000000
pos[8]=-0.074251
pos[9]=0.129564
pos[10]=-0.988787
pos[11]=0.000000
pos[12]=0.050130
pos[13]=0.258287
pos[14]=-0.345270
pos[15]=1.000000
unTrackedDevice=0->type<H>//TrackedDeviceClass_HMD
matDeviceToTracking
pos[0]=-0.969751
pos[1]=-0.232528
pos[2]=-0.074251
pos[3]=0.000000
pos[4]=-0.240577
pos[5]=0.961944
pos[6]=0.129565
pos[7]=0.000000
pos[8]=0.041298
pos[9]=0.143508
pos[10]=-0.988787
pos[11]=0.000000
pos[12]=0.125010
pos[13]=-0.187252
pos[14]=-0.371142
pos[15]=1.000000
unTrackedDevice=2->type<T>//TrackedDeviceClass_TrackingReference
matDeviceToTracking
pos[0]=0.751377
pos[1]=0.057927
pos[2]=0.657325
pos[3]=0.000000
pos[4]=-0.288913
pos[5]=0.924465
pos[6]=0.248783
pos[7]=0.000000
pos[8]=-0.593263
pos[9]=-0.376840
pos[10]=0.711358
pos[11]=0.000000
pos[12]=-0.363842
pos[13]=-0.324550
pos[14]=0.140211
pos[15]=1.000000
GetCurrentViewProjectionMatrixの処理->matMVP = m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose;
GetEyeMatの処理->matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * matDeviceToTracking;
GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left)の返り値
pos[0]=-0.805146
pos[1]=-0.215315
pos[2]=-0.041298
pos[3]=-0.041298
pos[4]=-0.234925
pos[5]=0.859470
pos[6]=-0.143509
pos[7]=-0.143508
pos[8]=0.249184
pos[9]=0.120551
pos[10]=0.988794
pos[11]=0.988787
pos[12]=0.179577
pos[13]=0.232667
pos[14]=0.260272
pos[15]=0.360270
matMVP->m_pos
m_pos[0][n]->-0.454782,-0.032755,0.610615,0.610611
m_pos[1][n]->0.077430,0.886748,0.125258,0.125257
m_pos[2][n]->0.743452,-0.110389,0.781967,0.781962
m_pos[3][n]->0.583706,0.048969,0.460514,0.560511
HMDに映し出される画像は以下の通りです
ttps://ibb.co/j87XHmF
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.19 ) |
- 名前:管理人 日時:2023/02/11 01:32
ご返答ありがとうございます
私の環境でもアップしていただいた画像に似た描画結果を得ることが出来ました
> m_rTrackedDevicePose[0].bPoseIsValidとm_rTrackedDevicePose[2].bPoseIsValidはtrueでした。大変申し訳ありません。
> bPoseIsValidがfalseになるのはデバイスを追跡できなかった場合のみでした。
> (HMDを装着していないもしくはベースステーションの範囲外にHMDが存在する)
了解です
常に 0 と 2 が true ということですね、となるとこちらのコードでは
for (uint32_t unTrackedDevice = 0; unTrackedDevice < vr::k_unMaxTrackedDeviceCount; unTrackedDevice++)
{
const vr::TrackedDevicePose_t& pose = m_rTrackedDevicePose[unTrackedDevice];
if (!pose.bPoseIsValid)
continue;
const Matrix4& matDeviceToTracking = m_rmat4DevicePose[unTrackedDevice];
matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * matDeviceToTracking;
}
常に matMVP には m_rmat4DevicePose[2] の値を使った計算結果が matMVP に入ることになりますが、
それは問題ないでしょうか?( 0 が true の時の計算結果を matMVP に代入しても、その後もループは続くので
2 が true の時の計算結果が matMVP に上書きされます )
あと、
Matrix4 GetCurrentViewProjectionMatrix(vr::Hmd_Eye nEye)
{
Matrix4 matMVP;
if (nEye == vr::Eye_Left)
{
matMVP = m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose;
}
else if (nEye == vr::Eye_Right)
{
matMVP = m_mat4ProjectionRight * m_mat4eyePosRight * m_mat4HMDPose;
}
return matMVP;
}
↑
こちらを
Matrix4 GetCurrentViewProjectionMatrix(vr::Hmd_Eye nEye)
{
Matrix4 matMVP;
if (nEye == vr::Eye_Left)
{
matMVP = m_mat4eyePosLeft * m_mat4HMDPose;
}
else if (nEye == vr::Eye_Right)
{
matMVP = m_mat4eyePosRight * m_mat4HMDPose;
}
return matMVP;
}
↑
このようにして、m_mat4ProjectionLeft と m_mat4ProjectionRight をプログラム中で全く使用しないように
した場合はどのような結果になりますでしょうか?
( No.13 では m_mat4ProjectionLeft や m_mat4ProjectionRight を SetTransformToProjection で
使用していただきましたが、今回はそれもせず、m_mat4ProjectionLeft と m_mat4ProjectionRight を
プログラム中で完全に使用せずに実行した場合 )
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.20 ) |
- 名前:猫の湯飲み 日時:2023/02/11 23:12
>常に matMVP には m_rmat4DevicePose[2] の値を使った計算結果が matMVP に入ることになりますが、
>それは問題ないでしょうか?( 0 が true の時の計算結果を matMVP に代入しても、その後もループは続くので
>2 が true の時の計算結果が matMVP に上書きされます )
openVRのサンプル(ttps://github.com/ValveSoftware/openvr/blob/master/samples/hellovr_dx12/hellovr_dx12_main.cpp)のRenderScene( vr::Hmd_Eye nEye )
と同じ処理なので問題ないと思います。
m_mat4ProjectionLeft と m_mat4ProjectionRight をプログラム中で全く使用しないようにした場合
ttps://ibb.co/Qmh43dP
以上の画像のように正常に描画することは出来ますが、立体的に見えなくなります。(両眼視差が変になっている)
またVHDが向いた方向とは反対に反映されてしまいます。
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.21 ) |
- 名前:管理人 日時:2023/02/12 01:27
> openVRのサンプル(ttps://github.com/ValveSoftware/openvr/blob/master/samples/hellovr_dx12/hellovr_dx12_main.cpp)のRenderScene( vr::Hmd_Eye nEye )
> と同じ処理なので問題ないと思います。
openVR のサンプルでは
for( uint32_t unTrackedDevice = 0; unTrackedDevice < vr::k_unMaxTrackedDeviceCount; unTrackedDevice++ )
{
if( !m_rTrackedDeviceToRenderModel[ unTrackedDevice ] || !m_rbShowTrackedDevice[ unTrackedDevice ] )
continue;
const vr::TrackedDevicePose_t & pose = m_rTrackedDevicePose[ unTrackedDevice ];
if( !pose.bPoseIsValid )
continue;
if( !bIsInputAvailable && m_pHMD->GetTrackedDeviceClass( unTrackedDevice ) == vr::TrackedDeviceClass_Controller )
continue;
const Matrix4 & matDeviceToTracking = m_rmat4DevicePose[ unTrackedDevice ];
Matrix4 matMVP = GetCurrentViewProjectionMatrix( nEye ) * matDeviceToTracking;
m_rTrackedDeviceToRenderModel[ unTrackedDevice ]->Draw( nEye, m_pCommandList.Get(), m_nCBVSRVDescriptorSize, matMVP );
}
このようになっていて、ループ内に存在する
m_rTrackedDeviceToRenderModel[ unTrackedDevice ]->Draw( nEye, m_pCommandList.Get(), m_nCBVSRVDescriptorSize, matMVP );
↑こちらで描画を行っているため、0番のループで計算された matMVP が何も使われること無く 2番のループで計算された matMVP に
上書きされるということはありませんので、頂いたプログラムとは異なります
> 以上の画像のように正常に描画することは出来ますが、立体的に見えなくなります。(両眼視差が変になっている)
了解です
すみません、m_mat4ProjectionRight の値も教えていただけないでしょうか?
m_mat4ProjectionLeft の値との違いを見比べてみたいと思います m(_ _)m
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.22 ) |
- 名前:猫の湯飲み 日時:2023/02/12 16:46
>↑こちらで描画を行っているため、0番のループで計算された matMVP が何も使われること無く 2番のループで計算された matMVP に
>上書きされるということはありませんので、頂いたプログラムとは異なります
動作検証用に改変したコードを使用していました。申し訳ありません。
OpenVR のsampleにある処理m_rTrackedDeviceToRenderModel[ unTrackedDevice ]->Draw( nEye, m_pCommandList.Get(), m_nCBVSRVDescriptorSize, matMVP );は
実行してみるとunTrackedDevice=0の場合何も描画されなく、unTrackedDevice=1もしくは2のだけ(unTrackedDevice=0の処理を飛ばした時)
の場合は正常に描画されるため改変したことを見落としていました。
DirectX 11用のOpenVR のサンプルプログラム(非公式)->ttps://github.com/JamesBear/directx11_hellovr/blob/master/dxHelloworld1/dxHelloworld1.cpp
のRenderScene(vr::Hmd_Eye nEye)では
viewMatrix、worldMatrixは単位行列
projectionMatrixはmatMVP = m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose;
をそれぞれtranspose()してからシェーダに渡しているので
GetEyeMat内の
Matrix4 matMVP = GetCurrentViewProjectionMatrix( nEye ) * matDeviceToTracking;の処理を
Matrix4 matMVP = GetCurrentViewProjectionMatrix( nEye );
にしてみましたが
以下のように
ttps://ibb.co/b5QH0sC
VHDが向いた方向は合っていますが 一部のモデルで部分的に透明になったりして正常に描画されず、
立体的に見えない(両眼視差が変になっている)状態です。
m_mat4ProjectionLeft
pos[0]=0.816916
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=0.894180
pos[6]=0.000000
pos[7]=0.000000
pos[8]=-0.313354
pos[9]=-0.004750
pos[10]=-1.000007
pos[11]=-1.000000
pos[12]=0.000000
pos[13]=0.000000
pos[14]=-0.100001
pos[15]=0.000000
m_mat4ProjectionRight
pos[0]=0.818952
pos[1]=0.000000
pos[2]=0.000000
pos[3]=0.000000
pos[4]=0.000000
pos[5]=0.892256
pos[6]=0.000000
pos[7]=0.000000
pos[8]=0.318878
pos[9]=-0.017492
pos[10]=-1.000007
pos[11]=-1.000000
pos[12]=0.000000
pos[13]=0.000000
pos[14]=-0.100001
pos[15]=0.000000
 |
Re: 3D11BackBufferTexture2Dの取得に関して ( No.23 ) |
- 名前:管理人 日時:2023/02/13 00:01
m_mat4ProjectionRight の値の掲載ありがとうございます
m_mat4ProjectionRight と m_mat4ProjectionLeft では
[3][0] の値の符号が逆で、それ以外の値はほぼ同じなんですね…
その他諸々了解しました
Dxlib_vr のプログラムも頂いた状態から変化があるように感じますので、
お手数で申し訳ありませんが最新の Dxlib_vr を頂けないでしょうか? m(_ _)m
|
Re: 3D11BackBufferTexture2Dの取得に関して ( No.24 ) |
- 名前:管理人 日時:2023/02/14 01:11
メールありがとうございます
最新版の DxLib_vr を拝見しました
頂いたプロジェクトに以下の変更を加えて実行してみていただけないでしょうか?
1.m_mat4ProjectionLeft と m_mat4ProjectionRight を削除
Matrix4 GetCurrentViewProjectionMatrix(vr::Hmd_Eye nEye)
{
Matrix4 matMVP;
VAR_NAME(m_mat4HMDPose);
MATRIX4_Print(m_mat4HMDPose);
if (nEye == vr::Eye_Left)
{
matMVP = m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose;
}
else if (nEye == vr::Eye_Right)
{
matMVP = m_mat4ProjectionRight * m_mat4eyePosRight * m_mat4HMDPose;
}
return matMVP;
}
↓
Matrix4 GetCurrentViewProjectionMatrix(vr::Hmd_Eye nEye)
{
Matrix4 matMVP;
VAR_NAME(m_mat4HMDPose);
MATRIX4_Print(m_mat4HMDPose);
if (nEye == vr::Eye_Left)
{
matMVP = m_mat4eyePosLeft * m_mat4HMDPose;
}
else if (nEye == vr::Eye_Right)
{
matMVP = m_mat4eyePosRight * m_mat4HMDPose;
}
return matMVP;
}
2.UpdateCameraScreen を変更
void UpdateCameraScreen(vr::Hmd_Eye nEye, MATRIX view,MATRIX projection)
{
if (nEye == vr::Eye_Right) { SetDrawScreen(vrEyeRight); }
if (nEye == vr::Eye_Left) { SetDrawScreen(vrEyeLeft); }
ClearDrawScreenZBuffer();
ClearDrawScreen();
SetCameraScreenCenter(DXLIB_VR::GetHMDWidth()/2.0f, DXLIB_VR::GetHMDHeight()/2.0f); //カメラが見ている映像の中心座標を再設定
SetCameraNearFar(0.1f, 15000.0f);
//SetTransformToProjection(&projection);
//SetupCamera_ProjectionMatrix(projection);//<-Direct X 11用のサンプルはプロジェクションだけ送っている?(projectionを設定した場合は表示不可になってしまう)
SetCameraViewMatrix(view);
MV1DrawModel(stage);
SetDrawScreen(DX_SCREEN_BACK);//描画先を元に戻す
}
↓
void UpdateCameraScreen(vr::Hmd_Eye nEye, MATRIX view,MATRIX projection)
{
if (nEye == vr::Eye_Right) { SetDrawScreen(vrEyeRight); }
if (nEye == vr::Eye_Left) { SetDrawScreen(vrEyeLeft); }
ClearDrawScreenZBuffer();
ClearDrawScreen();
SetCameraScreenCenter(DXLIB_VR::GetHMDWidth()/2.0f, DXLIB_VR::GetHMDHeight()/2.0f); //カメラが見ている映像の中心座標を再設定
SetCameraNearFar(0.1f, 15000.0f);
float Near = 0.1f;
float Far = 15000.0f;
float Q = Far / ( Far - Near );
if (nEye == vr::Eye_Right)
{
MATRIX mat4ProjectionRight =
{
0.816916, 0.000000, 0.000000, 0.000000,
0.000000, 0.894180, 0.000000, 0.000000,
0.000000, 0.000000, Q, 1.000000,
0.000000, 0.000000, -Q * Near, 0.000000
};
SetupCamera_ProjectionMatrix(mat4ProjectionRight);
}
if (nEye == vr::Eye_Left)
{
MATRIX mat4ProjectionLeft =
{
0.816916, 0.000000, 0.000000, 0.000000,
0.000000, 0.894180, 0.000000, 0.000000,
0.000000, 0.000000, Q, 1.000000,
0.000000, 0.000000, -Q * Near, 0.000000
};
SetupCamera_ProjectionMatrix(mat4ProjectionLeft);
}
SetCameraViewMatrix(view);
MV1DrawModel(stage);
SetDrawScreen(DX_SCREEN_BACK);//描画先を元に戻す
}
追記:
すみません、こちらに載っている GetProjectionRaw で取得できる
pfLeft, pfRight, pfTop pfBottom
の値を教えていただけないでしょうか?( 左右どちらの値も )
<IVRSystem::GetProjectionRaw>
https://github.com/ValveSoftware/openvr/wiki/IVRSystem::GetProjectionRaw
VRの射影行列がどのように作成されているのか謎だったのですが、こちらの
ページに書かれている式と、実際の値を使用すると何か分かりそうです…
 |