/// <summary>
        ///
        /// </summary>
        /// <param name="rayOrigin"></param>
        /// <param name="rayEnd"></param>
        /// <returns></returns>
        public override int Prepare(ref FPVector rayOrigin, ref FPVector rayEnd)
        {
            FPBBox box = FPBBox.SmallBox;

            box.AddPoint(ref rayOrigin);
            box.AddPoint(ref rayEnd);

            return(this.Prepare(ref box));
        }
示例#2
0
            public void UpdateBoundingBox()
            {
                boundingBox = FPBBox.SmallBox;
                boundingBox.AddPoint(ref owner.points[indices.I0].position);
                boundingBox.AddPoint(ref owner.points[indices.I1].position);
                boundingBox.AddPoint(ref owner.points[indices.I2].position);

                boundingBox.min -= new FPVector(owner.triangleExpansion);
                boundingBox.max += new FPVector(owner.triangleExpansion);
            }
        /// <summary>
        ///
        /// </summary>
        /// <param name="rayOrigin"></param>
        /// <param name="rayDelta"></param>
        /// <returns></returns>
        public override int Prepare(ref FPVector rayOrigin, ref FPVector rayDelta)
        {
            FPBBox box = FPBBox.SmallBox;

            #region RayEnd + Expand Spherical
            FPVector rayEnd;
            FPVector.Normalize(ref rayDelta, out rayEnd);
            rayEnd = rayOrigin + rayDelta + rayEnd * sphericalExpansion;
            #endregion

            box.AddPoint(ref rayOrigin);
            box.AddPoint(ref rayEnd);

            return(this.Prepare(ref box));
        }
示例#4
0
        public virtual void Update(FP timestep)
        {
            active = false;

            foreach (MassPoint point in points)
            {
                if (point.isActive && !point.isStatic)
                {
                    active = true; break;
                }
            }

            if (!active)
            {
                return;
            }

            box    = FPBBox.SmallBox;
            volume = FP.Zero;
            mass   = FP.Zero;

            foreach (MassPoint point in points)
            {
                mass += point.Mass;
                box.AddPoint(point.position);
            }

            box.min -= new FPVector(TriangleExpansion);
            box.max += new FPVector(TriangleExpansion);

            foreach (Triangle t in triangles)
            {
                // Update bounding box and move proxy in dynamic tree.
                t.UpdateBoundingBox();

                FPVector linVel = t.VertexBody1.linearVelocity +
                                  t.VertexBody2.linearVelocity +
                                  t.VertexBody3.linearVelocity;

                linVel *= FP.One / (3 * FP.One);

                dynamicTree.MoveProxy(t.dynamicTreeID, ref t.boundingBox, linVel * timestep);

                FPVector v1 = points[t.indices.I0].position;
                FPVector v2 = points[t.indices.I1].position;
                FPVector v3 = points[t.indices.I2].position;

                volume -= ((v2.y - v1.y) * (v3.z - v1.z) -
                           (v2.z - v1.z) * (v3.y - v1.y)) * (v1.x + v2.x + v3.x);
            }

            volume /= (FP)6;

            AddPressureForces(timestep);
        }