[DEV] last development of the 3 physic engine (next step is migration to a generic engine)
This commit is contained in:
parent
839a2f9c4f
commit
711ef047fc
@ -117,12 +117,12 @@ public class ComponentPhysics extends Component {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (ComponentPhysics elem : narrowIntersection) {
|
for (ComponentPhysics elem : narrowIntersection) {
|
||||||
for (PhysicShape shapeCurrent : shapes) {
|
for (PhysicShape shapeCurrent : this.shapes) {
|
||||||
//TODO Do a better method we do this many times ...
|
//TODO Do a better method we do this many times ...
|
||||||
if (elem.checkCollide(shapeCurrent) == false) {
|
if (elem.checkCollide(shapeCurrent) == false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
elem.getCollidePoints(shapeCurrent);
|
elem.getCollidePoints(shapeCurrent, this.staticObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -173,13 +173,13 @@ public class ComponentPhysics extends Component {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
private void getCollidePoints(PhysicShape shapeCurrent) {
|
private void getCollidePoints(PhysicShape shapeCurrent, boolean isStatic) {
|
||||||
if (shapeCurrent instanceof PhysicBox) {
|
if (shapeCurrent instanceof PhysicBox) {
|
||||||
PhysicBox shape111 = (PhysicBox)shapeCurrent;
|
PhysicBox shape111 = (PhysicBox)shapeCurrent;
|
||||||
for (PhysicShape shape : shapes) {
|
for (PhysicShape shape : this.shapes) {
|
||||||
if (shape instanceof PhysicBox) {
|
if (shape instanceof PhysicBox) {
|
||||||
PhysicBox shape222 = (PhysicBox)shape;
|
PhysicBox shape222 = (PhysicBox)shape;
|
||||||
ToolCollisionOBBWithOBB.getCollidePoints(shape111, shape222);
|
ToolCollisionOBBWithOBB.getCollidePoints(shape111, isStatic, shape222, this.staticObject);
|
||||||
} else if (shape instanceof PhysicSphere) {
|
} else if (shape instanceof PhysicSphere) {
|
||||||
|
|
||||||
} else if (shape instanceof PhysicMapVoxel) {
|
} else if (shape instanceof PhysicMapVoxel) {
|
||||||
@ -189,7 +189,7 @@ public class ComponentPhysics extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (shapeCurrent instanceof PhysicSphere) {
|
} else if (shapeCurrent instanceof PhysicSphere) {
|
||||||
for (PhysicShape shape : shapes) {
|
for (PhysicShape shape : this.shapes) {
|
||||||
if (shape instanceof PhysicBox) {
|
if (shape instanceof PhysicBox) {
|
||||||
|
|
||||||
} else if (shape instanceof PhysicSphere) {
|
} else if (shape instanceof PhysicSphere) {
|
||||||
@ -201,7 +201,7 @@ public class ComponentPhysics extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (shapeCurrent instanceof PhysicMapVoxel) {
|
} else if (shapeCurrent instanceof PhysicMapVoxel) {
|
||||||
for (PhysicShape shape : shapes) {
|
for (PhysicShape shape : this.shapes) {
|
||||||
if (shape instanceof PhysicBox) {
|
if (shape instanceof PhysicBox) {
|
||||||
|
|
||||||
} else if (shape instanceof PhysicSphere) {
|
} else if (shape instanceof PhysicSphere) {
|
||||||
@ -294,6 +294,12 @@ public class ComponentPhysics extends Component {
|
|||||||
this.aabbIntersection.clear();
|
this.aabbIntersection.clear();
|
||||||
}
|
}
|
||||||
public void addIntersection(ComponentPhysics component) {
|
public void addIntersection(ComponentPhysics component) {
|
||||||
|
// do not add multiple times
|
||||||
|
for (ComponentPhysics elem : this.aabbIntersection) {
|
||||||
|
if (elem == component) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.aabbIntersection.add(component);
|
this.aabbIntersection.add(component);
|
||||||
}
|
}
|
||||||
public List<ComponentPhysics> getAabbIntersection() {
|
public List<ComponentPhysics> getAabbIntersection() {
|
||||||
|
@ -63,11 +63,19 @@ public class EnginePhysics extends Engine {
|
|||||||
it.applyForces(TIME_STEP, gravity);
|
it.applyForces(TIME_STEP, gravity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Collision detection STEP 1: Upadte the AABB positioning of each elements
|
||||||
|
* @param timeStep Delta time since the last check
|
||||||
|
*/
|
||||||
private void updateAABB(float timeStep) {
|
private void updateAABB(float timeStep) {
|
||||||
for (ComponentPhysics it: components) {
|
for (ComponentPhysics it: components) {
|
||||||
it.updateAABB();
|
it.updateAABB();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Collision Detection STEP 2: update the list of each element that collide together in the AABB Boxs (update is done between each boxes)
|
||||||
|
* @param timeStep Delta time since the last check
|
||||||
|
*/
|
||||||
private void updateCollisionsAABB(float timeStep) {
|
private void updateCollisionsAABB(float timeStep) {
|
||||||
// clear all object intersection
|
// clear all object intersection
|
||||||
for (ComponentPhysics it: components) {
|
for (ComponentPhysics it: components) {
|
||||||
@ -86,6 +94,10 @@ public class EnginePhysics extends Engine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Collision Detection STEP 3: Narrow phase: process the collision between every OBB boxes (or other..)
|
||||||
|
* @param timeStep Delta time since the last check
|
||||||
|
*/
|
||||||
private void updateCollisionsNarrowPhase(float timeStep) {
|
private void updateCollisionsNarrowPhase(float timeStep) {
|
||||||
// clear all object intersection
|
// clear all object intersection
|
||||||
for (ComponentPhysics it: components) {
|
for (ComponentPhysics it: components) {
|
||||||
@ -103,6 +115,10 @@ public class EnginePhysics extends Engine {
|
|||||||
current.narrowCollisionCreateContactAndForce();
|
current.narrowCollisionCreateContactAndForce();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Collision Detection STEP 4: apply all calculated forces (with containts)
|
||||||
|
* @param timeStep
|
||||||
|
*/
|
||||||
private void generateResultCollisionsForces(float timeStep) {
|
private void generateResultCollisionsForces(float timeStep) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ public class ColisionPoints {
|
|||||||
public Vector3f force;
|
public Vector3f force;
|
||||||
|
|
||||||
public ColisionPoints(Vector3f position, Vector3f force) {
|
public ColisionPoints(Vector3f position, Vector3f force) {
|
||||||
super();
|
|
||||||
this.position = position;
|
this.position = position;
|
||||||
this.force = force;
|
this.force = force;
|
||||||
}
|
}
|
||||||
|
17
src/org/atriasoft/gameengine/physics/Collision.java
Normal file
17
src/org/atriasoft/gameengine/physics/Collision.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package org.atriasoft.gameengine.physics;
|
||||||
|
|
||||||
|
public class Collision {
|
||||||
|
public final ColisionPoints[] colisionPointLocal;
|
||||||
|
public final PhysicShape shapeRemote;
|
||||||
|
public final ColisionPoints[] colisionPointRemote;
|
||||||
|
public final boolean staticRemote;
|
||||||
|
public Collision(ColisionPoints[] colisionPointLocal, PhysicShape shapeRemote,
|
||||||
|
ColisionPoints[] colisionPointRemote, boolean staticRemote) {
|
||||||
|
super();
|
||||||
|
this.colisionPointLocal = colisionPointLocal;
|
||||||
|
this.shapeRemote = shapeRemote;
|
||||||
|
this.colisionPointRemote = colisionPointRemote;
|
||||||
|
this.staticRemote = staticRemote;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,14 @@
|
|||||||
package org.atriasoft.gameengine.physics;
|
package org.atriasoft.gameengine.physics;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.atriasoft.etk.Color;
|
import org.atriasoft.etk.Color;
|
||||||
import org.atriasoft.etk.math.Matrix4f;
|
import org.atriasoft.etk.math.Matrix4f;
|
||||||
import org.atriasoft.etk.math.Transform3D;
|
import org.atriasoft.etk.math.Transform3D;
|
||||||
import org.atriasoft.etk.math.Vector3f;
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
import org.atriasoft.gale.resource.ResourceColored3DObject;
|
import org.atriasoft.gale.resource.ResourceColored3DObject;
|
||||||
|
import org.atriasoft.gameengine.internal.Log;
|
||||||
|
|
||||||
public class PhysicBox extends PhysicShape {
|
public class PhysicBox extends PhysicShape {
|
||||||
// Box size property in X, Y and Z
|
// Box size property in X, Y and Z
|
||||||
@ -26,6 +30,7 @@ public class PhysicBox extends PhysicShape {
|
|||||||
public void updateAABB(Transform3D transformGlobal, PhysicCollisionAABB aabb) {
|
public void updateAABB(Transform3D transformGlobal, PhysicCollisionAABB aabb) {
|
||||||
// store it, many time usefull...
|
// store it, many time usefull...
|
||||||
this.transformGlobal = transformGlobal;
|
this.transformGlobal = transformGlobal;
|
||||||
|
this.colisionPoints.clear();
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(this.size.x * 0.5f, this.size.y * 0.5f, this.size.z * 0.5f))));
|
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(this.size.x * 0.5f, this.size.y * 0.5f, this.size.z * 0.5f))));
|
||||||
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(-this.size.x * 0.5f, this.size.y * 0.5f, this.size.z * 0.5f))));
|
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(-this.size.x * 0.5f, this.size.y * 0.5f, this.size.z * 0.5f))));
|
||||||
@ -56,7 +61,7 @@ public class PhysicBox extends PhysicShape {
|
|||||||
private void renderPoint(Vector3f subPosition, Transform3D transformGlobal, ResourceColored3DObject debugDrawProperty) {
|
private void renderPoint(Vector3f subPosition, Transform3D transformGlobal, ResourceColored3DObject debugDrawProperty) {
|
||||||
Matrix4f transformation = transformGlobal.getOpenGLMatrix().multiplyNew(this.transform.getOpenGLMatrix()).multiply(Matrix4f.createMatrixTranslate(subPosition));
|
Matrix4f transformation = transformGlobal.getOpenGLMatrix().multiplyNew(this.transform.getOpenGLMatrix()).multiply(Matrix4f.createMatrixTranslate(subPosition));
|
||||||
|
|
||||||
debugDrawProperty.drawSquare(new Vector3f(0.1f, 0.1f, 0.1f), transformation, new Color(0, 0, 1, 1));
|
debugDrawProperty.drawSquare(new Vector3f(0.08f, 0.08f, 0.08f), transformation, new Color(0, 0, 1, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderPoint2(Vector3f subPosition, Transform3D transformGlobal, ResourceColored3DObject debugDrawProperty) {
|
private void renderPoint2(Vector3f subPosition, Transform3D transformGlobal, ResourceColored3DObject debugDrawProperty) {
|
||||||
@ -71,9 +76,12 @@ public class PhysicBox extends PhysicShape {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderPoint4(Vector3f subPosition, ResourceColored3DObject debugDrawProperty) {
|
private void renderPoint4(Vector3f subPosition, Vector3f force, ResourceColored3DObject debugDrawProperty) {
|
||||||
debugDrawProperty.drawSquare(new Vector3f(0.1f, 0.1f, 0.1f), Matrix4f.identity().multiply(Matrix4f.createMatrixTranslate(subPosition)), new Color(1, 0, 0, 1));
|
debugDrawProperty.drawSquare(new Vector3f(0.1f, 0.1f, 0.1f), Matrix4f.identity().multiply(Matrix4f.createMatrixTranslate(subPosition)), new Color(1, 0, 0, 1));
|
||||||
|
List<Vector3f> tmp = new ArrayList<>();
|
||||||
|
tmp.add(new Vector3f(0,0,0));
|
||||||
|
tmp.add(force);
|
||||||
|
debugDrawProperty.drawLine(tmp, new Color(1, 0, 0, 1), Matrix4f.identity().multiply(Matrix4f.createMatrixTranslate(subPosition)), true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -88,10 +96,17 @@ public class PhysicBox extends PhysicShape {
|
|||||||
renderPoint(new Vector3f(-dimention.x, +dimention.y, -dimention.z), transformGlobal, debugDrawProperty);
|
renderPoint(new Vector3f(-dimention.x, +dimention.y, -dimention.z), transformGlobal, debugDrawProperty);
|
||||||
renderPoint(new Vector3f(+dimention.x, -dimention.y, -dimention.z), transformGlobal, debugDrawProperty);
|
renderPoint(new Vector3f(+dimention.x, -dimention.y, -dimention.z), transformGlobal, debugDrawProperty);
|
||||||
renderPoint3(new Vector3f(-dimention.x, -dimention.y, -dimention.z), transformGlobal, debugDrawProperty);
|
renderPoint3(new Vector3f(-dimention.x, -dimention.y, -dimention.z), transformGlobal, debugDrawProperty);
|
||||||
if (this.colisionPointTest != null) {
|
for (Collision elem: this.colisionPoints) {
|
||||||
for (int iii = 0; iii < this.colisionPointTest.length; iii++) {
|
if (elem != null) {
|
||||||
renderPoint4(this.colisionPointTest[iii].position, debugDrawProperty);
|
if (elem.colisionPointLocal == null) {
|
||||||
|
Log.error("colision point must be set !!!");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int iii = 0; iii < elem.colisionPointLocal.length; iii++) {
|
||||||
|
renderPoint4(elem.colisionPointLocal[iii].position, elem.colisionPointLocal[iii].force, debugDrawProperty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ public class PhysicMapVoxel extends PhysicShape {
|
|||||||
if (this.chunk == null) {
|
if (this.chunk == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
this.colisionPoints.clear();
|
||||||
aabb.update(new Vector3f(this.chunk.getPosition().x,this.chunk.getPosition().y,this.chunk.getPosition().z));
|
aabb.update(new Vector3f(this.chunk.getPosition().x,this.chunk.getPosition().y,this.chunk.getPosition().z));
|
||||||
aabb.update(new Vector3f(
|
aabb.update(new Vector3f(
|
||||||
this.chunk.getPosition().x + VoxelChunk.VOXEL_CHUNK_SIZE,
|
this.chunk.getPosition().x + VoxelChunk.VOXEL_CHUNK_SIZE,
|
||||||
|
@ -1,12 +1,21 @@
|
|||||||
package org.atriasoft.gameengine.physics;
|
package org.atriasoft.gameengine.physics;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.atriasoft.etk.math.Quaternion;
|
import org.atriasoft.etk.math.Quaternion;
|
||||||
import org.atriasoft.etk.math.Transform3D;
|
import org.atriasoft.etk.math.Transform3D;
|
||||||
import org.atriasoft.etk.math.Vector3f;
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
import org.atriasoft.gale.resource.ResourceColored3DObject;
|
import org.atriasoft.gale.resource.ResourceColored3DObject;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public abstract class PhysicShape {
|
public abstract class PhysicShape {
|
||||||
public ColisionPoints[] colisionPointTest;
|
|
||||||
|
|
||||||
|
|
||||||
|
protected List<Collision> colisionPoints = new ArrayList<>();
|
||||||
// protected Quaternion quaternion;
|
// protected Quaternion quaternion;
|
||||||
// protected Vector3f origin;
|
// protected Vector3f origin;
|
||||||
protected Transform3D transform;
|
protected Transform3D transform;
|
||||||
@ -78,6 +87,11 @@ public abstract class PhysicShape {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addColision(Collision colision) {
|
||||||
|
colisionPoints.add(colision);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract void updateAABB(Transform3D transform, PhysicCollisionAABB aabb);
|
public abstract void updateAABB(Transform3D transform, PhysicCollisionAABB aabb);
|
||||||
|
|
||||||
public abstract void updateForNarrowCollision(Transform3D transform);
|
public abstract void updateForNarrowCollision(Transform3D transform);
|
||||||
|
@ -44,42 +44,42 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
|| getSeparatingPlane(rPos, box1.axisZ.cross(box2.axisZ), box1, box2);
|
|| getSeparatingPlane(rPos, box1.axisZ.cross(box2.axisZ), box1, box2);
|
||||||
return !ret;
|
return !ret;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
// a quick test to see the code working
|
// // a quick test to see the code working
|
||||||
public static void main(String[] args) {
|
// public static void main(String[] args) {
|
||||||
// create two obbs
|
// // create two obbs
|
||||||
OBB aaa = new OBB();
|
// OBB aaa = new OBB();
|
||||||
OBB bbb = new OBB();
|
// OBB bbb = new OBB();
|
||||||
|
//
|
||||||
// set the first obb's properties
|
// // set the first obb's properties
|
||||||
aaa.position = new Vector3f(0.0f, 0.0f, 0.0f); // set its center position
|
// aaa.position = new Vector3f(0.0f, 0.0f, 0.0f); // set its center position
|
||||||
|
//
|
||||||
// set the half size
|
// // set the half size
|
||||||
aaa.halfSize = new Vector3f(10.0f, 1.0f, 1.0f);
|
// aaa.halfSize = new Vector3f(10.0f, 1.0f, 1.0f);
|
||||||
|
//
|
||||||
// set the axes orientation
|
// // set the axes orientation
|
||||||
aaa.axisX = new Vector3f(1.0f, 0.0f, 0.0f);
|
// aaa.axisX = new Vector3f(1.0f, 0.0f, 0.0f);
|
||||||
aaa.axisY = new Vector3f(0.0f, 1.0f, 0.0f);
|
// aaa.axisY = new Vector3f(0.0f, 1.0f, 0.0f);
|
||||||
aaa.axisZ = new Vector3f(0.0f, 0.0f, 1.0f);
|
// aaa.axisZ = new Vector3f(0.0f, 0.0f, 1.0f);
|
||||||
|
//
|
||||||
// set the second obb's properties
|
// // set the second obb's properties
|
||||||
bbb.position = new Vector3f(20.0f, 0.0f, 0.0f); // set its center position
|
// bbb.position = new Vector3f(20.0f, 0.0f, 0.0f); // set its center position
|
||||||
|
//
|
||||||
// set the half size
|
// // set the half size
|
||||||
bbb.halfSize = new Vector3f(10.0f, 1.0f, 1.0f);
|
// bbb.halfSize = new Vector3f(10.0f, 1.0f, 1.0f);
|
||||||
|
//
|
||||||
// set the axes orientation
|
// // set the axes orientation
|
||||||
bbb.axisX = new Vector3f(1.0f, 0.0f, 0.0f);
|
// bbb.axisX = new Vector3f(1.0f, 0.0f, 0.0f);
|
||||||
bbb.axisY = new Vector3f(0.0f, 1.0f, 0.0f);
|
// bbb.axisY = new Vector3f(0.0f, 1.0f, 0.0f);
|
||||||
bbb.axisZ = new Vector3f(0.0f, 0.0f, 1.0f);
|
// bbb.axisZ = new Vector3f(0.0f, 0.0f, 1.0f);
|
||||||
|
//
|
||||||
// run the code and get the result as a message
|
// // run the code and get the result as a message
|
||||||
if (getCollision(aaa, bbb)) {
|
// if (getCollision(aaa, bbb)) {
|
||||||
Log.info("Collision!!!");
|
// Log.info("Collision!!!");
|
||||||
} else {
|
// } else {
|
||||||
Log.info("NO Collision!!!");
|
// Log.info("NO Collision!!!");
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// check if there's a separating plane in between the selected axes
|
// check if there's a separating plane in between the selected axes
|
||||||
private static boolean getSeparatingPlane222(Vector3f rPos, Vector3f plane, PhysicBox box1, PhysicBox box2) {
|
private static boolean getSeparatingPlane222(Vector3f rPos, Vector3f plane, PhysicBox box1, PhysicBox box2) {
|
||||||
@ -107,7 +107,7 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
return !ret;
|
return !ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getCollidePoints(PhysicBox box1, PhysicBox box2) {
|
public static void getCollidePoints(PhysicBox box1, boolean isStatic1, PhysicBox box2, boolean isStatic2) {
|
||||||
// Log.info("Try to calculare reverse force ........");
|
// Log.info("Try to calculare reverse force ........");
|
||||||
Vector3f rPos1 = box1.narrowPhaseGlobalPos.lessNew(box2.narrowPhaseGlobalPos);
|
Vector3f rPos1 = box1.narrowPhaseGlobalPos.lessNew(box2.narrowPhaseGlobalPos);
|
||||||
Vector3f rPos2 = box2.narrowPhaseGlobalPos.lessNew(box1.narrowPhaseGlobalPos);
|
Vector3f rPos2 = box2.narrowPhaseGlobalPos.lessNew(box1.narrowPhaseGlobalPos);
|
||||||
@ -143,11 +143,11 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
// fonctionne quand le block est trourner de 90% petit pb de positionnement en hauteur....
|
// fonctionne quand le block est trourner de 90% petit pb de positionnement en hauteur....
|
||||||
// getCollidePointsAABBCenteredWithOBB(box2.narrowPhaseHalfSize, box1.narrowPhaseHalfSize, quatTransfer2, quat2.multiply(rPos2));
|
// getCollidePointsAABBCenteredWithOBB(box2.narrowPhaseHalfSize, box1.narrowPhaseHalfSize, quatTransfer2, quat2.multiply(rPos2));
|
||||||
ColisionPoints[] collide1 = getCollidePointsAABBCenteredWithOBB(box2.narrowPhaseHalfSize, box1.narrowPhaseHalfSize, quatTransfer2, quat2.inverseNew().getMatrix4().multiply(rPos1));
|
ColisionPoints[] collide1 = getCollidePointsAABBCenteredWithOBB(box2.narrowPhaseHalfSize, box1.narrowPhaseHalfSize, quatTransfer2, quat2.inverseNew().getMatrix4().multiply(rPos1));
|
||||||
box1.colisionPointTest = collide1;
|
|
||||||
// transfer detection point collision in global environement:
|
// transfer detection point collision in global environement:
|
||||||
if (collide1 != null) {
|
if (collide1 != null) {
|
||||||
for (int iii = 0; iii < collide1.length; iii++) {
|
for (int iii = 0; iii < collide1.length; iii++) {
|
||||||
collide1[iii].position = quat1.multiply(collide1[iii].position).add(box1.narrowPhaseGlobalPos);
|
collide1[iii].position = quat1.multiply(collide1[iii].position).add(box1.narrowPhaseGlobalPos);
|
||||||
|
collide1[iii].force = quat2.multiply(collide1[iii].force);//.add(box1.narrowPhaseGlobalPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* res = trensfert in generic plan the new res ... */
|
/* res = trensfert in generic plan the new res ... */
|
||||||
@ -157,12 +157,21 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
LoxelApplication.box1HalfSize = box1.narrowPhaseHalfSize;
|
LoxelApplication.box1HalfSize = box1.narrowPhaseHalfSize;
|
||||||
LoxelApplication.box2HalfSize = box2.narrowPhaseHalfSize;
|
LoxelApplication.box2HalfSize = box2.narrowPhaseHalfSize;
|
||||||
ColisionPoints[] collide2 = getCollidePointsAABBCenteredWithOBB(box1.narrowPhaseHalfSize, box2.narrowPhaseHalfSize, quatTransfer1, quat1.inverseNew().getMatrix4().multiply(rPos2));
|
ColisionPoints[] collide2 = getCollidePointsAABBCenteredWithOBB(box1.narrowPhaseHalfSize, box2.narrowPhaseHalfSize, quatTransfer1, quat1.inverseNew().getMatrix4().multiply(rPos2));
|
||||||
box2.colisionPointTest = collide2;
|
|
||||||
if (collide2 != null) {
|
if (collide2 != null) {
|
||||||
for (int iii = 0; iii < collide2.length; iii++) {
|
for (int iii = 0; iii < collide2.length; iii++) {
|
||||||
collide2[iii].position = quat2.multiply(collide2[iii].position).add(box2.narrowPhaseGlobalPos);
|
collide2[iii].position = quat2.multiply(collide2[iii].position).add(box2.narrowPhaseGlobalPos);
|
||||||
|
collide2[iii].force = quat1.multiply(collide2[iii].force);//.add(box2.narrowPhaseGlobalPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// add only if NOT static, when static no colision is performed
|
||||||
|
if (true) { //!isStatic1) {
|
||||||
|
Collision colision = new Collision(collide1, box2, collide2, isStatic2);
|
||||||
|
box1.addColision(colision);
|
||||||
|
}
|
||||||
|
if (true) { //!isStatic1) {
|
||||||
|
Collision colision = new Collision(collide2, box1, collide1, isStatic1);
|
||||||
|
box2.addColision(colision);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,13 +282,15 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
}
|
}
|
||||||
if (count != 0) {
|
if (count != 0) {
|
||||||
// Find a point inside the BOX ...
|
// Find a point inside the BOX ...
|
||||||
|
/*
|
||||||
Log.info("Detect point inside ... " + insideTopBackRight + " " + insideTopBackLeft + " " + insideTopFrontRight + " " + insideTopFrontLeft + " " + insideBottomBackRight + " "
|
Log.info("Detect point inside ... " + insideTopBackRight + " " + insideTopBackLeft + " " + insideTopFrontRight + " " + insideTopFrontLeft + " " + insideBottomBackRight + " "
|
||||||
+ insideBottomBackLeft + " " + insideBottomFrontRight + " " + insideBottomFrontLeft);
|
+ insideBottomBackLeft + " " + insideBottomFrontRight + " " + insideBottomFrontLeft);
|
||||||
|
*/
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
// line in AABB
|
// line in AABB
|
||||||
Log.info("Need to detect line inside ...");
|
// TODO:
|
||||||
|
// Log.info("Need to detect line inside ..."); // pas tot a fait... si ca colisione déja avec un point de l'autre ...
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,46 +305,61 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
Vector3f out = new Vector3f();
|
Vector3f out = new Vector3f();
|
||||||
if (point.x < 0) {
|
if (point.x < 0) {
|
||||||
if (point.x > -halfSize.x) {
|
if (point.x > -halfSize.x) {
|
||||||
out.x = -halfSize.x + point.x;
|
|
||||||
|
out.x = -(halfSize.x + point.x);
|
||||||
|
|
||||||
|
//out.x = -halfSize.x - point.x;
|
||||||
|
//out.x = -halfSize.x + point.x;
|
||||||
|
//out.x = + point.x;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (point.x < halfSize.x) {
|
if (point.x < halfSize.x) {
|
||||||
|
//out.x = halfSize.x + point.x;
|
||||||
out.x = halfSize.x - point.x;
|
out.x = halfSize.x - point.x;
|
||||||
|
//out.x = - point.x;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (point.y < 0) {
|
if (point.y < 0) {
|
||||||
if (point.y > -halfSize.y) {
|
if (point.y > -halfSize.y) {
|
||||||
out.y = -halfSize.y + point.y;
|
out.y = -halfSize.y - point.y;
|
||||||
|
//out.y = -halfSize.y + point.y;
|
||||||
|
//out.y = point.y;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (point.y < halfSize.y) {
|
if (point.y < halfSize.y) {
|
||||||
|
//out.y = halfSize.y + point.y;
|
||||||
out.y = halfSize.y - point.y;
|
out.y = halfSize.y - point.y;
|
||||||
|
//out.y = - point.y;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (point.z < 0) {
|
if (point.z < 0) {
|
||||||
if (point.z > -halfSize.z) {
|
if (point.z > -halfSize.z) {
|
||||||
out.z = -halfSize.z + point.z;
|
out.z = -halfSize.z - point.z;
|
||||||
|
//out.z = -halfSize.z + point.z;
|
||||||
|
//out.z = + point.z;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (point.z < halfSize.z) {
|
if (point.z < halfSize.z) {
|
||||||
|
//out.z = halfSize.z + point.z;
|
||||||
out.z = halfSize.z - point.z;
|
out.z = halfSize.z - point.z;
|
||||||
|
//out.z = - point.z;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (out.x < out.y) {
|
if (Math.abs(out.x) < Math.abs(out.y)) {
|
||||||
out.y = 0;
|
out.y = 0;
|
||||||
if (out.x < out.z) {
|
if (Math.abs(out.x) < Math.abs(out.z)) {
|
||||||
out.z = 0;
|
out.z = 0;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@ -341,7 +367,7 @@ public class ToolCollisionOBBWithOBB {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
out.x = 0;
|
out.x = 0;
|
||||||
if (out.y < out.z) {
|
if (Math.abs(out.y) < Math.abs(out.z)) {
|
||||||
out.z = 0;
|
out.z = 0;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -184,6 +184,26 @@ public class LoxelApplication extends Application {
|
|||||||
Entity localBox = new Entity(this.env);
|
Entity localBox = new Entity(this.env);
|
||||||
Quaternion transform = new Quaternion(0.5f,0.2f,0.4f,1);
|
Quaternion transform = new Quaternion(0.5f,0.2f,0.4f,1);
|
||||||
transform.normalize();
|
transform.normalize();
|
||||||
|
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(15,15,14), transform)));
|
||||||
|
localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj")));
|
||||||
|
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png")));
|
||||||
|
localBox.addComponent(new ComponentRenderTexturedStaticMesh(
|
||||||
|
new Uri("DATA", "basic.vert"),
|
||||||
|
new Uri("DATA", "basic.frag")));
|
||||||
|
ComponentPhysics physics2 = new ComponentPhysics(true);
|
||||||
|
PhysicBox box2 = new PhysicBox();
|
||||||
|
box2.setSize(new Vector3f(8,8,8));
|
||||||
|
box2.setOrigin(new Vector3f(0,0,0));
|
||||||
|
box2.setMass(1);
|
||||||
|
physics2.addShape(box2);
|
||||||
|
localBox.addComponent(physics2);
|
||||||
|
env.addEntity(localBox);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// add a cube to test collision ...
|
||||||
|
Entity localBox = new Entity(this.env);
|
||||||
|
Quaternion transform = new Quaternion(0.3f,0.3f,0.4f,1);
|
||||||
|
transform.normalize();
|
||||||
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(2,-2,14.2f),transform)));
|
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(2,-2,14.2f),transform)));
|
||||||
localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj")));
|
localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj")));
|
||||||
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png")));
|
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png")));
|
||||||
|
@ -5,7 +5,7 @@ import org.atriasoft.gale.Gale;
|
|||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
Uri.setGroup("DATA", "src/org/atriasoft/gameengine/sample/lowPoly/");
|
Uri.setGroup("DATA", "src/org/atriasoft/gameengine/samples/lowPoly/");
|
||||||
Uri.setGroup("DATA_EGE", "src/org/atriasoft/gameengine/data/");
|
Uri.setGroup("DATA_EGE", "src/org/atriasoft/gameengine/data/");
|
||||||
Uri.setGroup("RES", "res");
|
Uri.setGroup("RES", "res");
|
||||||
Gale.run(new LowPolyApplication(), args);
|
Gale.run(new LowPolyApplication(), args);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user