我在Unity中有一个点云,并且正在做一些图像识别的工作。图像识别完成后,在开始图像识别时,需要从摄像机框架的屏幕空间中获取点云点的屏幕点。由于图像识别需要一些时间,因此至少经过了几帧,并且相机有了新的变换(位置,旋转)。
如何从旧相机位置获取屏幕空间点? (从保存的投影矩阵和相机到世界的矩阵中)
答案 0 :(得分:0)
我自己找到了解决方案:
保存相机的projectionMatrix和worldToCameraMatrix 然后运行:
Matrix4x4 matrix = projectionMatrix * worldToCameraMatrix;
Vector3 screenPos = matrix.MultiplyPoint(destination.transform.position);
// (-1, 1)'s clip => (0 ,1)'s viewport
screenPos = new Vector3(screenPos.x + 1f, screenPos.y + 1f, screenPos.z + 1f) / 2f;
// viewport => screen
screenPos = new Vector3(screenPos.x * Screen.width, screenPos.y * Screen.height, screenPos.z);
var unityScreenPos = new Vector2(screenPos.x, Screen.height - screenPos.y);