Physics fix
This commit is contained in:
parent
dc0a61c0dc
commit
174126912e
@ -267,7 +267,7 @@
|
|||||||
"collidable" : {
|
"collidable" : {
|
||||||
"type" : "CYLINDER",
|
"type" : "CYLINDER",
|
||||||
"dimension1" : 0.1,
|
"dimension1" : 0.1,
|
||||||
"dimension2" : 0.9,
|
"dimension2" : 0.8,
|
||||||
"dimension3" : 0.1,
|
"dimension3" : 0.1,
|
||||||
"rotX": 0,
|
"rotX": 0,
|
||||||
"rotY": 0,
|
"rotY": 0,
|
||||||
|
|||||||
@ -26,6 +26,7 @@ The big case for this engine is the main physics system. The goal is to provide
|
|||||||
|
|
||||||
- All geometries are aligned along z by default in the library (ie your cylinders will be on their sides)
|
- All geometries are aligned along z by default in the library (ie your cylinders will be on their sides)
|
||||||
- All functions that transform the scale of a DBody only transform the first shape within the rigid body. This should likely eventually be updated to support multiple shapes in a body.
|
- All functions that transform the scale of a DBody only transform the first shape within the rigid body. This should likely eventually be updated to support multiple shapes in a body.
|
||||||
|
- Furthermore, these transform functions require the CollidableTemplate to modify scale. Ode4J doesn't provide a "scale" function, instead it lets you change the core params. To scale, must know the original size.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ TODO
|
|||||||
|
|
||||||
|
|
||||||
## Major Usage Notes
|
## Major Usage Notes
|
||||||
|
- Global pretransforms are applied to the global inverse bind pose matrix
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -65,7 +65,7 @@ public class CollisionBodyCreation {
|
|||||||
public static DBody createCylinderBody(CollisionEngine collisionEngine, double radius, double length){
|
public static DBody createCylinderBody(CollisionEngine collisionEngine, double radius, double length){
|
||||||
DCylinder geom = collisionEngine.createCylinderGeom(radius,length);
|
DCylinder geom = collisionEngine.createCylinderGeom(radius,length);
|
||||||
DBody returnBody = collisionEngine.createDBody(geom);
|
DBody returnBody = collisionEngine.createDBody(geom);
|
||||||
geom.setOffsetRotation(AXIS_CORRECTION_MATRIX);
|
geom.setOffsetRotation(AXIS_CORRECTION_MATRIX); //ode4j required geom to already be on body before rotating for some reason
|
||||||
return returnBody;
|
return returnBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -52,6 +52,7 @@ import electrosphere.entity.EntityDataStrings;
|
|||||||
import electrosphere.entity.EntityUtils;
|
import electrosphere.entity.EntityUtils;
|
||||||
import electrosphere.entity.state.collidable.Impulse;
|
import electrosphere.entity.state.collidable.Impulse;
|
||||||
import electrosphere.entity.types.hitbox.HitboxData;
|
import electrosphere.entity.types.hitbox.HitboxData;
|
||||||
|
import electrosphere.game.data.collidable.CollidableTemplate;
|
||||||
import electrosphere.logger.LoggerInterface;
|
import electrosphere.logger.LoggerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -647,17 +648,17 @@ public class CollisionEngine {
|
|||||||
* @param rotation The rotation
|
* @param rotation The rotation
|
||||||
* @param scale The scale
|
* @param scale The scale
|
||||||
*/
|
*/
|
||||||
protected void setBodyTransform(DBody body, Vector3d position, Quaterniond rotation, Vector3d scale){
|
protected void setBodyTransform(DBody body, CollidableTemplate template, Vector3d position, Quaterniond rotation, Vector3d scale){
|
||||||
spaceLock.acquireUninterruptibly();
|
spaceLock.acquireUninterruptibly();
|
||||||
body.setPosition(position.x, position.y, position.z);
|
body.setPosition(position.x, position.y, position.z);
|
||||||
body.setQuaternion(PhysicsUtils.jomlQuatToOdeQuat(rotation));
|
body.setQuaternion(PhysicsUtils.jomlQuatToOdeQuat(rotation));
|
||||||
DGeom firstGeom = body.getFirstGeom();
|
DGeom firstGeom = body.getFirstGeom();
|
||||||
if(firstGeom instanceof DCylinder){
|
if(firstGeom instanceof DCylinder){
|
||||||
((DCylinder)firstGeom).setParams(scale.x,scale.y);
|
((DCylinder)firstGeom).setParams(template.getDimension1() * scale.x,template.getDimension2() * scale.y);
|
||||||
} else if(firstGeom instanceof DBox){
|
} else if(firstGeom instanceof DBox){
|
||||||
((DBox)firstGeom).setLengths(scale.x,scale.y,scale.z);
|
((DBox)firstGeom).setLengths(template.getDimension1() * scale.x,template.getDimension2() * scale.y,template.getDimension3() * scale.z);
|
||||||
} else if(firstGeom instanceof DCapsule){
|
} else if(firstGeom instanceof DCapsule){
|
||||||
((DCapsule)firstGeom).setParams(scale.x,scale.y);
|
((DCapsule)firstGeom).setParams(template.getDimension1() * scale.x,template.getDimension2() * scale.y);
|
||||||
}
|
}
|
||||||
spaceLock.release();
|
spaceLock.release();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,10 +46,9 @@ public class PhysicsEntityUtils {
|
|||||||
collidable = new Collidable(rVal, Collidable.TYPE_CREATURE);
|
collidable = new Collidable(rVal, Collidable.TYPE_CREATURE);
|
||||||
ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody);
|
ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody);
|
||||||
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody);
|
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody);
|
||||||
Matrix4d offsetTransform = new Matrix4d().translationRotateScale(
|
Matrix4d offsetTransform = new Matrix4d().translationRotate(
|
||||||
physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate
|
physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate
|
||||||
physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate
|
physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW() //rotate
|
||||||
1, 1, 1 //scale
|
|
||||||
);
|
);
|
||||||
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_OFFSET, new Vector3f(physicsTemplate.getOffsetX(),physicsTemplate.getOffsetY(),physicsTemplate.getOffsetZ()));
|
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_OFFSET, new Vector3f(physicsTemplate.getOffsetX(),physicsTemplate.getOffsetY(),physicsTemplate.getOffsetZ()));
|
||||||
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_TRANSFORM, offsetTransform);
|
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_TRANSFORM, offsetTransform);
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import org.ode4j.math.DQuaternionC;
|
|||||||
import org.ode4j.ode.DBody;
|
import org.ode4j.ode.DBody;
|
||||||
import org.ode4j.ode.DMass;
|
import org.ode4j.ode.DMass;
|
||||||
|
|
||||||
|
import electrosphere.game.data.collidable.CollidableTemplate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for leveraging the collision system to perform physics
|
* Utilities for leveraging the collision system to perform physics
|
||||||
*/
|
*/
|
||||||
@ -76,8 +78,8 @@ public class PhysicsUtils {
|
|||||||
* @param scale The scale
|
* @param scale The scale
|
||||||
* @param body The body
|
* @param body The body
|
||||||
*/
|
*/
|
||||||
public static void setRigidBodyTransform(CollisionEngine collisionEngine, Vector3d position, Quaterniond rotation, Vector3d scale, DBody body){
|
public static void setRigidBodyTransform(CollisionEngine collisionEngine, CollidableTemplate template, Vector3d position, Quaterniond rotation, Vector3d scale, DBody body){
|
||||||
collisionEngine.setBodyTransform(body, position, rotation, scale);
|
collisionEngine.setBodyTransform(body, template, position, rotation, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -217,10 +217,10 @@ public class ClientCollidableTree implements BehaviorTree {
|
|||||||
Vector4d rigidBodyPositionRaw = parentTransform.transform(new Vector4d(0,0,0,1));
|
Vector4d rigidBodyPositionRaw = parentTransform.transform(new Vector4d(0,0,0,1));
|
||||||
Vector3d rigidBodyPosition = new Vector3d(rigidBodyPositionRaw.x,rigidBodyPositionRaw.y,rigidBodyPositionRaw.z);
|
Vector3d rigidBodyPosition = new Vector3d(rigidBodyPositionRaw.x,rigidBodyPositionRaw.y,rigidBodyPositionRaw.z);
|
||||||
Quaterniond rigidBodyRotation = parentTransform.getUnnormalizedRotation(new Quaterniond()).normalize();
|
Quaterniond rigidBodyRotation = parentTransform.getUnnormalizedRotation(new Quaterniond()).normalize();
|
||||||
Vector3d rigidBodyScaleRaw = parentTransform.getScale(new Vector3d());
|
Vector3d rigidBodyScale = new Vector3d(parentScale);
|
||||||
Vector3d rigidBodyScale = new Vector3d(rigidBodyScaleRaw.x,rigidBodyScaleRaw.y,rigidBodyScaleRaw.z);
|
|
||||||
PhysicsUtils.setRigidBodyTransform(
|
PhysicsUtils.setRigidBodyTransform(
|
||||||
Globals.clientSceneWrapper.getCollisionEngine(),
|
Globals.clientSceneWrapper.getCollisionEngine(),
|
||||||
|
template,
|
||||||
rigidBodyPosition,
|
rigidBodyPosition,
|
||||||
rigidBodyRotation,
|
rigidBodyRotation,
|
||||||
rigidBodyScale,
|
rigidBodyScale,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user