示例#1
0
        void CheckTexture()
        {
            var targetWidth  = -1;
            var targetHeight = -1;

            if (Distorted)
            {
                // Distorted + fisheye - render to cubemap, then distort to sensor-sized texture
                if (Fisheye)
                {
                    if (renderTarget != null && (!renderTarget.IsCube || !renderTarget.IsValid(CubemapSize, CubemapSize)))
                    {
                        renderTarget.Release();
                        renderTarget = null;
                    }
                    if (renderTarget == null)
                    {
                        renderTarget = SensorRenderTarget.CreateCube(CubemapSize, CubemapSize, faceMask);
                        SensorCamera.targetTexture = null;
                    }
                }
                // Distorted - render to larger texture, then distort to sensor-sized one
                else
                {
                    targetWidth  = LensDistortion.ActualWidth;
                    targetHeight = LensDistortion.ActualHeight;
                }

                if (DistortedHandle != null && !DistortedHandle.IsValid(Width, Height))
                {
                    DistortedHandle.Release();
                    DistortedHandle = null;
                }

                if (DistortedHandle == null)
                {
                    DistortedHandle = SensorRenderTarget.Create2D(Width, Height, GraphicsFormat.R8G8B8A8_SRGB, true);
                }
            }
            else
            {
                // Undistorted - use only sensor-sized texture
                if (DistortedHandle != null)
                {
                    DistortedHandle.Release();
                    DistortedHandle = null;
                }

                targetWidth  = Width;
                targetHeight = Height;
            }

            if (targetWidth > 0)
            {
                if (renderTarget != null && !renderTarget.IsValid(targetWidth, targetHeight))
                {
                    renderTarget.Release();
                    renderTarget = null;
                }
                if (renderTarget == null)
                {
                    renderTarget = SensorRenderTarget.Create2D(targetWidth, targetHeight, GraphicsFormat.R8G8B8A8_SRGB, !Distorted);
                    SensorCamera.targetTexture = renderTarget;
                }
            }

            if (CurrentByteBufferSize != ByteBufferSize)
            {
                ReadbackPool.Resize(ByteBufferSize);
                CurrentByteBufferSize = ByteBufferSize;
            }
        }
示例#2
0
        private void Reset()
        {
            if (PointCloudBuffer != null)
            {
                PointCloudBuffer.Release();
                PointCloudBuffer = null;
            }

            if (LatitudeAnglesBuffer != null)
            {
                LatitudeAnglesBuffer.Release();
                LatitudeAnglesBuffer = null;
            }

            UsedMeasurementsPerRotation = (int)(MeasurementsPerRotation * HorizontalAngle / 360f);
            DeltaLongitudeAngle         = HorizontalAngle / 360f / UsedMeasurementsPerRotation;
            StartLongitudeOffset        = ForwardAngle / 360f - HorizontalAngle / 720f + 0.5f;
            MaxAngle = Mathf.Abs(CenterAngle) + FieldOfView / 2.0f;

            float startLatitudeAngle;

            // Assuming center of view frustum is horizontal, find the vertical FOV (of view frustum) that can encompass the tilted Lidar FOV.
            // "MaxAngle" is half of the vertical FOV of view frustum.
            if (VerticalRayAngles.Count == 0)
            {
                MaxAngle = Mathf.Abs(CenterAngle) + FieldOfView / 2.0f;
                MinAngle = Mathf.Abs(CenterAngle) - FieldOfView / 2.0f;

                startLatitudeAngle = 90.0f + MaxAngle;
                //If the Lidar is tilted up, ignore lower part of the vertical FOV.
                if (CenterAngle < 0.0f)
                {
                    startLatitudeAngle -= MaxAngle * 2.0f - FieldOfView;
                }
            }
            else
            {
                LaserCount         = VerticalRayAngles.Count;
                startLatitudeAngle = 90.0f - VerticalRayAngles.Min();
                var endLatitudeAngle = 90.0f - VerticalRayAngles.Max();
                FieldOfView = startLatitudeAngle - endLatitudeAngle;
                MaxAngle    = Mathf.Max(startLatitudeAngle - 90.0f, 90.0f - endLatitudeAngle);
                MinAngle    = Mathf.Min(startLatitudeAngle - 90.0f, 90.0f - endLatitudeAngle);
            }

            CurrentVerticalRayAngles           = new List <float>(VerticalRayAngles);
            CurrentLaserCount                  = LaserCount;
            CurrentUsedMeasurementsPerRotation = UsedMeasurementsPerRotation;
            CurrentHorizontalAngle             = HorizontalAngle;
            CurrentForwardAngle                = ForwardAngle;
            CurrentFieldOfView                 = FieldOfView;
            CurrentCenterAngle                 = CenterAngle;
            CurrentMinDistance                 = MinDistance;
            CurrentMaxDistance                 = MaxDistance;

            var latitudeAngles = new float[LaserCount];

            if (VerticalRayAngles.Count == 0)
            {
                if (LaserCount == 1)
                {
                    latitudeAngles[0] = 1f - (90f + CenterAngle) * Mathf.Deg2Rad / Mathf.PI;
                }
                else
                {
                    var deltaLatitudeAngle = FieldOfView / LaserCount;
                    var index = 0;
                    var angle = startLatitudeAngle;
                    while (index < LaserCount)
                    {
                        latitudeAngles[index] = 1f - angle * Mathf.Deg2Rad / Mathf.PI;
                        index++;
                        angle -= deltaLatitudeAngle;
                    }
                }
            }
            else
            {
                for (var index = 0; index < LaserCount; index++)
                {
                    latitudeAngles[index] = 1f - ((90.0f - VerticalRayAngles[index]) * Mathf.Deg2Rad / Mathf.PI);
                }
            }

            LatitudeAnglesBuffer = new ComputeBuffer(LaserCount, sizeof(float));
            LatitudeAnglesBuffer.SetData(latitudeAngles);

            var totalCount = LaserCount * UsedMeasurementsPerRotation;

            PointCloudBuffer = new ComputeBuffer(totalCount, UnsafeUtility.SizeOf <Vector4>());
            Points           = new Vector4[totalCount];
            ReadbackPool.Resize(totalCount);

            if (PointCloudMaterial != null)
            {
                PointCloudMaterial.SetBuffer(Properties.PointCloud, PointCloudBuffer);
            }
        }