public static SharpDX.Direct3D11.Buffer CreateVertexBuffer(Device device, RoomAliveToolkit.Kinect2Calibration kinect2Calibration) { // generate depthFrameToCameraSpace table var depthFrameToCameraSpaceTable = kinect2Calibration.ComputeDepthFrameToCameraSpaceTable(Kinect2Calibration.depthImageWidth, Kinect2Calibration.depthImageHeight); int numVertices = 6 * (Kinect2Calibration.depthImageWidth - 1) * (Kinect2Calibration.depthImageHeight - 1); var vertices = new VertexPosition[numVertices]; Int3[] quadOffsets = new Int3[] { new Int3(0, 0, 0), new Int3(1, 0, 0), new Int3(0, 1, 0), new Int3(1, 0, 0), new Int3(1, 1, 0), new Int3(0, 1, 0), }; int vertexIndex = 0; for (int y = 0; y < Kinect2Calibration.depthImageHeight - 1; y++) for (int x = 0; x < Kinect2Calibration.depthImageWidth - 1; x++) for (int i = 0; i < 6; i++) { int vertexX = x + quadOffsets[i].X; int vertexY = y + quadOffsets[i].Y; var point = depthFrameToCameraSpaceTable[Kinect2Calibration.depthImageWidth * vertexY + vertexX]; var vertex = new VertexPosition(); vertex.position = new SharpDX.Vector4(point.X, point.Y, vertexX, vertexY); vertices[vertexIndex++] = vertex; } var stream = new DataStream(numVertices * VertexPosition.SizeInBytes, true, true); stream.WriteRange(vertices); stream.Position = 0; var vertexBufferDesc = new BufferDescription() { BindFlags = BindFlags.VertexBuffer, CpuAccessFlags = CpuAccessFlags.None, Usage = ResourceUsage.Default, SizeInBytes = numVertices * VertexPosition.SizeInBytes, }; var vertexBuffer = new SharpDX.Direct3D11.Buffer(device, stream, vertexBufferDesc); stream.Dispose(); return vertexBuffer; }
public unsafe void SetConstants(DeviceContext deviceContext, RoomAliveToolkit.Kinect2Calibration kinect2Calibration, SharpDX.Matrix projection) { // hlsl matrices are default column order var constants = new ConstantBuffer(); for (int i = 0, col = 0; col < 4; col++) for (int row = 0; row < 4; row++) { constants.projection[i] = projection[row, col]; constants.depthToColorTransform[i] = (float)kinect2Calibration.depthToColorTransform[row, col]; i++; } constants.f[0] = (float)kinect2Calibration.colorCameraMatrix[0, 0]; constants.f[1] = (float)kinect2Calibration.colorCameraMatrix[1, 1]; constants.c[0] = (float)kinect2Calibration.colorCameraMatrix[0, 2]; constants.c[1] = (float)kinect2Calibration.colorCameraMatrix[1, 2]; constants.k1 = (float)kinect2Calibration.colorLensDistortion[0]; constants.k2 = (float)kinect2Calibration.colorLensDistortion[1]; DataStream dataStream; deviceContext.MapSubresource(constantBuffer, MapMode.WriteDiscard, SharpDX.Direct3D11.MapFlags.None, out dataStream); dataStream.Write<ConstantBuffer>(constants); deviceContext.UnmapSubresource(constantBuffer, 0); }
public static List<RoomAliveToolkit.Matrix> TransformPoints(RoomAliveToolkit.Matrix A, List<RoomAliveToolkit.Matrix> points) { var transformedPoints = new List<RoomAliveToolkit.Matrix>(); var point4 = new RoomAliveToolkit.Matrix(4, 1); point4[3] = 1; var transformedPoint4 = new RoomAliveToolkit.Matrix(4, 1); foreach (var point in points) { point4[0] = point[0]; point4[1] = point[1]; point4[2] = point[2]; transformedPoint4.Mult(A, point4); transformedPoint4.Scale(1.0f / transformedPoint4[3]); var transformedPoint = new RoomAliveToolkit.Matrix(3, 1); transformedPoint[0] = transformedPoint4[0]; transformedPoint[1] = transformedPoint4[1]; transformedPoint[2] = transformedPoint4[2]; transformedPoints.Add(transformedPoint); } return transformedPoints; }