[DEV] collide sphere with triangle and sphere with triangle is good ==> need to add friction to stop object
This commit is contained in:
parent
4b24223561
commit
1ecc20a08c
@ -262,17 +262,23 @@ public class LoxelApplicationPerso extends GaleApplication {
|
|||||||
// env.addEntity(localBox);
|
// env.addEntity(localBox);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (true) {
|
if (!this.disable) {
|
||||||
// add a cube to test collision ...
|
// add a cube to test collision ...
|
||||||
final Entity localBox = new Entity(this.env);
|
final Entity localBox = new Entity(this.env);
|
||||||
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", "loxelEngine")));
|
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png", "loxelEngine")));
|
||||||
localBox.addComponent(new ComponentLight(new Light(new Color(0.0f, 1.0f, 0.0f), new Vector3f(0, 0, 0), new Vector3f(0.8f, 0.03f, 0.002f))));
|
localBox.addComponent(new ComponentLight(new Light(new Color(0.0f, 1.0f, 0.0f), new Vector3f(0, 0, 0), new Vector3f(0.8f, 0.03f, 0.002f))));
|
||||||
localBox.addComponent(new ComponentRenderTexturedStaticMesh(new Uri("DATA", "basic.vert", "loxelEngine"), new Uri("DATA", "basic.frag", "loxelEngine")));
|
localBox.addComponent(new ComponentRenderTexturedStaticMesh(new Uri("DATA", "basic.vert", "loxelEngine"), new Uri("DATA", "basic.frag", "loxelEngine")));
|
||||||
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(0, 4, 0))));
|
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(0, 3, 0))));
|
||||||
final ComponentPhysicsPerso physics2 = new ComponentPhysicsPerso(this.env);
|
final ComponentPhysicsPerso physics2 = new ComponentPhysicsPerso(this.env);
|
||||||
final PhysicTriangle box2 = new PhysicTriangle();
|
physics2.setBodyType(PhysicBodyType.BODY_STATIC);
|
||||||
box2.setPoints(new Vector3f(2, 0, 0), new Vector3f(0, 2, 0), new Vector3f(3, 3, 2));
|
PhysicTriangle box2 = new PhysicTriangle();
|
||||||
|
box2.setPoints(new Vector3f(4, 0, 0), new Vector3f(0, 4, 0), new Vector3f(-2, -2, 1));
|
||||||
|
box2.setOrigin(new Vector3f(0, 0, 0));
|
||||||
|
box2.setMass(0);
|
||||||
|
physics2.addShape(box2);
|
||||||
|
box2 = new PhysicTriangle();
|
||||||
|
box2.setPoints(new Vector3f(4, 0, 0), new Vector3f(0, 4, 0), new Vector3f(6, 6, 0));
|
||||||
box2.setOrigin(new Vector3f(0, 0, 0));
|
box2.setOrigin(new Vector3f(0, 0, 0));
|
||||||
box2.setMass(0);
|
box2.setMass(0);
|
||||||
physics2.addShape(box2);
|
physics2.addShape(box2);
|
||||||
@ -286,9 +292,28 @@ public class LoxelApplicationPerso extends GaleApplication {
|
|||||||
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png", "loxelEngine")));
|
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png", "loxelEngine")));
|
||||||
localBox.addComponent(new ComponentLight(new Light(new Color(0.0f, 1.0f, 0.0f), new Vector3f(0, 0, 0), new Vector3f(0.8f, 0.03f, 0.002f))));
|
localBox.addComponent(new ComponentLight(new Light(new Color(0.0f, 1.0f, 0.0f), new Vector3f(0, 0, 0), new Vector3f(0.8f, 0.03f, 0.002f))));
|
||||||
localBox.addComponent(new ComponentRenderTexturedStaticMesh(new Uri("DATA", "basic.vert", "loxelEngine"), new Uri("DATA", "basic.frag", "loxelEngine")));
|
localBox.addComponent(new ComponentRenderTexturedStaticMesh(new Uri("DATA", "basic.vert", "loxelEngine"), new Uri("DATA", "basic.frag", "loxelEngine")));
|
||||||
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(1, 5, 4))));
|
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(1.1f, 5.1f, 1.0f), Quaternion.fromEulerAngles(new Vector3f(0.15f, 0.95f, 0.3f)))));
|
||||||
final ComponentPhysicsPerso physics2 = new ComponentPhysicsPerso(this.env);
|
final ComponentPhysicsPerso physics2 = new ComponentPhysicsPerso(this.env);
|
||||||
final PhysicSphere box2 = new PhysicSphere();
|
final PhysicSphere box2 = new PhysicSphere();
|
||||||
|
physics2.setBodyType(PhysicBodyType.BODY_STATIC);
|
||||||
|
box2.setSize(1.0f);
|
||||||
|
box2.setOrigin(new Vector3f(0, 0, 0));
|
||||||
|
box2.setMass(0);
|
||||||
|
physics2.addShape(box2);
|
||||||
|
localBox.addComponent(physics2);
|
||||||
|
this.env.addEntity(localBox);
|
||||||
|
}
|
||||||
|
if (true) {
|
||||||
|
// add a cube to test collision ...
|
||||||
|
final Entity localBox = new Entity(this.env);
|
||||||
|
localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj")));
|
||||||
|
localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png", "loxelEngine")));
|
||||||
|
localBox.addComponent(new ComponentLight(new Light(new Color(0.0f, 1.0f, 0.0f), new Vector3f(0, 0, 0), new Vector3f(0.8f, 0.03f, 0.002f))));
|
||||||
|
localBox.addComponent(new ComponentRenderTexturedStaticMesh(new Uri("DATA", "basic.vert", "loxelEngine"), new Uri("DATA", "basic.frag", "loxelEngine")));
|
||||||
|
localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(1, 5, 4), Quaternion.fromEulerAngles(new Vector3f(0.15f, 0.95f, 0.3f)))));
|
||||||
|
final ComponentPhysicsPerso physics2 = new ComponentPhysicsPerso(this.env);
|
||||||
|
physics2.setBodyType(PhysicBodyType.BODY_DYNAMIC);
|
||||||
|
final PhysicSphere box2 = new PhysicSphere();
|
||||||
box2.setSize(1.0f);
|
box2.setSize(1.0f);
|
||||||
box2.setOrigin(new Vector3f(0, 0, 0));
|
box2.setOrigin(new Vector3f(0, 0, 0));
|
||||||
box2.setMass(1);
|
box2.setMass(1);
|
||||||
|
@ -333,9 +333,13 @@ public class Environement {
|
|||||||
this.startTime = System.nanoTime();
|
this.startTime = System.nanoTime();
|
||||||
this.lastCallTime = this.startTime;
|
this.lastCallTime = this.startTime;
|
||||||
}
|
}
|
||||||
final long lastUpdate = this.lastCallTime;
|
long lastUpdate = this.lastCallTime;
|
||||||
this.lastCallTime = System.nanoTime();
|
this.lastCallTime = System.nanoTime();
|
||||||
Clock currentClock = Clock.systemUTC();
|
Clock currentClock = Clock.systemUTC();
|
||||||
|
// in the simulation, we need to limit the delta...
|
||||||
|
if (this.lastCallTime - lastUpdate > 1000000000) {
|
||||||
|
lastUpdate = this.lastCallTime - 5100000;
|
||||||
|
}
|
||||||
final EventTime event = new EventTime(currentClock, this.startClock, this.lastCallTime, this.startTime, Duration.ofNanos(this.lastCallTime - lastUpdate),
|
final EventTime event = new EventTime(currentClock, this.startClock, this.lastCallTime, this.startTime, Duration.ofNanos(this.lastCallTime - lastUpdate),
|
||||||
Duration.ofNanos(this.lastCallTime - lastUpdate));
|
Duration.ofNanos(this.lastCallTime - lastUpdate));
|
||||||
for (final ControlInterface elem : this.controls) {
|
for (final ControlInterface elem : this.controls) {
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package org.atriasoft.ege.components;
|
package org.atriasoft.ege.components;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import org.atriasoft.ege.Component;
|
import org.atriasoft.ege.Component;
|
||||||
import org.atriasoft.ege.Environement;
|
import org.atriasoft.ege.Environement;
|
||||||
@ -29,11 +32,10 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
public static float globalMaxSpeed = Float.MAX_VALUE;
|
public static float globalMaxSpeed = Float.MAX_VALUE;
|
||||||
private AABB aabb;
|
private AABB aabb;
|
||||||
private List<ComponentPhysicsPerso> aabbIntersection = new ArrayList<>();
|
private List<ComponentPhysicsPerso> aabbIntersection = new ArrayList<>();
|
||||||
private List<ComponentPhysicsPerso> narrowIntersection = new ArrayList<>();
|
private Map<ComponentPhysicsPerso, List<ColisionPoint>> narrowIntersection = new HashMap<>();
|
||||||
List<ColisionPoint> collisionPoints = new ArrayList<>();
|
//List<ColisionPoint> collisionPoints = new ArrayList<>();
|
||||||
private List<PhysicShape> shapes = new ArrayList<>();
|
private List<PhysicShape> shapes = new ArrayList<>();
|
||||||
private ComponentPosition position;
|
private ComponentPosition position;
|
||||||
private boolean staticObject = false;
|
|
||||||
private boolean manageGravity = true;
|
private boolean manageGravity = true;
|
||||||
private float maxSpeed = globalMaxSpeed;
|
private float maxSpeed = globalMaxSpeed;
|
||||||
// current speed of the object
|
// current speed of the object
|
||||||
@ -44,6 +46,8 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
private Vector3f staticForce = new Vector3f(0, 0, 0);
|
private Vector3f staticForce = new Vector3f(0, 0, 0);
|
||||||
// Apply dynamic force on it
|
// Apply dynamic force on it
|
||||||
private Vector3f dynamicForce = new Vector3f(0, 0, 0);
|
private Vector3f dynamicForce = new Vector3f(0, 0, 0);
|
||||||
|
// Apply dynamic force on it
|
||||||
|
private Vector3f dynamicForceGlobal = new Vector3f(0, 0, 0);
|
||||||
private EnginePhysicsPerso engine;
|
private EnginePhysicsPerso engine;
|
||||||
private PhysicBodyType bodyType;
|
private PhysicBodyType bodyType;
|
||||||
|
|
||||||
@ -75,37 +79,51 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void applyColisionForce() {
|
public void applyColisionForce() {
|
||||||
for (ColisionPoint impact : this.collisionPoints) {
|
Vector3f globalForce = Vector3f.ZERO;
|
||||||
this.position.applyForce(impact.force);
|
for (Entry<ComponentPhysicsPerso, List<ColisionPoint>> elem : this.narrowIntersection.entrySet()) {
|
||||||
|
for (ColisionPoint impact : elem.getValue()) {
|
||||||
|
globalForce = globalForce.add(impact.force);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// this force is not depending on the mass...
|
||||||
|
this.speed = this.speed.add(globalForce);
|
||||||
|
this.position.applyForce(globalForce);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyForces(float timeStep, EngineGravity gravity) {
|
public void applyForces(float timeStep, EngineGravity gravity) {
|
||||||
// get the gravity at the specific position...
|
// get the gravity at the specific position...
|
||||||
Vector3f gravityForce;
|
Vector3f gravityAcceleration;
|
||||||
if (this.manageGravity) {
|
if (this.manageGravity) {
|
||||||
gravityForce = gravity.getGravityAtPosition(this.position.getTransform().getPosition()).multiply(timeStep);
|
gravityAcceleration = gravity.getGravityAtPosition(this.position.getTransform().getPosition());
|
||||||
} else {
|
} else {
|
||||||
gravityForce = new Vector3f(0, 0, 0);
|
gravityAcceleration = new Vector3f(0, 0, 0);
|
||||||
}
|
}
|
||||||
// apply this force on the Object
|
// apply this force on the Object
|
||||||
Log.info("apply gravity: " + gravityForce);
|
Log.info("apply gravity: " + gravityAcceleration);
|
||||||
// relative to the object
|
// relative to the object
|
||||||
Vector3f staticForce = this.staticForce.multiply(timeStep);
|
Vector3f staticForce = this.staticForce;
|
||||||
float globalMass = 0;
|
float globalMass = 0;
|
||||||
for (PhysicShape shape : this.shapes) {
|
for (PhysicShape shape : this.shapes) {
|
||||||
globalMass += shape.getMass();
|
globalMass += shape.getMass();
|
||||||
}
|
}
|
||||||
// note the acceleration is not real, it depend on the current delta time...
|
// note the acceleration is not real, it depend on the current delta time...
|
||||||
this.acceleration = gravityForce.add(this.position.getTransform().getOrientation().multiply(staticForce)).add(this.position.getTransform().getOrientation().multiply(this.dynamicForce))
|
Vector3f staticforceOriented = this.position.getTransform().getOrientation().multiply(staticForce);
|
||||||
.multiply(globalMass);
|
Vector3f dynamicforceOriented = this.position.getTransform().getOrientation().multiply(this.dynamicForce);
|
||||||
this.dynamicForce = new Vector3f(0, 0, 0);
|
Vector3f globalForce = staticforceOriented.add(dynamicforceOriented);
|
||||||
this.speed = this.speed.add(this.acceleration);
|
if (globalMass > 0.0) {
|
||||||
|
globalForce = globalForce.divide(globalMass);
|
||||||
|
} else {
|
||||||
|
gravityAcceleration = Vector3f.ZERO;
|
||||||
|
}
|
||||||
|
if (this.bodyType != PhysicBodyType.BODY_DYNAMIC) {
|
||||||
|
gravityAcceleration = Vector3f.ZERO;
|
||||||
|
}
|
||||||
|
this.acceleration = gravityAcceleration.add(globalForce);
|
||||||
|
this.speed = this.speed.add(this.acceleration.multiply(timeStep));
|
||||||
limitWithMaxSpeed();
|
limitWithMaxSpeed();
|
||||||
Log.info("apply acceleration: " + this.acceleration);
|
Log.info("apply acceleration: " + this.acceleration);
|
||||||
Log.info("apply speed: " + this.speed);
|
Log.info("apply speed: " + this.speed);
|
||||||
this.position.setTransform(this.position.getTransform().withPosition(this.position.getTransform().getPosition().add(this.speed.multiply(timeStep))));
|
this.position.setTransform(this.position.getTransform().withPosition(this.position.getTransform().getPosition().add(this.speed)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkCollide(PhysicShape shapeCurrent) {
|
private boolean checkCollide(PhysicShape shapeCurrent) {
|
||||||
@ -175,7 +193,7 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkNarrowCollision() {
|
public boolean checkNarrowCollision() {
|
||||||
if (this.staticObject) {
|
if (this.bodyType != PhysicBodyType.BODY_DYNAMIC) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (ComponentPhysicsPerso elem : this.aabbIntersection) {
|
for (ComponentPhysicsPerso elem : this.aabbIntersection) {
|
||||||
@ -187,8 +205,12 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (collide) {
|
if (collide) {
|
||||||
this.narrowIntersection.add(elem);
|
if (!this.narrowIntersection.containsKey(elem)) {
|
||||||
elem.narrowIntersection.add(this);
|
this.narrowIntersection.put(elem, new ArrayList<>());
|
||||||
|
}
|
||||||
|
if (!elem.narrowIntersection.containsKey(this)) {
|
||||||
|
elem.narrowIntersection.put(this, new ArrayList<>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return isNarrowCollide();
|
return isNarrowCollide();
|
||||||
@ -199,7 +221,6 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void clearPreviousCollision() {
|
public void clearPreviousCollision() {
|
||||||
this.collisionPoints.clear();
|
|
||||||
this.aabbIntersection.clear();
|
this.aabbIntersection.clear();
|
||||||
this.narrowIntersection.clear();
|
this.narrowIntersection.clear();
|
||||||
}
|
}
|
||||||
@ -259,16 +280,12 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isNarrowCollide() {
|
public boolean isNarrowCollide() {
|
||||||
if (this.narrowIntersection.size() == 0) {
|
if (this.narrowIntersection.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isStaticObject() {
|
|
||||||
return this.staticObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void limitWithMaxSpeed() {
|
private void limitWithMaxSpeed() {
|
||||||
if (this.speed.length2() > this.maxSpeed * this.maxSpeed) {
|
if (this.speed.length2() > this.maxSpeed * this.maxSpeed) {
|
||||||
this.speed = this.speed.safeNormalize().multiply(this.maxSpeed);
|
this.speed = this.speed.safeNormalize().multiply(this.maxSpeed);
|
||||||
@ -276,14 +293,13 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void narrowCollisionCreateContactAndForce() {
|
public void narrowCollisionCreateContactAndForce() {
|
||||||
|
if (this.bodyType != PhysicBodyType.BODY_DYNAMIC) {
|
||||||
if (this.staticObject) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.narrowIntersection.size() == 0) {
|
if (this.narrowIntersection.size() == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (ComponentPhysicsPerso elem : this.narrowIntersection) {
|
for (Entry<ComponentPhysicsPerso, List<ColisionPoint>> elem : this.narrowIntersection.entrySet()) {
|
||||||
for (PhysicShape shapeCurrent : this.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 ...
|
||||||
/*
|
/*
|
||||||
@ -291,8 +307,8 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
List<ColisionPoint> points = elem.getCollidePoints(shapeCurrent);
|
List<ColisionPoint> points = elem.getKey().getCollidePoints(shapeCurrent);
|
||||||
this.collisionPoints.addAll(points);
|
elem.getValue().addAll(points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -305,8 +321,10 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
public void renderDebug(ResourceColored3DObject debugDrawProperty) {
|
public void renderDebug(ResourceColored3DObject debugDrawProperty) {
|
||||||
Color displayColor;
|
Color displayColor;
|
||||||
displayColor = new Color(1.0f, 0.0f, 0.0f, 1.0f);
|
displayColor = new Color(1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
for (ColisionPoint impact : this.collisionPoints) {
|
for (Entry<ComponentPhysicsPerso, List<ColisionPoint>> elem : this.narrowIntersection.entrySet()) {
|
||||||
debugDrawProperty.drawSquare(new Vector3f(0.02f, 0.02f, 0.02f), Matrix4f.createMatrixTranslate(impact.position), displayColor);
|
for (ColisionPoint impact : elem.getValue()) {
|
||||||
|
debugDrawProperty.drawSquare(new Vector3f(0.02f, 0.02f, 0.02f), Matrix4f.createMatrixTranslate(impact.position), displayColor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (this.aabbIntersection.size() == 0) {
|
if (this.aabbIntersection.size() == 0) {
|
||||||
displayColor = new Color(1.0f, 1.0f, 1.0f, 1.0f);
|
displayColor = new Color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
@ -342,10 +360,6 @@ public class ComponentPhysicsPerso extends Component {
|
|||||||
this.maxSpeed = maxSpeed;
|
this.maxSpeed = maxSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStaticObject(boolean staticObject) {
|
|
||||||
this.staticObject = staticObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateAABB() {
|
public void updateAABB() {
|
||||||
|
|
||||||
if (this.position == null) {
|
if (this.position == null) {
|
||||||
|
@ -10,12 +10,14 @@ import org.atriasoft.etk.math.Vector3f;
|
|||||||
public class ComponentPosition extends Component implements PositionningInterface {
|
public class ComponentPosition extends Component implements PositionningInterface {
|
||||||
public final Signal<Transform3D> signalPosition = new Signal<>();
|
public final Signal<Transform3D> signalPosition = new Signal<>();
|
||||||
protected Transform3D transform;
|
protected Transform3D transform;
|
||||||
|
//protected Vector3f speed;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a basic position component (no orientation and position (0,0,0))
|
* Create a basic position component (no orientation and position (0,0,0))
|
||||||
*/
|
*/
|
||||||
public ComponentPosition() {
|
public ComponentPosition() {
|
||||||
this.transform = Transform3D.IDENTITY;
|
this.transform = Transform3D.IDENTITY;
|
||||||
|
//this.speed = Vector3f.ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,6 +39,10 @@ public class ComponentPosition extends Component implements PositionningInterfac
|
|||||||
this.transform = this.transform.withPosition(this.transform.getPosition().add(force));
|
this.transform = this.transform.withPosition(this.transform.getPosition().add(force));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//public Vector3f getSpeed() {
|
||||||
|
// return this.speed;
|
||||||
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set a new transformation
|
* set a new transformation
|
||||||
* @return Transformation of the position
|
* @return Transformation of the position
|
||||||
@ -51,6 +57,10 @@ public class ComponentPosition extends Component implements PositionningInterfac
|
|||||||
return "position";
|
return "position";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//public void setSpeed(Vector3f speed) {
|
||||||
|
// this.speed = speed;
|
||||||
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set a new transformation
|
* set a new transformation
|
||||||
* @param transform transformation of the position
|
* @param transform transformation of the position
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package org.atriasoft.ege.components;
|
package org.atriasoft.ege.components;
|
||||||
|
|
||||||
public enum PhysicBodyType {
|
public enum PhysicBodyType {
|
||||||
BODY_DYNAMIC,
|
BODY_DYNAMIC, // mobile object that move and interact with other (42)
|
||||||
BODY_STATIC,
|
BODY_STATIC, // static object that does not move (map, wall)
|
||||||
BODY_KINEMATIC,
|
BODY_KINEMATIC // static object that can change position by the user (like doors, lift ...)
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
package org.atriasoft.ege.engines;
|
package org.atriasoft.ege.engines;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.atriasoft.ege.internal.Log;
|
|
||||||
import org.atriasoft.ege.Component;
|
import org.atriasoft.ege.Component;
|
||||||
import org.atriasoft.ege.Engine;
|
import org.atriasoft.ege.Engine;
|
||||||
import org.atriasoft.ege.Environement;
|
import org.atriasoft.ege.Environement;
|
||||||
@ -12,58 +12,59 @@ import org.atriasoft.ege.components.ComponentAI;
|
|||||||
|
|
||||||
public class EngineAI extends Engine {
|
public class EngineAI extends Engine {
|
||||||
public static final String ENGINE_NAME = "ia";
|
public static final String ENGINE_NAME = "ia";
|
||||||
private float accumulator = 0;
|
|
||||||
private static final float TIME_STEP = 5.0f;
|
private static final float TIME_STEP = 5.0f;
|
||||||
private final List<ComponentAI> components = new ArrayList<ComponentAI>();
|
private float accumulator = 0;
|
||||||
|
private final List<ComponentAI> components = new ArrayList<>();
|
||||||
|
|
||||||
public EngineAI(Environement env) {
|
public EngineAI(Environement env) {
|
||||||
super(env);
|
super(env);
|
||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void componentRemove(Component ref) {
|
|
||||||
components.remove(ref);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void componentAdd(Component ref) {
|
public void componentAdd(Component ref) {
|
||||||
if (!(ref instanceof ComponentAI)) {
|
if (!(ref instanceof ComponentAI)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
components.add((ComponentAI)ref);
|
this.components.add((ComponentAI) ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(long deltaMili) {
|
public void componentRemove(Component ref) {
|
||||||
// Add the time difference in the accumulator
|
this.components.remove(ref);
|
||||||
accumulator += (float)deltaMili*0.0001f;
|
|
||||||
// While there is enough accumulated time to take one or several physics steps
|
|
||||||
while (accumulator >= TIME_STEP) {
|
|
||||||
//Log.warning("AI: Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
|
||||||
// call every object to usdate their constant forces applyed
|
|
||||||
for (ComponentAI it: components) {
|
|
||||||
it.update(TIME_STEP);
|
|
||||||
}
|
|
||||||
// Decrease the accumulated time
|
|
||||||
accumulator -= TIME_STEP;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void render(long deltaMili, Camera camera) {
|
|
||||||
// nothing to do ...
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void renderDebug(long deltaMili, Camera camera) {
|
|
||||||
// nothing to do ...
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType() {
|
public String getType() {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return ENGINE_NAME;
|
return ENGINE_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(long deltaMili, Camera camera) {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderDebug(long deltaMili, Camera camera) {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(long deltaMili) {
|
||||||
|
// Add the time difference in the accumulator
|
||||||
|
this.accumulator += deltaMili * 0.0001f;
|
||||||
|
// While there is enough accumulated time to take one or several physics steps
|
||||||
|
while (this.accumulator >= TIME_STEP) {
|
||||||
|
//Log.warning("AI: Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
||||||
|
// call every object to usdate their constant forces applyed
|
||||||
|
for (ComponentAI it : this.components) {
|
||||||
|
it.update(TIME_STEP);
|
||||||
|
}
|
||||||
|
// Decrease the accumulated time
|
||||||
|
this.accumulator -= TIME_STEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import org.atriasoft.ege.Engine;
|
|||||||
import org.atriasoft.ege.Environement;
|
import org.atriasoft.ege.Environement;
|
||||||
import org.atriasoft.ege.camera.Camera;
|
import org.atriasoft.ege.camera.Camera;
|
||||||
import org.atriasoft.ege.components.ComponentPhysicsPerso;
|
import org.atriasoft.ege.components.ComponentPhysicsPerso;
|
||||||
|
import org.atriasoft.ege.components.PhysicBodyType;
|
||||||
import org.atriasoft.ege.internal.Log;
|
import org.atriasoft.ege.internal.Log;
|
||||||
import org.atriasoft.gale.resource.ResourceColored3DObject;
|
import org.atriasoft.gale.resource.ResourceColored3DObject;
|
||||||
import org.atriasoft.phyligram.DebugDisplay;
|
import org.atriasoft.phyligram.DebugDisplay;
|
||||||
@ -149,6 +150,9 @@ public class EnginePhysicsPerso extends Engine {
|
|||||||
AABB currentAABB = current.getAABB();
|
AABB currentAABB = current.getAABB();
|
||||||
for (int jjj = iii + 1; jjj < this.components.size(); jjj++) {
|
for (int jjj = iii + 1; jjj < this.components.size(); jjj++) {
|
||||||
ComponentPhysicsPerso remote = this.components.get(jjj);
|
ComponentPhysicsPerso remote = this.components.get(jjj);
|
||||||
|
if (current.getBodyType() != PhysicBodyType.BODY_DYNAMIC && remote.getBodyType() != PhysicBodyType.BODY_DYNAMIC) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// prefer checking the collision, this a time-constant operation, check if collision already exist is a unpredictable time.
|
// prefer checking the collision, this a time-constant operation, check if collision already exist is a unpredictable time.
|
||||||
if (currentAABB.intersect(this.components.get(jjj).getAABB()) == true) {
|
if (currentAABB.intersect(this.components.get(jjj).getAABB()) == true) {
|
||||||
current.addIntersection(remote);
|
current.addIntersection(remote);
|
||||||
|
@ -15,13 +15,16 @@ public class ToolCollisionSphereWithSphere {
|
|||||||
Vector3f impact = force.multiply(shapeReference.getSize());
|
Vector3f impact = force.multiply(shapeReference.getSize());
|
||||||
force = force.multiply(distance);
|
force = force.multiply(distance);
|
||||||
force = force.multiply(sphere1.getSize() + distance);
|
force = force.multiply(sphere1.getSize() + distance);
|
||||||
return new ColisionPoint(impact, force);
|
// set relative impact position:
|
||||||
|
//return new ColisionPoint(impact, force);
|
||||||
|
// set global position
|
||||||
|
return new ColisionPoint(shapeReference.narrowPhaseGlobalPos.add(impact), force);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note sphere 2 is the reference ...
|
// Note sphere 2 is the reference ...
|
||||||
public static boolean testCollide(PhysicSphere sphere1, PhysicSphere shapeReference) {
|
public static boolean testCollide(PhysicSphere sphere1, PhysicSphere shapeReference) {
|
||||||
float distance1 = sphere1.narrowPhaseGlobalPos.distance2(shapeReference.narrowPhaseGlobalPos);
|
float distance1 = sphere1.narrowPhaseGlobalPos.distance2(shapeReference.narrowPhaseGlobalPos);
|
||||||
float distance2 = sphere1.getSize() * shapeReference.getSize();
|
float distance2 = sphere1.getSize() + shapeReference.getSize();
|
||||||
distance2 = distance2 * distance2;
|
distance2 = distance2 * distance2;
|
||||||
return distance1 <= distance2;
|
return distance1 <= distance2;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ public class ToolCollisionSphereWithTriangle {
|
|||||||
if (distance < 0) {
|
if (distance < 0) {
|
||||||
force = force.multiply(-(sphere1.getSize() + distance));
|
force = force.multiply(-(sphere1.getSize() + distance));
|
||||||
} else {
|
} else {
|
||||||
force = force.multiply(-(sphere1.getSize() + distance));
|
force = force.multiply(sphere1.getSize() - distance);
|
||||||
}
|
}
|
||||||
return new ColisionPoint(impact, force);
|
return new ColisionPoint(impact, force);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user