Приложете калибриране на Projector-Kinect към Unity3d камера

Разработвам интерактивна арт инсталация с множество 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 от този източник?


person Simon    schedule 19.05.2015    source източник


Отговори (2)


Използвах RoomAliveToolkit, за да получа проекционна матрица. Моят проект Unity също интерпретира данните и променя проектора така, че камерата да прожектира от неговата перспектива. Но скелетът не отговаряше на проекцията. Попитах момчетата от microft и те ми подсказаха. Имайте предвид, че kinect използва координатна система с дясна ръка и Unity с лява ръка.

Не знам защо твоята матрица е 11*1. Но ако искаш мога да те подкрепя. Споделяте ли източника си в github или bitbucket?

person Marush Kräftig    schedule 30.05.2015
comment
можете да коригирате матрицата на проекция на камера въз основа на docs.unity3d.com/ScriptReference/Camera-projectionMatrix. html - person Marush Kräftig; 31.05.2015

можете да коригирате прожекционната матрица на камерата въз основа на тази референция за разграничаване

person Marush Kräftig    schedule 31.05.2015