Применение калибровки 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;
}

С помощью этого решения я могу отображать текстуры и другие вещи, правильно отображаемые в графическом интерфейсе, но я также хочу использовать преимущества трехмерного пространства.

Поэтому я ищу способ получить эту калибровку в камере Unity3D. Моя цель состоит в том, чтобы все, что видит камера, правильно отображалось из 3D-пространства в экранное пространство.

Я уже настроил камеру Unity3D. У него правильное поле зрения (60) и положение (0,0,0), как у камеры Kinect. Поэтому, если я сгенерирую скелет в Unity3D из информации Kinect Body, все будет соответствовать размерам реального мира и т. Д.

Недостающая часть — это сама калибровка.

Я думал о двух решениях:

Шейдер камеры

or

Изменить матрицу проекции

Есть ли способ реализовать этот метод для преобразования 3D-точки в 2D в шейдер, чтобы он переводил каждый пиксель в правильное положение.

Или я могу просто изменить матрицу проекции камеры Unity? Матрица проекции в Unity3d представляет собой матрицу 4 * 4 в столбцах. Моя калибровочная матрица представляет собой матрицу 11*1. Есть ли способ создать матрицу 4*4 из этого источника?


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


Ответы (2)


Я использовал RoomAliveToolkit для получения проекционной матрицы. Мой проект Unity также интерпретирует данные и изменяет проектор таким образом, что камера проецируется с его точки зрения. Но скелет не вписался в проекцию. Я спросил у парней из микрофта, и они дали мне подсказку. Имейте в виду, что 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