將 view 矩陣分解成 eye、target、up
可以使用 LookAt 函數來計算 view 矩陣。介面類似:
Matrix4f Matrix4f::LookAtMat(const Vec3f& eye, const Vec3f& target, const Vec3f& up);
計算過程和原理很容易找到。我們的粒子系統在 update 的時候,用到 eye、targe、up,需要將這三個參數保存下來。一直都用 LookAt 函數來設置 view 矩陣,沒有出現過問題。
前段時間,公司項目需要接入 ARKit, 在空間上放置一些粒子。ARKit 有函數可以獲取到 view 矩陣,但沒有 eye、target、up。為使 ARKit 和原來的粒子系統結合起來,產生了一個問題,如何使用 view 矩陣來計算出 eye、target、up?我們使用 OpenGL,矩陣是列優先的。
我卡在了這個問題上,查找資料,找到:
- Get eye, target and up vectors from view matrix
- eye and up vectors from view matrix
嘗試了,但似乎不行,可能我某個地方弄錯了。最終是另一個同事幫助我解決了這個問題。原理其實很簡單,view 矩陣是 world 到 view 的轉換,view 矩陣的逆自然是 view 到 world 的轉換。代碼如下:
Matrix4f viewToWorld = viewMat:inverted();Vec3f eye = viewToWorld.multiplyPoint3x4(Vec3f(0, 0, 0)); Vec3f forward = viewToWorld.multiplyDirection(Vec3f(0, 0, -1)); Vec3f target = eye + forward;Vec3f up = viewToWorld.multiplyDirection(Vec3f(0, 1, 0));
這裡的 multiplyPoint3x4 實際等價於
Vec4f v = matrix * Vec4f(x, y, z, 1);return Vec3f(v.x, v.y, v.z);
multiplyDirection 等價於
Vec4f v = matrix * Vec4f(x, y, z, 0);return Vec3f(v.x, v.y, v.z);
如此計算後,ARKit 和原有的粒子系統代碼可以結合起來使用了。或者這個問題很簡單,高手反而不屑於寫出來。只是我既然被卡住了,也記錄一下。
推薦閱讀:
※怎樣利用 iOS 的「備忘錄」進行繪畫創作?
※Siri 屬於語音識別還是人工智慧?
※從 NSObject 的初始化了解 isa
※【OSG】【非越獄調試】通過案例入門Frida-安裝firda及其基本功能