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); }
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); }
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;*/ }
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); }
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); }
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); }
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); }
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); }