Разработвам интерактивна арт инсталация с множество Kinect V2, проектор и Unity3D.
Затова използвах техниката, описана тук: https://github.com/genekogan/KinectProjectorToolkit и внедрих моя собствено калибриране в Unity3D в C#.
Резултатът от калибрирането е DotNetMatrix с 11 записа.
С тази матрица мога да получа правилно картографираната 2D екранна позиция на 3D точка със следния метод.
public static Vector2 convertKinectToProjector(Vector3 ksp)
{
Vector3 kp = new Vector3(ksp.x * 1000, ksp.y * 1000, ksp.z * 1000);
Vector2 mappedScreenPoint = new Vector2();
float denom = (float)x.GetElement(8, 0) * kp.x + (float)x.GetElement(9, 0) * kp.y + (float)x.GetElement(10, 0) * kp.z + 1;
mappedScreenPoint.x = Screen.width * ((float)x.GetElement(0, 0) * kp.x + (float)x.GetElement(1, 0) * kp.y + (float)x.GetElement(2, 0) * kp.z + (float)x.GetElement(3, 0)) / denom;
mappedScreenPoint.y = Screen.height * ((float)x.GetElement(4, 0) * kp.x + (float)x.GetElement(5, 0) * kp.y + (float)x.GetElement(6, 0) * kp.z + (float)x.GetElement(7, 0)) / denom;
return mappedScreenPoint;
}
С това решение мога да показвам текстури и други неща, правилно картографирани в GUI, но също така искам да използвам предимствата на 3D пространството.
Така че търся начин да вкарам това калибриране в Unity3D камерата. Моята цел е всичко, което камерата вижда, да бъде правилно картографирано от 3D пространството в пространството на екрана.
Вече настроих Unity3D камерата. Той има правилното зрително поле (60) и позиция (0,0,0) като камерата Kinect. Така че, ако генерирам скелет в Unity3D от информацията за Kinect Body, всичко съвпада като размерите в реалния свят и т.н.
Липсващата част е самото калибриране.
Сетих се за две решения:
Шейдър на камера
or
Промяна на проекционната матрица
Има ли начин да се приложи този метод за преобразуване на 3D точка в 2D в шейдър, така че да преведе всеки пиксел на правилната позиция.
Или мога просто да променя прожекционната матрица на Unity Camera? Матрицата на проекцията в Unity3d е матрица 4*4 в голяма колона. Моята матрица за калибриране е матрица 11*1, има ли начин да генерирам матрица 4*4 от този източник?