Exemplo n.º 1
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            float4 center = shape.center * transform.scale;

            point = transform.InverseTransformPointUnscaled(point) - center;

            if (shape.is2D != 0)
            {
                point[2] = 0;
            }

            int   direction = (int)shape.size.z;
            float radius    = shape.size.x * math.max(transform.scale[(direction + 1) % 3],
                                                      transform.scale[(direction + 2) % 3]);

            float  height     = math.max(radius, shape.size.y * 0.5f * transform.scale[direction]);
            float4 halfVector = float4.zero;

            halfVector[direction] = height - radius;

            float4 centerLine       = BurstMath.NearestPointOnEdge(-halfVector, halfVector, point, out float mu);
            float4 centerToPoint    = point - centerLine;
            float  distanceToCenter = math.length(centerToPoint);

            float4 normal = centerToPoint / (distanceToCenter + BurstMath.epsilon);

            projectedPoint.point  = transform.TransformPointUnscaled(center + centerLine + normal * (radius + shape.contactOffset));
            projectedPoint.normal = transform.TransformDirection(normal);
        }
Exemplo n.º 2
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            point = transform.InverseTransformPoint(point);

            float4 nearestPoint = BurstMath.NearestPointOnTri(tri, point, out float4 bary);
            float4 normal       = math.normalizesafe(point - nearestPoint);

            // flip the contact normal if it points below ground:
            BurstMath.OneSidedNormal(triNormal, ref normal);

            projectedPoint.point  = transform.TransformPoint(nearestPoint + normal * shape.contactOffset);
            projectedPoint.normal = transform.TransformDirection(normal);
        }
Exemplo n.º 3
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            switch (simplexSize)
            {
            case 1:
            {
                float4 p1 = positions[simplices[simplexStart]];
                projectedPoint.bary  = new float4(1, 0, 0, 0);
                projectedPoint.point = p1;
            }
            break;

            case 2:
            {
                float4 p1 = positions[simplices[simplexStart]];
                float4 p2 = positions[simplices[simplexStart + 1]];
                BurstMath.NearestPointOnEdge(p1, p2, point, out float mu);
                projectedPoint.bary  = new float4(1 - mu, mu, 0, 0);
                projectedPoint.point = p1 * projectedPoint.bary[0] + p2 * projectedPoint.bary[1];
            } break;

            case 3:
                projectedPoint.point = BurstMath.NearestPointOnTri(tri, point, out projectedPoint.bary);
                break;
            }

            projectedPoint.normal = math.normalizesafe(point - projectedPoint.point);

            /*float radius1 = radii[simplices[simplexStart]].x;
             * float radius2 = radii[simplices[simplexStart+1]].x;
             *
             * float invLen2 = 1.0f / math.lengthsq(p1 - p2);
             * float dl = (radius1 - radius2) * invLen2;
             * float sl = math.sqrt(1.0f / invLen2 - math.pow(radius1 - radius2, 2)) * math.sqrt(invLen2);
             * float adj_radii1 = radius1 * sl;
             * float adj_radii2 = radius2 * sl;
             *
             * float trange1 = radius1 * dl;
             * float trange2 = 1 + radius2 * dl;
             *
             * float adj_t = (mu - trange1) / (trange2 - trange1);
             * float radius = adj_radii1 + adj_t * (adj_radii2 - adj_radii1);
             *
             * float4 centerToPoint = point - centerLine;
             * float4 normal = centerToPoint / (math.length(centerToPoint) + BurstMath.epsilon);
             *
             * projectedPoint.point = centerLine + normal * radius;
             * projectedPoint.normal = normal;*/
        }
Exemplo n.º 4
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            point = transform.InverseTransformPointUnscaled(point);

            if (shape.is2D != 0)
            {
                point[2] = 0;
            }

            float4 nearestPoint = BurstMath.NearestPointOnTri(tri, point, out float4 bary);
            float4 normal       = math.normalizesafe(point - nearestPoint);

            projectedPoint.point  = transform.TransformPointUnscaled(nearestPoint + normal * shape.contactOffset);
            projectedPoint.normal = transform.TransformDirection(normal);
        }
Exemplo n.º 5
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            point = transform.InverseTransformPoint(point);

            if (shape.is2D != 0)
            {
                point[2] = 0;
            }

            var    header = distanceFieldHeaders[shape.dataIndex];
            float4 sample = DFTraverse(point, 0, in header, in dfNodes);
            float4 normal = new float4(math.normalize(sample.xyz), 0);

            projectedPoint.point  = transform.TransformPoint(point - normal * (sample[3] - shape.contactOffset));
            projectedPoint.normal = transform.TransformDirection(normal);
        }
Exemplo n.º 6
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            float4 center = shape.center * transform.scale;
            float4 size   = shape.size * transform.scale * 0.5f;

            // clamp the point to the surface of the box:
            point = transform.InverseTransformPointUnscaled(point) - center;

            if (shape.is2D != 0)
            {
                point[2] = 0;
            }

            // get minimum distance for each axis:
            float4 distances = size - math.abs(point);

            if (distances.x >= 0 && distances.y >= 0 && distances.z >= 0)
            {
                // find minimum distance in all three axes and the axis index:
                float min  = float.MaxValue;
                int   axis = 0;

                for (int i = 0; i < 3; ++i)
                {
                    if (distances[i] < min)
                    {
                        min  = distances[i];
                        axis = i;
                    }
                }

                projectedPoint.normal = float4.zero;
                projectedPoint.point  = point;

                projectedPoint.normal[axis] = point[axis] > 0 ? 1 : -1;
                projectedPoint.point[axis]  = size[axis] * projectedPoint.normal[axis];
            }
            else
            {
                projectedPoint.point  = math.clamp(point, -size, size);
                projectedPoint.normal = math.normalizesafe(point - projectedPoint.point);
            }

            projectedPoint.point  = transform.TransformPointUnscaled(projectedPoint.point + center + projectedPoint.normal * shape.contactOffset);
            projectedPoint.normal = transform.TransformDirection(projectedPoint.normal);
        }
Exemplo n.º 7
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            point = transform.InverseTransformPointUnscaled(point);

            if (shape.is2D != 0)
            {
                point[2] = 0;
            }

            Edge   t  = edges[header.firstEdge + dataOffset];
            float4 v1 = (new float4(vertices[header.firstVertex + t.i1], 0) + shape.center) * transform.scale;
            float4 v2 = (new float4(vertices[header.firstVertex + t.i2], 0) + shape.center) * transform.scale;

            float4 nearestPoint = BurstMath.NearestPointOnEdge(v1, v2, point, out float mu);
            float4 normal       = math.normalizesafe(point - nearestPoint);

            projectedPoint.normal = transform.TransformDirection(normal);
            projectedPoint.point  = transform.TransformPointUnscaled(nearestPoint + normal * shape.contactOffset);
        }
Exemplo n.º 8
0
        public void Evaluate(float4 point, ref BurstLocalOptimization.SurfacePoint projectedPoint)
        {
            float4 center = shape.center * transform.scale;

            point = transform.InverseTransformPointUnscaled(point) - center;

            if (shape.is2D != 0)
            {
                point[2] = 0;
            }

            float radius           = shape.size.x * math.cmax(transform.scale.xyz);
            float distanceToCenter = math.length(point);

            float4 normal = point / (distanceToCenter + BurstMath.epsilon);

            projectedPoint.point  = transform.TransformPointUnscaled(center + normal * (radius + shape.contactOffset));
            projectedPoint.normal = transform.TransformDirection(normal);
        }