コード例 #1
0
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);


            btBroadphaseInterface broadphase = new btDbvtBroadphase();

            btDefaultCollisionConfiguration collisionConfiguration = new btDefaultCollisionConfiguration();
            btCollisionDispatcher           dispatcher             = new btCollisionDispatcher(collisionConfiguration);

            btSequentialImpulseConstraintSolver solver = new btSequentialImpulseConstraintSolver();

            btDiscreteDynamicsWorld dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);

            dynamicsWorld.setGravity(new btVector3(0, -10, 0));

            btCollisionShape groundShape = new btStaticPlaneShape(new btVector3(0, 1, 0), 1);

            btDefaultMotionState groundMotionState = new btDefaultMotionState(new btTransform(new btQuaternion(0, 0, 0, 1), new btVector3(0, -1, 0)));

            btRigidBody.btRigidBodyConstructionInfo groundRigidBodyCI = new btRigidBody.btRigidBodyConstructionInfo(0, groundMotionState, groundShape, new btVector3(0, 0, 0));
            btRigidBody groundRigidBody = new btRigidBody(groundRigidBodyCI);

            dynamicsWorld.addRigidBody(groundRigidBody);

            btDefaultMotionState fallMotionState = new btDefaultMotionState(new btTransform(new btQuaternion(0, 0, 0, 1), new btVector3(0, 50, 0)));

            btVector3 fallInertia = new btVector3(0, 0, 0);

            btCollisionShape fallShape = new btSphereShape(1);

            fallShape.calculateLocalInertia(1, fallInertia);

            btRigidBody.btRigidBodyConstructionInfo fallRigidBodyCI = new btRigidBody.btRigidBodyConstructionInfo(1, fallMotionState, fallShape, fallInertia);
            btRigidBody fallRigidBody = new btRigidBody(fallRigidBodyCI);

            dynamicsWorld.addRigidBody(fallRigidBody);

            for (int i = 0; i < 300; i++)
            {
                dynamicsWorld.stepSimulation(1 / 60.0f, 10);

                btTransform trans = new btTransform();
                fallRigidBody.getMotionState().getWorldTransform(trans);

                Console.WriteLine("sphere height: " + trans.getOrigin().getY());
            }
        }
コード例 #2
0
        /// <summary>
        /// This creates the Avatar's physical Surrogate at the position supplied
        /// </summary>
        /// <param name="npositionX"></param>
        /// <param name="npositionY"></param>
        /// <param name="npositionZ"></param>

        // WARNING: This MUST NOT be called outside of ProcessTaints, else we can have unsynchronized access
        // to ODE internals. ProcessTaints is called from within thread-locked Simulate(), so it is the only
        // place that is safe to call this routine AvatarGeomAndBodyCreation.
        private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ)
        {
            if (CAPSULE_LENGTH <= 0)
            {
                m_log.Warn("[PHYSICS]: The capsule size you specified in aurora.ini is invalid!  Setting it to the smallest possible size!");
                CAPSULE_LENGTH = 0.01f;
            }

            if (CAPSULE_RADIUS <= 0)
            {
                m_log.Warn("[PHYSICS]: The capsule size you specified in aurora.ini is invalid!  Setting it to the smallest possible size!");
                CAPSULE_RADIUS = 0.01f;
            }

            Shell = new btCapsuleShape(CAPSULE_RADIUS, CAPSULE_LENGTH);

            if (m_bodyPosition == null)
            {
                m_bodyPosition = new btVector3(npositionX, npositionY, npositionZ);
            }

            m_bodyPosition.setValue(npositionX, npositionY, npositionZ);

            if (m_bodyOrientation == null)
            {
                m_bodyOrientation = new btQuaternion(m_CapsuleOrientationAxis, (Utils.DEG_TO_RAD * 90));
            }

            if (m_bodyTransform == null)
            {
                m_bodyTransform = new btTransform(m_bodyOrientation, m_bodyPosition);
            }
            else
            {
                m_bodyTransform.Dispose();
                m_bodyTransform = new btTransform(m_bodyOrientation, m_bodyPosition);
            }

            if (m_bodyMotionState == null)
            {
                m_bodyMotionState = new btDefaultMotionState(m_bodyTransform);
            }
            else
            {
                m_bodyMotionState.setWorldTransform(m_bodyTransform);
            }

            m_mass = Mass;

            Body = new btRigidBody(m_mass, m_bodyMotionState, Shell);
            // this is used for self identification. User localID instead of body handle
            Body.setUserPointer(new IntPtr((int)m_localID));

            if (ClosestCastResult != null)
            {
                ClosestCastResult.Dispose();
            }
            ClosestCastResult = new ClosestNotMeRayResultCallback(Body);

            m_parent_scene.AddRigidBody(Body);
            Body.setActivationState(4);
            if (m_aMotor != null)
            {
                if (m_aMotor.Handle != IntPtr.Zero)
                {
                    m_parent_scene.getBulletWorld().removeConstraint(m_aMotor);
                    m_aMotor.Dispose();
                }
                m_aMotor = null;
            }

            m_aMotor = new btGeneric6DofConstraint(Body, m_parent_scene.TerrainBody,
                                                   m_parent_scene.TransZero,
                                                   m_parent_scene.TransZero, false);
            m_aMotor.setAngularLowerLimit(m_parent_scene.VectorZero);
            m_aMotor.setAngularUpperLimit(m_parent_scene.VectorZero);
        }
コード例 #3
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(btDefaultMotionState obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }