diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index abef6f4..d8b7bba 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -2,5 +2,6 @@ encoding//src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/ModelFactory.java=UTF-8 encoding//src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/Quaternion3D.java=UTF-8 encoding//src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/Universe.java=UTF-8 +encoding//src/main/java/org/ntlab/radishforandroidstudio/framework/physics/PhysicsUtility.java=UTF-8 encoding//src/main/java/org/ntlab/radishforandroidstudio/java3d/AxisAngle4d.java=UTF-8 encoding//src/main/java/org/ntlab/radishforandroidstudio/java3d/Box.java=UTF-8 diff --git a/src/main/java/cactusServer/entities/Character.java b/src/main/java/cactusServer/entities/Character.java index b3f7ac6..ec3533c 100644 --- a/src/main/java/cactusServer/entities/Character.java +++ b/src/main/java/cactusServer/entities/Character.java @@ -2,8 +2,11 @@ import java.util.HashMap; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; +import org.ntlab.radishforandroidstudio.java3d.Box; +import org.ntlab.radishforandroidstudio.java3d.Primitive; import cactusServer.models.Instances; import cactusServer.utils.RandomStringGenerator; @@ -16,6 +19,8 @@ private Position3D position; private Quaternion3D angle; private int modelID; + private Primitive prim; + private Object3D object; private HashMap itemMap = new HashMap<>(); @JSONHint(ignore = true) @@ -33,6 +38,8 @@ setAngle(angle); setModelID(modelID); initAreaURI(instanceId); + setPrim(new Box()); + setObject(new Object3D("",prim)); } public String getAccountURI() { @@ -170,4 +177,20 @@ public Item destroyItem(String itemId) { return itemMap.remove(itemId); } + + public Primitive getPrim() { + return prim; + } + + public void setPrim(Primitive prim) { + this.prim = prim; + } + + public Object3D getObject() { + return object; + } + + public void setObject(Object3D object) { + this.object = object; + } } diff --git a/src/main/java/cactusServer/entities/Object.java b/src/main/java/cactusServer/entities/Object.java index 722cd9f..0a9c5b0 100644 --- a/src/main/java/cactusServer/entities/Object.java +++ b/src/main/java/cactusServer/entities/Object.java @@ -22,7 +22,8 @@ private Quaternion3D angle; private Attribute attribute; private Model3D model; - private Primitive prim = new Box(); + private Primitive prim; + private Object3D object; @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; @@ -40,7 +41,8 @@ setAngle(angle); setAttribute(attribute); setModel(modelID); - Object3D object = new Object3D("",prim); + setPrim(new Box()); + setObject(new Object3D("", prim)); setPlaceable(object); } @@ -122,4 +124,20 @@ } } + public Primitive getPrim() { + return prim; + } + + public void setPrim(Primitive prim) { + this.prim = prim; + } + + public Object3D getObject() { + return object; + } + + public void setObject(Object3D object) { + this.object = object; + } + } \ No newline at end of file diff --git a/src/main/java/cactusServer/models/CollisionManager.java b/src/main/java/cactusServer/models/CollisionManager.java new file mode 100644 index 0000000..183b3a2 --- /dev/null +++ b/src/main/java/cactusServer/models/CollisionManager.java @@ -0,0 +1,61 @@ +package cactusServer.models; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ntlab.radishforandroidstudio.framework.model3D.CollisionResult; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.physics.PhysicsUtility; + +import cactusServer.entities.Character; +import cactusServer.entities.Instance; +import cactusServer.entities.Object; + +public class CollisionManager { + private static CollisionManager theInstance; + private List result; + private HashMap instances; + + private CollisionManager() { + result = new ArrayList(); + instances = Instances.getInstance().getInstances(); + } + + public static CollisionManager getCollision() { + if (theInstance == null) { + theInstance = new CollisionManager(); + } + return theInstance; + } + + public List getResult() { + return result; + } + + public void collisionRun() { + for (Map.Entry instance : instances.entrySet()) { + result.clear(); + HashMap objects = instance.getValue().getObjects(); + HashMap characters = instance.getValue().getCharacters(); + for (Map.Entry object : objects.entrySet()) { + for (Map.Entry character : characters.entrySet()) { + result.add(PhysicsUtility.checkCollision(character.getValue().getObject(), "", + object.getValue().getObject(), "")); + objectmove(instance.getValue(), object.getValue(), character.getValue()); + } + } + } + } + + public void objectmove(Instance instance, Object object, Character character) { + int size = result.size() - 1; + CollisionResult current = result.get(size); + Position3D position = object.getPosition(); + position.setX(position.getX() + current.length * current.normal.x); + position.setY(position.getY() + current.length * current.normal.y); + position.setZ(position.getZ() + current.length * current.normal.z); + object.setPosition(position); + } + +} diff --git a/src/main/java/cactusServer/utils/App.java b/src/main/java/cactusServer/utils/App.java index 83b3126..2c2aa6c 100644 --- a/src/main/java/cactusServer/utils/App.java +++ b/src/main/java/cactusServer/utils/App.java @@ -14,6 +14,7 @@ import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D; +import org.ntlab.radishforandroidstudio.framework.physics.PhysicsUtility; import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; import cactusServer.entities.*; @@ -22,6 +23,7 @@ import cactusServer.entities.Object.*; import cactusServer.models.Accounts; import cactusServer.models.CharacterModelManager; +import cactusServer.models.CollisionManager; import cactusServer.models.Instances; import cactusServer.models.ObjectModelManager; import cactusServer.models.StageModelManager; @@ -31,8 +33,7 @@ @SuppressWarnings("unused") @ApplicationPath("/rest") public class App extends ResourceConfig implements Runnable { - private ScheduledThreadPoolExecutor task = new ScheduledThreadPoolExecutor(4); - private int instancesSize; + private ScheduledThreadPoolExecutor task = new ScheduledThreadPoolExecutor(1000); public App() { ObjectModelManager.getInstance(); @@ -47,23 +48,13 @@ @Override public void run() { -// System.out.println("�^�X�N�����s"); -// instancesSize = Instances.getInstance().getInstances().size(); -// for(int i=0;i> it = Instances.getInstance().getPlayers().entrySet().iterator(); @@ -120,7 +111,8 @@ String playerId = entry.getKey(); Player player = entry.getValue(); long lastUpdateTime = player.getLastUpdateTime(); - System.out.println(currentTime + ", " + (lastUpdateTime + Player.STOP_TIME_LIMIT) + " // playerId: " + playerId); + System.out.println( + currentTime + ", " + (lastUpdateTime + Player.STOP_TIME_LIMIT) + " // playerId: " + playerId); if (currentTime > (lastUpdateTime + Player.STOP_TIME_LIMIT)) { System.out.println("delete started (playerId: " + playerId + ")"); player.destroy(); diff --git a/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/CollisionResult.java b/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/CollisionResult.java index 436d9d0..9a43a08 100644 --- a/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/CollisionResult.java +++ b/src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/CollisionResult.java @@ -2,7 +2,6 @@ import org.ntlab.radishforandroidstudio.java3d.Vector3d; - public class CollisionResult { public Position3D collisionPoint = new Position3D(); public Vector3d normal = new Vector3d(); diff --git a/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/PhysicsUtility.java b/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/PhysicsUtility.java index f52627c..f0d06e4 100644 --- a/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/PhysicsUtility.java +++ b/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/PhysicsUtility.java @@ -10,14 +10,14 @@ import org.ntlab.radishforandroidstudio.java3d.Transform3D; import org.ntlab.radishforandroidstudio.java3d.Vector3d; - /** * 物理演算のコア + * * @author 新田直也 * */ public class PhysicsUtility { - public static final double GRAVITY = 9.8; // 重力の加速度 + public static final double GRAVITY = 9.8; // 重力の加速度 public static final Vector3d horizon = new Vector3d(1.0, 0.0, 0.0); public static final Vector3d vertical = new Vector3d(0.0, 1.0, 0.0); @@ -25,11 +25,14 @@ /** * 物体に加わる重力を求める - * @param body 対象物体 + * + * @param body + * 対象物体 * @return bodyに加わる重力 */ public static Force3D getGravity(Solid3D body) { - return new Force3D(gravityDirection.x * -body.mass * GRAVITY, gravityDirection.y * -body.mass * GRAVITY, gravityDirection.z * -body.mass * GRAVITY); + return new Force3D(gravityDirection.x * -body.mass * GRAVITY, gravityDirection.y * -body.mass * GRAVITY, + gravityDirection.z * -body.mass * GRAVITY); } /** @@ -41,8 +44,7 @@ } // モーメントの計算 - static Vector3d calcMoment(Force3D f, Position3D gravityCenter, - Position3D applicationPoint) { + static Vector3d calcMoment(Force3D f, Position3D gravityCenter, Position3D applicationPoint) { Vector3d v1 = applicationPoint.getVector3d(); Vector3d v2 = gravityCenter.getVector3d(); v1.sub(v2); @@ -56,17 +58,19 @@ /** * 物体の反発係数から衝突時に加わる力を求める - * @param interval 衝突している時間 - * @param nor 物体がぶつかった面の宝仙ベクトル - * @param solid 物体 + * + * @param interval + * 衝突している時間 + * @param nor + * 物体がぶつかった面の宝仙ベクトル + * @param solid + * 物体 * @return 衝突時に加わる力 */ public static Force3D calcForce(long interval, Vector3d nor, Solid3D solid) { double f1 = 0.0; - Vector3d vf = new Vector3d(solid.getVelocity().getX(), solid - .getVelocity().getY(), solid.getVelocity().getZ()); - f1 = solid.mass * (vf.length() + solid.e * vf.length()) - / ((double) interval / 1000.0); + Vector3d vf = new Vector3d(solid.getVelocity().getX(), solid.getVelocity().getY(), solid.getVelocity().getZ()); + f1 = solid.mass * (vf.length() + solid.e * vf.length()) / ((double) interval / 1000.0); nor.scale(f1); Force3D f = new Force3D(nor.x, nor.y, nor.z); return f; @@ -74,12 +78,16 @@ /** * 物体と地面との衝突判定 - * @param obj 物体 - * @param ground 地面 + * + * @param obj + * 物体 + * @param ground + * 地面 * @return 衝突情報(nullのとき衝突なし) */ public static CollisionResult doesIntersect(Solid3D obj, Ground ground) { - if (ground == null) return null; + if (ground == null) + return null; CollisionResult cr = null; BoundingSurface boundingSurface = ground.getBoundingSurface(); @@ -105,10 +113,11 @@ if (obj.bs == null) { // BoundingSphere がまだ作られていななかった場合、 // 詳細な衝突判定のために、最上位の全 BoundingSurface を取得する - if (boundingSurfaceList == null) boundingSurfaceList = new ArrayList(); + if (boundingSurfaceList == null) + boundingSurfaceList = new ArrayList(); boundingSurfaceList.add(boundingSurface); } - + if (boundingSurfaceList.size() > 0) { // 粗い衝突判定で衝突していた場合、OBBの集合を用いてより詳しい衝突判定を行う // (BoundingSphere がまだ作られていない場合、OBB の作成と同時に BoundingSphere を作成される) @@ -123,27 +132,31 @@ } } } - obbVisitor = null; + obbVisitor = null; } return null; } /** * 物体同士の衝突判定 - * @param obj1 物体1 - * @param part1 判定する物体1の部分の名称 - * @param obj2 物体2 - * @param part2 判定する物体2の部分の名称 - * @return 衝突情報(nullのとき衝突なし) + * + * @param obj1 + * 物体1 + * @param part1 + * 判定する物体1の部品の名称 + * @param obj2 + * 物体2 + * @param part2 + * 判定する物体2の部品の名称 + * @return 衝突情報 nullのとき衝突なし */ - public static CollisionResult checkCollision(Object3D obj1, String part1, - Object3D obj2, String part2) { + public static CollisionResult checkCollision(Object3D obj1, String part1, Object3D obj2, String part2) { CollisionResult cr = null; // BoundingSphereを使って大雑把に衝突判定を行う boolean f = false; if (obj1.bs != null && obj2.bs != null) { - // sol1 の BoundingSphere を計算 + // sol1 の BoundingSphere を計算 BoundingSphere bs1 = (BoundingSphere) (obj1.bs.clone()); Transform3D t3d = new Transform3D(); obj1.center.getTransform(t3d); @@ -155,7 +168,7 @@ obj1.pos.getTransform(t3d); bs1.transform(t3d); - // sol2 の BoundingSphere を計算 + // sol2 の BoundingSphere を計算 BoundingSphere bs2 = (BoundingSphere) (obj2.bs.clone()); obj2.center.getTransform(t3d); bs2.transform(t3d); @@ -165,7 +178,7 @@ bs2.transform(t3d); obj2.pos.getTransform(t3d); bs2.transform(t3d); - + // BoundingSphere 同士の衝突判定 if (bs1.intersect(bs2)) { f = true; @@ -198,8 +211,7 @@ // return v; return cr; } else { - cr = visitor1.getObbList().get(i).intersect( - visitor2.getObbList().get(j)); + cr = visitor1.getObbList().get(i).intersect(visitor2.getObbList().get(j)); if (cr != null) { cr.normal.scale(-1.0); // Vector3d v = new Vector3d(0,0,0);