示例#1
0
        /// <summary>
        /// Adds the force supplied to the Target Velocity
        /// The PID controller takes this target velocity and tries to make it a reality
        /// </summary>
        /// <param name="force"></param>
        public override void AddForce(Vector3 force, bool pushforce)
        {
            if (force.IsFinite())
            {
                if (pushforce)
                {
                    m_pidControllerActive = false;
                    force        *= 100f;
                    m_taintForce += force;
                    _parent_scene.AddPhysicsActorTaint(this);

                    // If uncommented, things get pushed off world
                    //
                    // m_log.Debug("Push!");
                    // m_taintTargetVelocity.X += force.X;
                    // m_taintTargetVelocity.Y += force.Y;
                    // m_taintTargetVelocity.Z += force.Z;
                }
                else
                {
                    m_pidControllerActive  = true;
                    m_taintTargetVelocity += force;
                }
            }
            else
            {
                m_log.WarnFormat("[ODE CHARACTER]: Got a NaN force applied to {0}", Name);
            }
            //m_lastUpdateSent = false;
        }
示例#2
0
        public OdeCharacter(
            String avName, OdeScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p,
            float capsule_radius, float tensor, float density,
            float walk_divisor, float rundivisor)
        {
            m_uuid = UUID.Random();

            if (pos.IsFinite())
            {
                if (pos.Z > 9999999f)
                {
                    pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
                }
                if (pos.Z < -90000f)
                {
                    pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
                }

                _position       = pos;
                m_taintPosition = pos;
            }
            else
            {
                _position
                    = new Vector3(
                          (float)_parent_scene.WorldExtents.X * 0.5f,
                          (float)_parent_scene.WorldExtents.Y * 0.5f,
                          parent_scene.GetTerrainHeightAtXY(128f, 128f) + 10f);
                m_taintPosition = _position;

                m_log.WarnFormat("[ODE CHARACTER]: Got NaN Position on Character Create for {0}", avName);
            }

            _parent_scene = parent_scene;

            PID_D          = pid_d;
            PID_P          = pid_p;
            CAPSULE_RADIUS = capsule_radius;
            m_tensor       = tensor;
            m_density      = density;
//            heightFudgeFactor = height_fudge_factor;
            walkDivisor = walk_divisor;
            runDivisor  = rundivisor;

            // m_StandUpRotation =
            //     new d.Matrix3(0.5f, 0.7071068f, 0.5f, -0.7071068f, 0f, 0.7071068f, 0.5f, -0.7071068f,
            //                   0.5f);

            // We can set taint and actual to be the same here, since the entire character will be set up when the
            // m_tainted_isPhysical is processed.
            SetTaintedCapsuleLength(size);
            CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;

            m_isPhysical         = false; // current status: no ODE information exists
            m_tainted_isPhysical = true;  // new tainted status: need to create ODE information

            _parent_scene.AddPhysicsActorTaint(this);

            Name = avName;
        }
示例#3
0
        public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos, CollisionLocker dode, PhysicsVector size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor)
        {
            // ode = dode;
            _velocity        = new PhysicsVector();
            _target_velocity = new PhysicsVector();


            if (PhysicsVector.isFinite(pos))
            {
                if (pos.Z > 9999999)
                {
                    pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
                }
                if (pos.Z < -90000)
                {
                    pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
                }
                _position         = pos;
                m_taintPosition.X = pos.X;
                m_taintPosition.Y = pos.Y;
                m_taintPosition.Z = pos.Z;
            }
            else
            {
                _position         = new PhysicsVector(128, 128, parent_scene.GetTerrainHeightAtXY(128, 128) + 10);
                m_taintPosition.X = _position.X;
                m_taintPosition.Y = _position.Y;
                m_taintPosition.Z = _position.Z;
                m_log.Warn("[PHYSICS]: Got NaN Position on Character Create");
            }


            _acceleration = new PhysicsVector();
            _parent_scene = parent_scene;

            PID_D             = pid_d;
            PID_P             = pid_p;
            CAPSULE_RADIUS    = capsule_radius;
            m_tensor          = tensor;
            m_density         = density;
            heightFudgeFactor = height_fudge_factor;
            walkDivisor       = walk_divisor;
            runDivisor        = rundivisor;


            // m_StandUpRotation =
            //     new d.Matrix3(0.5f, 0.7071068f, 0.5f, -0.7071068f, 0f, 0.7071068f, 0.5f, -0.7071068f,
            //                   0.5f);

            for (int i = 0; i < 11; i++)
            {
                m_colliderarr[i] = false;
            }
            CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
            //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
            m_tainted_CAPSULE_LENGTH = CAPSULE_LENGTH;

            m_isPhysical         = false; // current status: no ODE information exists
            m_tainted_isPhysical = true;  // new tainted status: need to create ODE information


            _parent_scene.AddPhysicsActorTaint(this);

            m_name = avName;
        }
示例#4
0
 /// <summary>
 /// Cleanup the things we use in the scene.
 /// </summary>
 public void Destroy()
 {
     m_tainted_isPhysical = false;
     _parent_scene.AddPhysicsActorTaint(this);
 }
示例#5
0
        public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, CollisionLocker dode, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor)
        {
            // ode = dode;
            _velocity = new Vector3();
            _target_velocity = new Vector3();
            _position = pos;

            m_taintPosition.X = pos.X;
            m_taintPosition.Y = pos.Y;
            m_taintPosition.Z = pos.Z;

            _acceleration = new Vector3();
            _parent_scene = parent_scene;

            PID_D = pid_d;
            PID_P = pid_p;
            CAPSULE_RADIUS = capsule_radius;
            m_tensor = tensor;
            m_density = density;
            heightFudgeFactor = height_fudge_factor;
            walkDivisor = walk_divisor;
            runDivisor = rundivisor;

            // m_StandUpRotation =
            //     new d.Matrix3(0.5f, 0.7071068f, 0.5f, -0.7071068f, 0f, 0.7071068f, 0.5f, -0.7071068f,
            //                   0.5f);

            for (int i = 0; i < 11; i++)
            {
                m_colliderarr[i] = false;
            }
            CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
            //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
            m_tainted_CAPSULE_LENGTH = CAPSULE_LENGTH;

            m_isPhysical = false; // current status: no ODE information exists
            m_tainted_isPhysical = true; // new tainted status: need to create ODE information

            _parent_scene.AddPhysicsActorTaint(this);

            m_name = avName;
        }
示例#6
0
        public OdePrim(String primName, OdeScene parent_scene, Vector3 pos, Vector3 size,
            Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode)
        {
            _target_velocity = new Vector3(0, 0, 0);
            //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned);
            ode = dode;
            _velocity = new Vector3();
            _position = pos;
            m_taintposition = pos;
            PID_D = parent_scene.bodyPIDD;
            PID_G = parent_scene.bodyPIDG;
            m_density = parent_scene.geomDefaultDensity;
            m_tensor = parent_scene.bodyMotorJointMaxforceTensor;
            body_autodisable_frames = parent_scene.bodyFramesAutoDisable;

            prim_geom = IntPtr.Zero;
            prev_geom = IntPtr.Zero;

            if (size.X <= 0) size.X = 0.01f;
            if (size.Y <= 0) size.Y = 0.01f;
            if (size.Z <= 0) size.Z = 0.01f;

            _size = size;
            m_taintsize = _size;
            _acceleration = new Vector3();
            m_rotationalVelocity = Vector3.Zero;
            _orientation = rotation;
            m_taintrot = _orientation;
            _mesh = mesh;
            _pbs = pbs;

            _parent_scene = parent_scene;
            m_targetSpace = (IntPtr)0;

            if (pos.Z < 0)
                m_isphysical = false;
            else
            {
                m_isphysical = pisPhysical;
                // If we're physical, we need to be in the master space for now.
                // linksets *should* be in a space together..  but are not currently
                if (m_isphysical)
                    m_targetSpace = _parent_scene.space;
            }
            m_primName = primName;
            m_taintadd = true;
            _parent_scene.AddPhysicsActorTaint(this);
            //  don't do .add() here; old geoms get recycled with the same hash
        }