public void Execute(int index) { var position = this.positions[index]; var predictPosition = this.positions[index]; var spheres = collidersGroup.spheres; var boxes = collidersGroup.boxes; var capsules = collidersGroup.capsules; for (var i = 0; i < spheres.Length; i++) { var s = spheres[i]; ConcatInfo concatInfo; if (IntersectUtil.GetClosestSurfacePoint(position, s.collider, out concatInfo)) { EnableCollisionConstraint(index, ref concatInfo, ref s.rigidbody, s.entityId); return; } } for (var i = 0; i < boxes.Length; i++) { var s = boxes[i]; ConcatInfo concatInfo; if (IntersectUtil.GetClosestSurfacePoint(position, s.collider, out concatInfo)) { EnableCollisionConstraint(index, ref concatInfo, ref s.rigidbody, s.entityId); return; } } for (var i = 0; i < capsules.Length; i++) { var s = capsules[i]; ConcatInfo concatInfo; if (IntersectUtil.GetClosestSurfacePoint(position, s.collider, out concatInfo)) { EnableCollisionConstraint(index, ref concatInfo, ref s.rigidbody, s.entityId); return; } } DisableCollisionConstraint(index); }
/// <summary> /// 计算每个质点的质量。 算法为三角面面积乘以密度,再平分到每个顶点 /// </summary> private void BuildMasses() { var indices = _meshModifier.indices; var vertices = _meshModifier.vertices; _masses = new NativeList <float>(this.vertexCount, Allocator.Persistent); _masses.Resize(this.vertexCount, NativeArrayOptions.ClearMemory); for (var i = 0; i < indices.Length / 3; i++) { var offset = i * 3; var i0 = indices[offset]; var i1 = indices[offset + 1]; var i2 = indices[offset + 2]; var v0 = vertices[i0]; var v1 = vertices[i1]; var v2 = vertices[i2]; var area = IntersectUtil.GetArea(v0, v1, v2); var m = area * _setting.density; var m3 = m / 3; _masses[i0] += m3; _masses[i1] += m3; _masses[i2] += m3; } }
public override bool GetClosestSurfacePoint(float3 p, out ConcatInfo concatInfo) { return(IntersectUtil.GetClosestSurfacePoint(p, desc, out concatInfo)); }
public override bool PointInside(float3 p) { return(IntersectUtil.PointInside(p, desc)); }