예제 #1
0
        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;
            }
        }
예제 #3
0
 public override bool GetClosestSurfacePoint(float3 p, out ConcatInfo concatInfo)
 {
     return(IntersectUtil.GetClosestSurfacePoint(p, desc, out concatInfo));
 }
예제 #4
0
 public override bool PointInside(float3 p)
 {
     return(IntersectUtil.PointInside(p, desc));
 }