public void setGravity(btVector3 v) { if (m_disposed) throw new ObjectDisposedException(ToString()); BulletAPI_BtDynamicsWorld_setGravity(m_handle,v.Handle); }
public void applyImpulse(btVector3 force, btVector3 rel_pos) { if (m_disposed) throw new ObjectDisposedException(ToString()); BulletAPI_BtRigidBody_applyImpulse(m_handle, force.Handle, rel_pos.Handle); }
public bool isInside(btVector3 pt, float tolerance) { if (m_disposed) throw new ObjectDisposedException(ToString()); return BulletAPI_BtBoxShape_isInside(m_handle, pt.Handle, tolerance); }
public void setAngularLowerLimit(btVector3 linearLower) { if (m_disposed) throw new ObjectDisposedException(ToString()); BulletAPI_BtGeneric6DofConstraint_setAngularLowerLimit(m_handle, linearLower.Handle); }
public int findOrAddVertex(btVector3 vertex, bool removeDuplicateVertices) { if (m_disposed) throw new ObjectDisposedException(ToString()); return BulletAPI_BtTriangleMesh_findOrAddVertex(m_handle, vertex.Handle, removeDuplicateVertices); }
public void applyCentralForce(btVector3 force) { if (m_disposed) throw new ObjectDisposedException(ToString()); BulletAPI_BtRigidBody_applyCentralForce(m_handle, force.Handle); }
public void rayTest(btVector3 rayFromWorld, btVector3 rayToWorld, btRayResultCallback resultCallback) { if (m_disposed) throw new ObjectDisposedException(ToString()); BulletAPI_btCollisionWorld_rayTest(m_handle, rayFromWorld.Handle, rayToWorld.Handle, resultCallback.Handle); }
public void addTriangle( btVector3 vertex0, btVector3 vertex1, btVector3 vertex2, bool removeDuplicates) { if (m_disposed) throw new ObjectDisposedException(ToString()); BulletAPI_BtTriangleMesh_addTriangle(m_handle, vertex0.Handle, vertex1.Handle, vertex2.Handle, removeDuplicates); }
public btRigidBody(float mass, btMotionState motionState, btCollisionShape collisionShape, btVector3 localInertia) { m_constructionInfo = new btRigidBodyConstructionInfo(); m_constructionInfo.m_collisionShape = collisionShape; m_constructionInfo.m_localInertia = localInertia; m_constructionInfo.m_motionState = motionState; m_constructionInfo.m_startWorldTransform = btTransform.getIdentity(); m_constructionInfo.SetGenericDefaultValues(); m_constructionInfo.m_mass = mass; m_constructionInfo.commit(); m_handle = BulletAPI_CreateBtRigidBody(m_constructionInfo.Handle); }
public override void Dispose() { lock (BulletLock) { disposeAllBodies(); m_world.Dispose(); m_broadphase.Dispose(); ((btDefaultCollisionConfiguration)m_collisionConfiguration).Dispose(); ((btSequentialImpulseConstraintSolver)m_solver).Dispose(); worldAabbMax.Dispose(); worldAabbMin.Dispose(); VectorZero.Dispose(); QuatIdentity.Dispose(); m_gravity.Dispose(); VectorZero = null; QuatIdentity = null; } }
private void changeAddAngularForce(float timestep) { if (!m_isSelected) { lock (m_angularforcelist) { //m_log.Info("[PHYSICS]: dequeing forcelist"); if (IsPhysical) { Vector3 iforce = Vector3.Zero; for (int i = 0; i < m_angularforcelist.Count; i++) { iforce = iforce + m_angularforcelist[i]; } if (Body != null && Body.Handle != IntPtr.Zero) { if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) tempAddForce.Dispose(); enableBodySoft(); tempAddForce = new btVector3(iforce.X, iforce.Y, iforce.Z); Body.applyTorqueImpulse(tempAddForce); } } m_angularforcelist.Clear(); } m_collisionscore = 0; m_interpenetrationcount = 0; } m_taintaddangularforce = false; }
public override void SetTerrain(float[] heightMap, double[,] normalHeightMap) { if (m_terrainShape != null) DeleteTerrain(); float hfmax = -9000; float hfmin = 90000; for (int i = 0; i <heightMap.Length;i++) { if (Single.IsNaN(heightMap[i]) || Single.IsInfinity(heightMap[i])) { heightMap[i] = 0f; } hfmin = (heightMap[i] < hfmin) ? heightMap[i] : hfmin; hfmax = (heightMap[i] > hfmax) ? heightMap[i] : hfmax; } // store this for later reference. // Note, we're storing it after we check it for anomolies above _origheightmap = heightMap; hfmin = 0; hfmax = 256; m_terrainShape = new btHeightfieldTerrainShape((int)Constants.RegionSize, (int)Constants.RegionSize, heightMap, 1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z, (int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false); float AabbCenterX = Constants.RegionSize/2f; float AabbCenterY = Constants.RegionSize/2f; float AabbCenterZ = 0; float temphfmin, temphfmax; temphfmin = hfmin; temphfmax = hfmax; if (temphfmin < 0) { temphfmax = 0 - temphfmin; temphfmin = 0 - temphfmin; } else if (temphfmin > 0) { temphfmax = temphfmax + (0 - temphfmin); //temphfmin = temphfmin + (0 - temphfmin); } AabbCenterZ = temphfmax/2f; if (m_terrainPosition == null) { m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); } else { try { m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ); } catch (ObjectDisposedException) { m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); } } if (m_terrainMotionState != null) { m_terrainMotionState.Dispose(); m_terrainMotionState = null; } m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition); m_terrainMotionState = new btDefaultMotionState(m_terrainTransform); TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape); TerrainBody.setUserPointer((IntPtr)0); m_world.addRigidBody(TerrainBody); }
public override void DeleteTerrain() { if (TerrainBody != null) { m_world.removeRigidBody(TerrainBody); } if (m_terrainShape != null) { m_terrainShape.Dispose(); m_terrainShape = null; } if (m_terrainMotionState != null) { m_terrainMotionState.Dispose(); m_terrainMotionState = null; } if (m_terrainTransform != null) { m_terrainTransform.Dispose(); m_terrainTransform = null; } if (m_terrainPosition != null) { m_terrainPosition.Dispose(); m_terrainPosition = null; } }
/// <summary> /// Called from Simulate /// This is the avatar's movement control + PID Controller /// </summary> /// <param name="timeStep"></param> public void Move(float timeStep) { // no lock; for now it's only called from within Simulate() // If the PID Controller isn't active then we set our force // calculating base velocity to the current position if (Body == null) return; tempTrans1.Dispose(); tempTrans1 = Body.getInterpolationWorldTransform(); tempVector1.Dispose(); tempVector1 = tempTrans1.getOrigin(); tempVector2.Dispose(); tempVector2 = Body.getInterpolationLinearVelocity(); if (m_pidControllerActive == false) { m_zeroPosition.X = tempVector1.getX(); m_zeroPosition.Y = tempVector1.getY(); m_zeroPosition.Z = tempVector1.getZ(); } //PidStatus = true; Vector3 vec = Vector3.Zero; Vector3 vel = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); float movementdivisor = 1f; if (!m_alwaysRun) { movementdivisor = walkDivisor; } else { movementdivisor = runDivisor; } // if velocity is zero, use position control; otherwise, velocity control if (m_target_velocity.X == 0.0f && m_target_velocity.Y == 0.0f && m_target_velocity.Z == 0.0f && m_iscolliding) { // keep track of where we stopped. No more slippin' & slidin' if (!m_zeroFlag) { m_zeroFlag = true; m_zeroPosition.X = tempVector1.getX(); m_zeroPosition.Y = tempVector1.getY(); m_zeroPosition.Z = tempVector1.getZ(); } if (m_pidControllerActive) { // We only want to deactivate the PID Controller if we think we want to have our surrogate // react to the physics scene by moving it's position. // Avatar to Avatar collisions // Prim to avatar collisions Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); vec.X = (m_target_velocity.X - vel.X) * (PID_D) + (m_zeroPosition.X - pos.X) * (PID_P * 2); vec.Y = (m_target_velocity.Y - vel.Y) * (PID_D) + (m_zeroPosition.Y - pos.Y) * (PID_P * 2); if (m_flying) { vec.Z = (m_target_velocity.Z - vel.Z) * (PID_D) + (m_zeroPosition.Z - pos.Z) * PID_P; } } //PidStatus = true; } else { m_pidControllerActive = true; m_zeroFlag = false; if (m_iscolliding && !m_flying) { // We're standing on something vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D); vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D); } else if (m_iscolliding && m_flying) { // We're flying and colliding with something vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 16); vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 16); } else if (!m_iscolliding && m_flying) { // we're in mid air suspended vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 6); vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 6); // We don't want linear velocity to cause our avatar to bounce, so we check target Z and actual velocity X, Y // rebound preventing if (m_target_velocity.Z < 0.025f && m_velocity.X < 0.25f && m_velocity.Y < 0.25f) m_zeroFlag = true; } if (m_iscolliding && !m_flying && m_target_velocity.Z > 0.0f) { // We're colliding with something and we're not flying but we're moving // This means we're walking or running. Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); vec.Z = (m_target_velocity.Z - vel.Z) * PID_D + (m_zeroPosition.Z - pos.Z) * PID_P; if (m_target_velocity.X > 0) { vec.X = ((m_target_velocity.X - vel.X) / 1.2f) * PID_D; } if (m_target_velocity.Y > 0) { vec.Y = ((m_target_velocity.Y - vel.Y) / 1.2f) * PID_D; } } else if (!m_iscolliding && !m_flying) { // we're not colliding and we're not flying so that means we're falling! // m_iscolliding includes collisions with the ground. // d.Vector3 pos = d.BodyGetPosition(Body); if (m_target_velocity.X > 0) { vec.X = ((m_target_velocity.X - vel.X) / 1.2f) * PID_D; } if (m_target_velocity.Y > 0) { vec.Y = ((m_target_velocity.Y - vel.Y) / 1.2f) * PID_D; } } if (m_flying) { vec.Z = (m_target_velocity.Z - vel.Z) * (PID_D); } } if (m_flying) { // Slight PID correction vec.Z += (((-1 * m_parent_scene.gravityz) * m_mass) * 0.06f); //auto fly height. Kitto Flora //d.Vector3 pos = d.BodyGetPosition(Body); float target_altitude = m_parent_scene.GetTerrainHeightAtXY(m_position.X, m_position.Y) + m_parent_scene.minimumGroundFlightOffset; if (m_position.Z < target_altitude) { vec.Z += (target_altitude - m_position.Z) * PID_P * 5.0f; } } if (Body != null && (((m_target_velocity.X > 0.2f || m_target_velocity.X < -0.2f) || (m_target_velocity.Y > 0.2f || m_target_velocity.Y < -0.2f)))) { Body.setFriction(0.001f); //m_log.DebugFormat("[PHYSICS]: Avatar force applied: {0}, Target:{1}", vec.ToString(), m_target_velocity.ToString()); } if (Body != null) { int activationstate = Body.getActivationState(); if (activationstate == 0) { Body.forceActivationState(1); } } doImpulse(vec, true); }
public void SetBody(float mass) { if (!IsPhysical || childrenPrim.Count == 0) { if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) tempMotionState1.Dispose(); if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) tempTransform2.Dispose(); if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) tempOrientation2.Dispose(); if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) tempPosition2.Dispose(); tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); tempPosition2 = new btVector3(_position.X, _position.Y, _position.Z); tempTransform2 = new btTransform(tempOrientation2, tempPosition2); tempMotionState1 = new btDefaultMotionState(tempTransform2, _parent_scene.TransZero); if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) tempInertia1.Dispose(); tempInertia1 = new btVector3(0, 0, 0); prim_geom.calculateLocalInertia(mass, tempInertia1); if (mass != 0) _parent_scene.addActivePrim(this); else _parent_scene.remActivePrim(this); // Body = new btRigidBody(mass, tempMotionState1, prim_geom); //else Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); if (prim_geom is btGImpactMeshShape) { ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); ((btGImpactMeshShape)prim_geom).updateBound(); } //Body.setCollisionFlags(Body.getCollisionFlags() | (int)ContactFlags.CF_CUSTOM_MATERIAL_CALLBACK); //Body.setUserPointer((IntPtr) (int)m_localID); _parent_scene.AddPrimToScene(this); } else { // bool hasTrimesh = false; lock (childrenPrim) { foreach (BulletDotNETPrim chld in childrenPrim) { if (chld == null) continue; // if (chld.NeedsMeshing()) // hasTrimesh = true; } } //if (hasTrimesh) //{ ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); // createmesh returns null when it doesn't mesh. /* if (_mesh is Mesh) { } else { m_log.Warn("[PHYSICS]: Can't link a OpenSim.Region.Physics.Meshing.Mesh object"); return; } */ foreach (BulletDotNETPrim chld in childrenPrim) { if (chld == null) continue; Vector3 offset = chld.Position - Position; Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z); pos *= Quaternion.Inverse(Orientation); //pos *= Orientation; offset = pos; chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation); _mesh.Append(chld._mesh); } setMesh(_parent_scene, _mesh); //} if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) tempMotionState1.Dispose(); if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) tempTransform2.Dispose(); if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) tempOrientation2.Dispose(); if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) tempPosition2.Dispose(); tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); tempPosition2 = new btVector3(_position.X, _position.Y, _position.Z); tempTransform2 = new btTransform(tempOrientation2, tempPosition2); tempMotionState1 = new btDefaultMotionState(tempTransform2, _parent_scene.TransZero); if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) tempInertia1.Dispose(); tempInertia1 = new btVector3(0, 0, 0); prim_geom.calculateLocalInertia(mass, tempInertia1); if (mass != 0) _parent_scene.addActivePrim(this); else _parent_scene.remActivePrim(this); // Body = new btRigidBody(mass, tempMotionState1, prim_geom); //else Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); if (prim_geom is btGImpactMeshShape) { ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); ((btGImpactMeshShape)prim_geom).updateBound(); } _parent_scene.AddPrimToScene(this); } if (IsPhysical) changeAngularLock(0); }
public BulletDotNETScene(string sceneIdentifier) { BulletLock = new object(); // m_sceneIdentifier = sceneIdentifier; VectorZero = new btVector3(0, 0, 0); QuatIdentity = new btQuaternion(0, 0, 0, 1); TransZero = new btTransform(QuatIdentity, VectorZero); m_gravity = new btVector3(0, 0, gravityz); }
/// <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 opensim.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 opensim.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); }
public btBoxShape(btVector3 boxHalfExtents) : base() { m_handle = BulletAPI_CreateBtBoxShape(boxHalfExtents.Handle); }
public BulletDotNETPrim(String primName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) { tempPosition1 = new btVector3(0, 0, 0); tempPosition2 = new btVector3(0, 0, 0); tempPosition3 = new btVector3(0, 0, 0); tempSize1 = new btVector3(0, 0, 0); tempSize2 = new btVector3(0, 0, 0); tempLinearVelocity1 = new btVector3(0, 0, 0); tempLinearVelocity2 = new btVector3(0, 0, 0); tempAngularVelocity1 = new btVector3(0, 0, 0); tempAngularVelocity2 = new btVector3(0, 0, 0); tempInertia1 = new btVector3(0, 0, 0); tempInertia2 = new btVector3(0, 0, 0); tempOrientation1 = new btQuaternion(0, 0, 0, 1); tempOrientation2 = new btQuaternion(0, 0, 0, 1); _parent_scene = parent_scene; tempTransform1 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); tempTransform2 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; tempTransform3 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; tempTransform4 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; tempMotionState1 = new btDefaultMotionState(_parent_scene.TransZero); tempMotionState2 = new btDefaultMotionState(_parent_scene.TransZero); tempMotionState3 = new btDefaultMotionState(_parent_scene.TransZero); AxisLockLinearLow = new btVector3(-1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize); int regionsize = (int)Constants.RegionSize; if (regionsize == 256) regionsize = 512; AxisLockLinearHigh = new btVector3((int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionSize); _target_velocity = Vector3.Zero; _velocity = Vector3.Zero; _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 = null; Body = null; 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 = Vector3.Zero; m_rotationalVelocity = Vector3.Zero; _orientation = rotation; m_taintrot = _orientation; _mesh = mesh; _pbs = pbs; _parent_scene = parent_scene; 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 } m_primName = primName; m_taintadd = true; _parent_scene.AddPhysicsActorTaint(this); }
internal void Dispose() { //TODO: DisableAxisMotor(); DisposeOfBody(); SetCollisionShape(null); if (tempMotionState3 != null && tempMotionState3.Handle != IntPtr.Zero) { tempMotionState3.Dispose(); tempMotionState3 = null; } if (tempMotionState2 != null && tempMotionState2.Handle != IntPtr.Zero) { tempMotionState2.Dispose(); tempMotionState2 = null; } if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) { tempMotionState1.Dispose(); tempMotionState1 = null; } if (tempTransform4 != null && tempTransform4.Handle != IntPtr.Zero) { tempTransform4.Dispose(); tempTransform4 = null; } if (tempTransform3 != null && tempTransform3.Handle != IntPtr.Zero) { tempTransform3.Dispose(); tempTransform3 = null; } if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) { tempTransform2.Dispose(); tempTransform2 = null; } if (tempTransform1 != null && tempTransform1.Handle != IntPtr.Zero) { tempTransform1.Dispose(); tempTransform1 = null; } if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) { tempOrientation2.Dispose(); tempOrientation2 = null; } if (tempOrientation1 != null && tempOrientation1.Handle != IntPtr.Zero) { tempOrientation1.Dispose(); tempOrientation1 = null; } if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) { tempInertia1.Dispose(); tempInertia1 = null; } if (tempInertia2 != null && tempInertia2.Handle != IntPtr.Zero) { tempInertia2.Dispose(); tempInertia1 = null; } if (tempAngularVelocity2 != null && tempAngularVelocity2.Handle != IntPtr.Zero) { tempAngularVelocity2.Dispose(); tempAngularVelocity2 = null; } if (tempAngularVelocity1 != null && tempAngularVelocity1.Handle != IntPtr.Zero) { tempAngularVelocity1.Dispose(); tempAngularVelocity1 = null; } if (tempLinearVelocity2 != null && tempLinearVelocity2.Handle != IntPtr.Zero) { tempLinearVelocity2.Dispose(); tempLinearVelocity2 = null; } if (tempLinearVelocity1 != null && tempLinearVelocity1.Handle != IntPtr.Zero) { tempLinearVelocity1.Dispose(); tempLinearVelocity1 = null; } if (tempSize2 != null && tempSize2.Handle != IntPtr.Zero) { tempSize2.Dispose(); tempSize2 = null; } if (tempSize1 != null && tempSize1.Handle != IntPtr.Zero) { tempSize1.Dispose(); tempSize1 = null; } if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) { tempPosition3.Dispose(); tempPosition3 = null; } if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) { tempPosition2.Dispose(); tempPosition2 = null; } if (tempPosition1 != null && tempPosition1.Handle != IntPtr.Zero) { tempPosition1.Dispose(); tempPosition1 = null; } if (AxisLockLinearLow != null && AxisLockLinearLow.Handle != IntPtr.Zero) { AxisLockLinearLow.Dispose(); AxisLockLinearLow = null; } if (AxisLockLinearHigh != null && AxisLockLinearHigh.Handle != IntPtr.Zero) { AxisLockLinearHigh.Dispose(); AxisLockLinearHigh = null; } }
internal void EnableAxisMotor(Vector3 axislock) { if (m_aMotor != null) DisableAxisMotor(); if (Body == null) return; if (Body.Handle == IntPtr.Zero) return; if (AxisLockAngleHigh != null && AxisLockAngleHigh.Handle != IntPtr.Zero) AxisLockAngleHigh.Dispose(); m_aMotor = new btGeneric6DofConstraint(Body, _parent_scene.TerrainBody, _parent_scene.TransZero, _parent_scene.TransZero, false); float endNoLock = (360 * Utils.DEG_TO_RAD); AxisLockAngleHigh = new btVector3((axislock.X == 0) ? 0 : endNoLock, (axislock.Y == 0) ? 0 : endNoLock, (axislock.Z == 0) ? 0 : endNoLock); m_aMotor.setAngularLowerLimit(_parent_scene.VectorZero); m_aMotor.setAngularUpperLimit(AxisLockAngleHigh); m_aMotor.setLinearLowerLimit(AxisLockLinearLow); m_aMotor.setLinearUpperLimit(AxisLockLinearHigh); _parent_scene.getBulletWorld().addConstraint((btTypedConstraint)m_aMotor); //m_aMotor. }
public void UpdatePositionAndVelocity() { if (!m_isSelected) { if (_parent == null) { Vector3 pv = Vector3.Zero; bool lastZeroFlag = _zeroFlag; if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) tempPosition3.Dispose(); if (tempTransform3 != null && tempTransform3.Handle != IntPtr.Zero) tempTransform3.Dispose(); if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) tempOrientation2.Dispose(); if (tempAngularVelocity1 != null && tempAngularVelocity1.Handle != IntPtr.Zero) tempAngularVelocity1.Dispose(); if (tempLinearVelocity1 != null && tempLinearVelocity1.Handle != IntPtr.Zero) tempLinearVelocity1.Dispose(); tempTransform3 = Body.getInterpolationWorldTransform(); tempPosition3 = tempTransform3.getOrigin(); // vec tempOrientation2 = tempTransform3.getRotation(); // ori tempAngularVelocity1 = Body.getInterpolationAngularVelocity(); //rotvel tempLinearVelocity1 = Body.getInterpolationLinearVelocity(); // vel _torque = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getX(), tempAngularVelocity1.getZ()); Vector3 l_position = Vector3.Zero; Quaternion l_orientation = Quaternion.Identity; m_lastposition = _position; m_lastorientation = _orientation; l_position.X = tempPosition3.getX(); l_position.Y = tempPosition3.getY(); l_position.Z = tempPosition3.getZ(); l_orientation.X = tempOrientation2.getX(); l_orientation.Y = tempOrientation2.getY(); l_orientation.Z = tempOrientation2.getZ(); l_orientation.W = tempOrientation2.getW(); if (l_position.X > ((int)Constants.RegionSize - 0.05f) || l_position.X < 0f || l_position.Y > ((int)Constants.RegionSize - 0.05f) || l_position.Y < 0f) { //base.RaiseOutOfBounds(l_position); if (m_crossingfailures < _parent_scene.geomCrossingFailuresBeforeOutofbounds) { _position = l_position; //_parent_scene.remActivePrim(this); if (_parent == null) base.RequestPhysicsterseUpdate(); return; } else { if (_parent == null) base.RaiseOutOfBounds(l_position); return; } } if (l_position.Z < -200000f) { // This is so prim that get lost underground don't fall forever and suck up // // Sim resources and memory. // Disables the prim's movement physics.... // It's a hack and will generate a console message if it fails. //IsPhysical = false; //if (_parent == null) //base.RaiseOutOfBounds(_position); _acceleration.X = 0; _acceleration.Y = 0; _acceleration.Z = 0; _velocity.X = 0; _velocity.Y = 0; _velocity.Z = 0; m_rotationalVelocity.X = 0; m_rotationalVelocity.Y = 0; m_rotationalVelocity.Z = 0; if (_parent == null) base.RequestPhysicsterseUpdate(); m_throttleUpdates = false; // throttleCounter = 0; _zeroFlag = true; //outofBounds = true; } if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02) && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02) && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02) && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.01)) { _zeroFlag = true; m_throttleUpdates = false; } else { //m_log.Debug(Math.Abs(m_lastposition.X - l_position.X).ToString()); _zeroFlag = false; } if (_zeroFlag) { _velocity.X = 0.0f; _velocity.Y = 0.0f; _velocity.Z = 0.0f; _acceleration.X = 0; _acceleration.Y = 0; _acceleration.Z = 0; //_orientation.w = 0f; //_orientation.X = 0f; //_orientation.Y = 0f; //_orientation.Z = 0f; m_rotationalVelocity.X = 0; m_rotationalVelocity.Y = 0; m_rotationalVelocity.Z = 0; if (!m_lastUpdateSent) { m_throttleUpdates = false; // throttleCounter = 0; m_rotationalVelocity = pv; if (_parent == null) base.RequestPhysicsterseUpdate(); m_lastUpdateSent = true; } } else { if (lastZeroFlag != _zeroFlag) { if (_parent == null) base.RequestPhysicsterseUpdate(); } m_lastVelocity = _velocity; _position = l_position; _velocity.X = tempLinearVelocity1.getX(); _velocity.Y = tempLinearVelocity1.getY(); _velocity.Z = tempLinearVelocity1.getZ(); _acceleration = ((_velocity - m_lastVelocity) / 0.1f); _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f); //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); if (_velocity.ApproxEquals(pv, 0.5f)) { m_rotationalVelocity = pv; } else { m_rotationalVelocity = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getY(), tempAngularVelocity1.getZ()); } //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); _orientation.X = l_orientation.X; _orientation.Y = l_orientation.Y; _orientation.Z = l_orientation.Z; _orientation.W = l_orientation.W; m_lastUpdateSent = false; //if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate) //{ if (_parent == null) base.RequestPhysicsterseUpdate(); // } // else // { // throttleCounter++; //} } m_lastposition = l_position; if (forceenable) { Body.forceActivationState(1); forceenable = false; } } else { // Not a body.. so Make sure the client isn't interpolating _velocity.X = 0; _velocity.Y = 0; _velocity.Z = 0; _acceleration.X = 0; _acceleration.Y = 0; _acceleration.Z = 0; m_rotationalVelocity.X = 0; m_rotationalVelocity.Y = 0; m_rotationalVelocity.Z = 0; _zeroFlag = true; } } }
/// <summary> /// Updates the reported position and velocity. This essentially sends the data up to ScenePresence. /// </summary> public void UpdatePositionAndVelocity() { if (Body == null) return; //int val = Environment.TickCount; CheckIfStandingOnObject(); //m_log.DebugFormat("time:{0}", Environment.TickCount - val); //IsColliding = Body.checkCollideWith(m_parent_scene.TerrainBody); tempTrans1.Dispose(); tempTrans1 = Body.getInterpolationWorldTransform(); tempVector1.Dispose(); tempVector1 = tempTrans1.getOrigin(); tempVector2.Dispose(); tempVector2 = Body.getInterpolationLinearVelocity(); // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! Vector3 vec = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) if (vec.X < -10.0f) vec.X = 0.0f; if (vec.Y < -10.0f) vec.Y = 0.0f; if (vec.X > (int)Constants.RegionSize + 10.2f) vec.X = (int)Constants.RegionSize + 10.2f; if (vec.Y > (int)Constants.RegionSize + 10.2f) vec.Y = (int)Constants.RegionSize + 10.2f; m_position.X = vec.X; m_position.Y = vec.Y; m_position.Z = vec.Z; // Did we move last? = zeroflag // This helps keep us from sliding all over if (m_zeroFlag) { m_velocity.X = 0.0f; m_velocity.Y = 0.0f; m_velocity.Z = 0.0f; // Did we send out the 'stopped' message? if (!m_lastUpdateSent) { m_lastUpdateSent = true; base.RequestPhysicsterseUpdate(); } } else { m_lastUpdateSent = false; vec = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); m_velocity.X = (vec.X); m_velocity.Y = (vec.Y); m_velocity.Z = (vec.Z); //m_log.Debug(m_target_velocity); if (m_velocity.Z < -6 && !m_hackSentFall) { m_hackSentFall = true; m_pidControllerActive = false; } else if (m_flying && !m_hackSentFly) { //m_hackSentFly = true; //base.SendCollisionUpdate(new CollisionEventUpdate()); } else { m_hackSentFly = false; m_hackSentFall = false; } } if (Body != null) { if (Body.getFriction() < 0.9f) Body.setFriction(0.9f); } //if (Body != null) // Body.clearForces(); }
internal void Move(float timestep) { //TODO: float fx = 0; float fy = 0; float fz = 0; if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero && !m_isSelected) { float m_mass = CalculateMass(); fz = 0f; //m_log.Info(m_collisionFlags.ToString()); if (m_buoyancy != 0) { if (m_buoyancy > 0) { fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass) * 0.035f; //d.Vector3 l_velocity = d.BodyGetLinearVel(Body); //m_log.Info("Using Buoyancy: " + buoyancy + " G: " + (_parent_scene.gravityz * m_buoyancy) + "mass:" + m_mass + " Pos: " + Position.ToString()); } else { fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass) * 0.035f); } } if (m_usePID) { PID_D = 61f; PID_G = 65f; //if (!d.BodyIsEnabled(Body)) //d.BodySetForce(Body, 0f, 0f, 0f); // If we're using the PID controller, then we have no gravity fz = ((-1 * _parent_scene.gravityz) * m_mass) * 1.025f; // no lock; for now it's only called from within Simulate() // If the PID Controller isn't active then we set our force // calculating base velocity to the current position if ((m_PIDTau < 1) && (m_PIDTau != 0)) { //PID_G = PID_G / m_PIDTau; m_PIDTau = 1; } if ((PID_G - m_PIDTau) <= 0) { PID_G = m_PIDTau + 1; } // TODO: NEED btVector3 for Linear Velocity // NEED btVector3 for Position Vector3 pos = _position; //TODO: Insert values gotten from bullet Vector3 vel = _velocity; _target_velocity = new Vector3( (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) ); if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) { /* TODO: Do Bullet equiv * d.BodySetPosition(Body, m_PIDTarget.X, m_PIDTarget.Y, m_PIDTarget.Z); d.BodySetLinearVel(Body, 0, 0, 0); d.BodyAddForce(Body, 0, 0, fz); return; */ } else { _zeroFlag = false; fx = ((_target_velocity.X) - vel.X) * (PID_D); fy = ((_target_velocity.Y) - vel.Y) * (PID_D); fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); } } if (m_useHoverPID && !m_usePID) { // If we're using the PID controller, then we have no gravity fz = (-1 * _parent_scene.gravityz) * m_mass; // no lock; for now it's only called from within Simulate() // If the PID Controller isn't active then we set our force // calculating base velocity to the current position if ((m_PIDTau < 1)) { PID_G = PID_G / m_PIDTau; } if ((PID_G - m_PIDTau) <= 0) { PID_G = m_PIDTau + 1; } Vector3 pos = Vector3.Zero; //TODO: Insert values gotten from bullet Vector3 vel = Vector3.Zero; // determine what our target height really is based on HoverType switch (m_PIDHoverType) { case PIDHoverType.Absolute: m_targetHoverHeight = m_PIDHoverHeight; break; case PIDHoverType.Ground: m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; break; case PIDHoverType.GroundAndWater: m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); m_waterHeight = _parent_scene.GetWaterLevel(); if (m_groundHeight > m_waterHeight) { m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; } else { m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; } break; case PIDHoverType.Water: m_waterHeight = _parent_scene.GetWaterLevel(); m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; break; } _target_velocity = new Vector3(0.0f, 0.0f, (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) ); // if velocity is zero, use position control; otherwise, velocity control if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) { /* TODO: Do Bullet Equiv d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight); d.BodySetLinearVel(Body, vel.X, vel.Y, 0); d.BodyAddForce(Body, 0, 0, fz); */ if (Body != null && Body.Handle != IntPtr.Zero) { Body.setLinearVelocity(_parent_scene.VectorZero); Body.clearForces(); } return; } else { _zeroFlag = false; // We're flying and colliding with something fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); } } fx *= m_mass; fy *= m_mass; //fz *= m_mass; fx += m_force.X; fy += m_force.Y; fz += m_force.Z; //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString()); if (fx != 0 || fy != 0 || fz != 0) { /* * TODO: Do Bullet Equiv if (!d.BodyIsEnabled(Body)) { d.BodySetLinearVel(Body, 0f, 0f, 0f); d.BodySetForce(Body, 0, 0, 0); enableBodySoft(); } */ // 35x10 = 350n times the mass per second applied maximum. float nmax = 35f * m_mass; float nmin = -35f * m_mass; if (fx > nmax) fx = nmax; if (fx < nmin) fx = nmin; if (fy > nmax) fy = nmax; if (fy < nmin) fy = nmin; // TODO: Do Bullet Equiv // d.BodyAddForce(Body, fx, fy, fz); if (Body != null && Body.Handle != IntPtr.Zero) { Body.activate(true); if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) tempAddForce.Dispose(); tempAddForce = new btVector3(fx * 0.01f, fy * 0.01f, fz * 0.01f); Body.applyCentralImpulse(tempAddForce); } } } else { if (m_zeroPosition == null) m_zeroPosition = Vector3.Zero; m_zeroPosition = _position; return; } }
public BulletDotNETCharacter(string avName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) { m_position = pos; m_zeroPosition = pos; m_parent_scene = parent_scene; PID_D = pid_d; PID_P = pid_p; CAPSULE_RADIUS = capsule_radius; m_density = density; heightFudgeFactor = height_fudge_factor; walkDivisor = walk_divisor; runDivisor = rundivisor; for (int i = 0; i < 11; i++) { m_colliderarr[i] = false; } for (int i = 0; i < 11; i++) { m_colliderGroundarr[i] = false; } CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; 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 m_parent_scene.AddPhysicsActorTaint(this); // m_name = avName; tempVector1 = new btVector3(0, 0, 0); tempVector2 = new btVector3(0, 0, 0); tempVector3 = new btVector3(0, 0, 0); tempVector4 = new btVector3(0, 0, 0); tempVector5RayCast = new btVector3(0, 0, 0); tempVector6RayCast = new btVector3(0, 0, 0); tempVector7RayCast = new btVector3(0, 0, 0); tempQuat1 = new btQuaternion(0, 0, 0, 1); tempTrans1 = new btTransform(tempQuat1, tempVector1); // m_movementComparision = new PhysicsVector(0, 0, 0); m_CapsuleOrientationAxis = new btVector3(1, 0, 1); }
public override void SetTerrain (ITerrainChannel channel, short[] shortheightMap) { if (m_terrainShape != null) DeleteTerrain(); float hfmax = 256; float hfmin = 0; // store this for later reference. // Note, we're storing it after we check it for anomolies above _origheightmap = shortheightMap; hfmin = 0; hfmax = 256; float[] heightmap = new float[m_region.RegionSizeX * m_region.RegionSizeX]; for (int i = 0; i < shortheightMap.Length; i++) { heightmap[i] = shortheightMap[i] / Constants.TerrainCompression; } m_terrainShape = new btHeightfieldTerrainShape(m_region.RegionSizeX, m_region.RegionSizeY, heightmap, 1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z, (int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false); float AabbCenterX = m_region.RegionSizeX / 2f; float AabbCenterY = m_region.RegionSizeY / 2f; float AabbCenterZ = 0; float temphfmin, temphfmax; temphfmin = hfmin; temphfmax = hfmax; if (temphfmin < 0) { temphfmax = 0 - temphfmin; temphfmin = 0 - temphfmin; } else if (temphfmin > 0) { temphfmax = temphfmax + (0 - temphfmin); //temphfmin = temphfmin + (0 - temphfmin); } AabbCenterZ = temphfmax/2f; if (m_terrainPosition == null) { m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); } else { try { m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ); } catch (ObjectDisposedException) { m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); } } if (m_terrainMotionState != null) { m_terrainMotionState.Dispose(); m_terrainMotionState = null; } m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition); m_terrainMotionState = new btDefaultMotionState(m_terrainTransform); TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape); TerrainBody.setUserPointer((IntPtr)0); m_world.addRigidBody(TerrainBody); }
public void ProcessTaints(float timestep) { if (m_tainted_isPhysical != m_isPhysical) { if (m_tainted_isPhysical) { // Create avatar capsule and related ODE data if (!(Shell == null && Body == null)) { m_log.Warn("[PHYSICS]: re-creating the following avatar ODE data, even though it already exists - " + (Shell != null ? "Shell " : "") + (Body != null ? "Body " : "")); } AvatarGeomAndBodyCreation(m_position.X, m_position.Y, m_position.Z); } else { // destroy avatar capsule and related ODE data Dispose(); tempVector1 = new btVector3(0, 0, 0); tempVector2 = new btVector3(0, 0, 0); tempVector3 = new btVector3(0, 0, 0); tempVector4 = new btVector3(0, 0, 0); tempVector5RayCast = new btVector3(0, 0, 0); tempVector6RayCast = new btVector3(0, 0, 0); tempVector7RayCast = new btVector3(0, 0, 0); tempQuat1 = new btQuaternion(0, 0, 0, 1); tempTrans1 = new btTransform(tempQuat1, tempVector1); // m_movementComparision = new PhysicsVector(0, 0, 0); m_CapsuleOrientationAxis = new btVector3(1, 0, 1); } m_isPhysical = m_tainted_isPhysical; } if (m_tainted_CAPSULE_LENGTH != CAPSULE_LENGTH) { if (Body != null) { m_pidControllerActive = true; // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate() //d.JointDestroy(Amotor); float prevCapsule = CAPSULE_LENGTH; CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH; //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); Dispose(); tempVector1 = new btVector3(0, 0, 0); tempVector2 = new btVector3(0, 0, 0); tempVector3 = new btVector3(0, 0, 0); tempVector4 = new btVector3(0, 0, 0); tempVector5RayCast = new btVector3(0, 0, 0); tempVector6RayCast = new btVector3(0, 0, 0); tempVector7RayCast = new btVector3(0, 0, 0); tempQuat1 = new btQuaternion(0, 0, 0, 1); tempTrans1 = new btTransform(tempQuat1, tempVector1); // m_movementComparision = new PhysicsVector(0, 0, 0); m_CapsuleOrientationAxis = new btVector3(1, 0, 1); AvatarGeomAndBodyCreation(m_position.X, m_position.Y, m_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2)); Velocity = Vector3.Zero; } else { m_log.Warn("[PHYSICS]: trying to change capsule size, but the following ODE data is missing - " + (Shell == null ? "Shell " : "") + (Body == null ? "Body " : "")); } } if (m_taintRemove) { Dispose(); } }
public BulletDotNETScene(string sceneIdentifier) { BulletLock = new object(); // m_sceneIdentifier = sceneIdentifier; VectorZero = new btVector3(0, 0, 0); QuatIdentity = new btQuaternion(0, 0, 0, 1); TransZero = new btTransform(QuatIdentity, VectorZero); m_gravity = new btVector3(0, 0, gravityz); _origheightmap = new float[(int)Constants.RegionSize * (int)Constants.RegionSize]; }
public override void PostInitialise(IConfigSource config) { //m_config = config; if (config != null) { IConfig physicsconfig = config.Configs["BulletPhysicsSettings"]; if (physicsconfig != null) { gravityx = physicsconfig.GetFloat("world_gravityx", 0f); gravityy = physicsconfig.GetFloat("world_gravityy", 0f); gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); avDensity = physicsconfig.GetFloat("av_density", 80f); avHeightFudgeFactor = physicsconfig.GetFloat("av_height_fudge_factor", 0.52f); avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f); avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f); avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); //contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 4); geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); if (Environment.OSVersion.Platform == PlatformID.Unix) { avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", 65f); avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", 25); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_linux", 2f); } else { avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", 65f); avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 25); bodyMotorJointMaxforceTensor = physicsconfig.GetFloat("body_motor_joint_maxforce_tensor_win", 2f); } forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); } } lock (BulletLock) { worldAabbMax = new btVector3(m_region.RegionSizeX + 10f, m_region.RegionSizeY + 10f, m_region.RegionSizeZ); m_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, 16000); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_solver = new btSequentialImpulseConstraintSolver(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); m_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration); m_world.setGravity(m_gravity); EnableCollisionInterface(); } }
public void CreateGeom(IntPtr m_targetSpace, IMesh p_mesh) { m_log.Debug("[PHYSICS]: _________CreateGeom"); if (p_mesh != null) { //_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); _mesh = p_mesh; setMesh(_parent_scene, _mesh); } else { if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) { if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) { if (((_size.X / 2f) > 0f)) { //SetGeom to a Regular Sphere if (tempSize1 == null) tempSize1 = new btVector3(0, 0, 0); tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); SetCollisionShape(new btSphereShape(_size.X * 0.5f)); } else { // uses halfextents if (tempSize1 == null) tempSize1 = new btVector3(0, 0, 0); tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); SetCollisionShape(new btBoxShape(tempSize1)); } } else { // uses halfextents if (tempSize1 == null) tempSize1 = new btVector3(0, 0, 0); tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); SetCollisionShape(new btBoxShape(tempSize1)); } } else { if (tempSize1 == null) tempSize1 = new btVector3(0, 0, 0); // uses halfextents tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); SetCollisionShape(new btBoxShape(tempSize1)); } } }