トップページ > 記事閲覧
3D11BackBufferTexture2Dの取得に関して
名前:猫の湯飲み 日時: 2023/02/01 20:38

VR機器で描画する際 MakeScreenで左右の目専用のスクリーンを作成して、 SetCameraViewMatrixでカメラを設定した後、MakeScreenで作成したスクリーンに3Dモデルを描画して、VR機器にGetGraphID3D11Texture2Dを使用してID3D11Texture2Dを渡すと 一部のモデルで部分的に透明になったりと正常に描画されません。 しかしPC上に描画されているスクリーンををGetUseDirect3D11BackBufferTexture2Dを使用してVR機器にID3D11Texture2Dを渡すと 3Dモデルは正常に描画されます。 左右で異なる角度からの状態を表示したいためGetGraphID3D11Texture2Dを使用して、VR機器にID3D11Texture2Dを渡すしたいのですが無理でしょうか? もしくは使い方を間違えているのでしょうか?
メンテ

Page: 1 | 2 | 3 | 4 |

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の射影行列がどのように作成されているのか謎だったのですが、こちらの ページに書かれている式と、実際の値を使用すると何か分かりそうです…
メンテ

Page: 1 | 2 | 3 | 4 |

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

   クッキー保存