public ProjectorCameraEnsemble(int numProjectors, int numCameras) { projectors = new List<ProjectorCameraEnsemble.Projector>(); for (int i = 0; i < numProjectors; i++) { var projector = new ProjectorCameraEnsemble.Projector(); projector.name = i.ToString(); projector.hostNameOrAddress = "localhost"; projectors.Add(projector); } cameras = new List<ProjectorCameraEnsemble.Camera>(); for (int i = 0; i < numCameras; i++) { var camera = new ProjectorCameraEnsemble.Camera(); camera.name = i.ToString(); camera.hostNameOrAddress = "localhost"; cameras.Add(camera); if (i == 0) camera.pose = RoomAliveToolkit.Matrix.Identity(4, 4); } name = "Untitled"; imagingFactory = new SharpDX.WIC.ImagingFactory(); stopWatch = new System.Diagnostics.Stopwatch(); }
void SetViewProjectionFromCamera(ProjectorCameraEnsemble.Camera camera) { view = new SharpDX.Matrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { view[i, j] = (float)camera.pose[i, j]; } } view.Invert(); view.Transpose(); float aspect = (float)videoPanel1.Width / (float)videoPanel1.Height; projection = PerspectiveFov(35.0f / 180.0f * (float)Math.PI, aspect, 0.1f, 100.0f); projection.Transpose(); }
public ProjectorCameraEnsemble(int numProjectors, int numCameras) { projectors = new List<ProjectorCameraEnsemble.Projector>(); for (int i = 0; i < numProjectors; i++) { var projector = new ProjectorCameraEnsemble.Projector(); projector.name = i.ToString(); projector.hostNameOrAddress = "localhost"; projectors.Add(projector); } cameras = new List<ProjectorCameraEnsemble.Camera>(); for (int i = 0; i < numCameras; i++) { var camera = new ProjectorCameraEnsemble.Camera(); camera.name = i.ToString(); camera.hostNameOrAddress = "localhost"; cameras.Add(camera); if (i == 0) camera.pose = RoomAliveToolkit.Matrix.Identity(4, 4); } name = "Untitled"; }
// encapsulates d3d resources for a camera public CameraDeviceResource(SharpDX.Direct3D11.Device device, ProjectorCameraEnsemble.Camera camera, Object renderLock, string directory) { this.device = device; this.camera = camera; this.renderLock = renderLock; // Kinect depth image var depthImageTextureDesc = new Texture2DDescription() { Width = Kinect2Calibration.depthImageWidth, Height = Kinect2Calibration.depthImageHeight, MipLevels = 1, ArraySize = 1, Format = SharpDX.DXGI.Format.R16_UInt, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), Usage = ResourceUsage.Dynamic, BindFlags = BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.Write, }; depthImageTexture = new Texture2D(device, depthImageTextureDesc); depthImageTextureRV = new ShaderResourceView(device, depthImageTexture); var floatDepthImageTextureDesc = new Texture2DDescription() { Width = Kinect2Calibration.depthImageWidth, Height = Kinect2Calibration.depthImageHeight, MipLevels = 1, ArraySize = 1, Format = SharpDX.DXGI.Format.R32_Float, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.None, }; floatDepthImageTexture = new Texture2D(device, floatDepthImageTextureDesc); floatDepthImageRV = new ShaderResourceView(device, floatDepthImageTexture); floatDepthImageRenderTargetView = new RenderTargetView(device, floatDepthImageTexture); floatDepthImageTexture2 = new Texture2D(device, floatDepthImageTextureDesc); floatDepthImageRV2 = new ShaderResourceView(device, floatDepthImageTexture2); floatDepthImageRenderTargetView2 = new RenderTargetView(device, floatDepthImageTexture2); // Kinect color image var colorImageStagingTextureDesc = new Texture2DDescription() { Width = Kinect2Calibration.colorImageWidth, Height = Kinect2Calibration.colorImageHeight, MipLevels = 1, ArraySize = 1, Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), Usage = ResourceUsage.Dynamic, BindFlags = BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.Write }; colorImageStagingTexture = new Texture2D(device, colorImageStagingTextureDesc); var colorImageTextureDesc = new Texture2DDescription() { Width = Kinect2Calibration.colorImageWidth, Height = Kinect2Calibration.colorImageHeight, MipLevels = 0, ArraySize = 1, Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.GenerateMipMaps }; colorImageTexture = new Texture2D(device, colorImageTextureDesc); colorImageTextureRV = new ShaderResourceView(device, colorImageTexture); // vertex buffer var table = camera.calibration.ComputeDepthFrameToCameraSpaceTable(); 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 = table[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, }; vertexBuffer = new SharpDX.Direct3D11.Buffer(device, stream, vertexBufferDesc); vertexBufferBinding = new VertexBufferBinding(vertexBuffer, VertexPosition.SizeInBytes, 0); stream.Dispose(); var colorImage = new RoomAliveToolkit.ARGBImage(Kinect2Calibration.colorImageWidth, Kinect2Calibration.colorImageHeight); ProjectorCameraEnsemble.LoadFromTiff(imagingFactory, colorImage, directory + "/camera" + camera.name + "/color.tiff"); var depthImage = new RoomAliveToolkit.ShortImage(Kinect2Calibration.depthImageWidth, Kinect2Calibration.depthImageHeight); ProjectorCameraEnsemble.LoadFromTiff(imagingFactory, depthImage, directory + "/camera" + camera.name + "/mean.tiff"); lock (renderLock) // necessary? { UpdateColorImage(device.ImmediateContext, colorImage.DataIntPtr); UpdateDepthImage(device.ImmediateContext, depthImage.DataIntPtr); } colorImage.Dispose(); depthImage.Dispose(); }