Я разрабатываю интерактивную художественную инсталляцию с несколькими 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 из этого источника?