バックグラウンド
私は、TCL スクリプト言語と OpenGL の組み合わせを使用して道路を走行する車の動作をさらにレンダリングする、車の制御システムを開発するためのプログラムを持っています。
私がやっていることは、OculusRift サポートを実装することです。これまでのところ、セザー部分を解決することができました。車が運転しているウィンドウを右クリックすることで、それを oculus リフトに送信できます。これまでのところ、次のようになっています。
プログラムのビジュアル部分にはすでに多くの機能があり、FOV、魚眼レンズ、カメラの向き、車内ビューなどの調整などのオプションが含まれています.
ソフトウェア フォルダを調べたところ、次の行を含む TCL ファイルが見つかりました。
// ... cut here
gl pushmatrix
gl loadidentity
gl translate $x $y $z
gl rotate $xrot 1 0 0
gl rotate $yrot 0 1 0
gl rotate $zrot 0 0 1
gl translate $offx $offy $offz
lassign [lrange [OGL get modelviewmatrix] 12 14] tx ty tz
gl popmatrix
dict set ::View($view) CameraMode FixedToBodyA
dict set ::View($view) xrot $xrot
dict set ::View($view) yrot $yrot
dict set ::View($view) zrot [expr $zrot + $zrot_eyeAngle]
dict set ::View($view) dist $conf(dist)
dict set ::View($view) VPtOffset_x $tx
dict set ::View($view) VPtOffset_y $ty
dict set ::View($view) VPtOffset_z $tz
dict set ::View($view) FieldOfView $conf(fov)
dict set ::View($view) AspectRatio $conf(AspectRatio)
return;
}
レンダリング自体を処理する行は見つかりませんでしたが、「gl」コマンドは、この TCL ファイルがレンダリング プロセスに直接接続されて実行されていることを理解させるのに十分でした。だから私はこれで上記を拡張しました:
// load a self written DLL that wraps OVR functionality (Github link bellow)
# now run tclovrGetData() from the loaded DLL to get sensor data
set data [tclovrGetData]
// data = x y z xrot yrot zrot
gl pushmatrix
gl loadidentity
gl translate $x $y $z
gl rotate $xrot 1 0 0
...
ビデオでわかるように、モニターではきれいに見えますが、知っているように、Rift のレンズが歪み (私にとってはわずかでした) とかなりの色収差をもたらします。
私のアイデア
私が欲しいのは、ビデオの画面上の「画像/テクスチャ/フレーム」を10〜20ミリ秒ごとに取得し(用語についてはまだ慣れていません)、カラーフィルタリングを行うことです(削減できるかどうかを確認したい色収差)。次に、おそらく (すべてを独立させるために) 変更された画像で新しいウィンドウを作成し、それを Rift に送信します。基本的に、計算を実行できるように、必要な「形式」で画像を取得します。
私の考えは (レンダリング プロセスに接続されているため) 上記の TCL ファイルに追加の行を追加して、次のことを実行できる DLL 内の追加の関数を呼び出すことでした。
// Begin Oculus rendering loop
//1. get frame that is currently being rendered (in this process)
//2. copy this frame to memory
//3. perform some operations (color filtering) on this frame in memory
//4. send this frame to a new window
今私の質問:
- このようなことが可能でしょうか?
- 誰かが私を正しい方向に向けることができますか? つまり、使用できるいくつかの gl 関数はありますか?
- たぶん Direct3D も動作しますか?
私はスタックオーバーフローのこの投稿を読みましたが、理解できませんでした:/