Obj #127

Merged r-isitani merged 11 commits into nitta-lab-2018:master from nitta-lab-2018:obj on 9 Oct 2018
Showing 7 changed files
View
1
■■■■
.settings/org.eclipse.core.resources.prefs
eclipse.preferences.version=1
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
View
23
src/main/java/cactusServer/entities/Character.java
package cactusServer.entities;
 
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;
import net.arnx.jsonic.JSONHint;
private String name;
private Position3D position;
private Quaternion3D angle;
private int modelID;
private Primitive prim;
private Object3D object;
 
private HashMap<String, Item> itemMap = new HashMap<>();
@JSONHint(ignore = true)
public static final int UNIQUE_ID_LENGTH = 12;
setPosition(position);
setAngle(angle);
setModelID(modelID);
initAreaURI(instanceId);
setPrim(new Box());
setObject(new Object3D("",prim));
}
 
public String getAccountURI() {
return accountURI;
 
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;
}
}
View
24
src/main/java/cactusServer/entities/Object.java
private AngularVelocity3D angularVelocity;
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;
 
setAngularVelocity(angularVelocity);
setAngle(angle);
setAttribute(attribute);
setModel(modelID);
Object3D object = new Object3D("",prim);
setPrim(new Box());
setObject(new Object3D("", prim));
setPlaceable(object);
}
 
public Position3D getPosition() {
this.cof = cof;
}
}
 
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;
}
 
}
View
62
src/main/java/cactusServer/models/CollisionManager.java 0 → 100644
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<CollisionResult> result;
private HashMap<String, Instance> instances;
 
private CollisionManager() {
result = new ArrayList<CollisionResult>();
instances = Instances.getInstance().getInstances();
}
 
public static CollisionManager getCollision() {
if (theInstance == null) {
theInstance = new CollisionManager();
}
return theInstance;
}
 
public List<CollisionResult> getResult() {
return result;
}
 
public void collisionRun() {
for (Map.Entry<String, Instance> instance : instances.entrySet()) {
result.clear();
HashMap<String, Object> objects = instance.getValue().getObjects();
HashMap<String, Character> characters = instance.getValue().getCharacters();
for (Map.Entry<String, Object> object : objects.entrySet()) {
for (Map.Entry<String, Character> 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);
}
 
}
View
70
src/main/java/cactusServer/utils/App.java
import org.ntlab.radishforandroidstudio.framework.model3D.Model3D;
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.*;
import cactusServer.entities.Character;
import cactusServer.entities.EmoteState.EmoteType;
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;
import cactusServer.resources.InstancesRest;
 
@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();
StageModelManager.getInstance();
}
 
@Override
public void run() {
// System.out.println("タスクを実行");
// instancesSize = Instances.getInstance().getInstances().size();
// for(int i=0;i<instancesSize;i++) {
// Instance instance = Instances.getInstance().getInstances().get(i);
// int objectsSize = instance.getObjects().size();
// int playersSize=instance.getCharacters().size();
// for(int j=0;j<objectsSize;j++) {
// for(int x=0;x<playersSize;x++) {
// //PhysicsUtility.checkCollision(instance.)
// }
// }
// }
// System.out.println("タスクを実行");
CollisionManager.getCollision().collisionRun();
removeInactivePlayers();
}
 
public void start(int interval) {
task.scheduleWithFixedDelay(this, interval, interval, TimeUnit.MILLISECONDS);
task.scheduleAtFixedRate(this, interval, interval, TimeUnit.MILLISECONDS);
}
 
private void initDummy() {
// ダミーアカウント2つ
Player player2 = new Player("test2", "chara2", cameraState, EmoteType.DUMMY);
Instances.getInstance().getPlayers().put("player2", player2);
// ダミーオブジェクト
Instances.getInstance().getInstance("test1").createObject(new Position3D(0, 0, 0), new Velocity3D(),
new AngularVelocity3D(), new Quaternion3D(), new Attribute(true,1), 0);
// // 確認用
// String player1Encode = JSON.encode(player1, true);
// String player2Encode = JSON.encode(player2, true);
// Player player1Decode = JSON.decode(player1Encode, Player.class);
// Player player2Decode = JSON.decode(player2Encode, Player.class);
// System.out.println(JSON.encode(player1Decode, true));
// System.out.println(JSON.encode(player2Decode, true));
// JSON json = new JSON();
// String characterId = player1.getCharacterID();
// String encodeCharacterId = json.encode(characterId);
// System.out.println(characterId);
// System.out.println(encodeCharacterId);
// String position = json.encode(player1.getPosition());
// System.out.println(position);
new AngularVelocity3D(), new Quaternion3D(), new Attribute(true, 1), 0);
// // 確認用
// String player1Encode = JSON.encode(player1, true);
// String player2Encode = JSON.encode(player2, true);
// Player player1Decode = JSON.decode(player1Encode, Player.class);
// Player player2Decode = JSON.decode(player2Encode, Player.class);
// System.out.println(JSON.encode(player1Decode, true));
// System.out.println(JSON.encode(player2Decode, true));
 
// JSON json = new JSON();
// String characterId = player1.getCharacterID();
// String encodeCharacterId = json.encode(characterId);
// System.out.println(characterId);
// System.out.println(encodeCharacterId);
// String position = json.encode(player1.getPosition());
// System.out.println(position);
}
 
private void removeInactivePlayers() {
long currentTime = System.nanoTime();
Iterator<Map.Entry<String, Player>> it = Instances.getInstance().getPlayers().entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Player> entry = it.next();
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();
Instance instance = Instances.getInstance().getInstance(player.getInstanceID());
View
1
■■■■
src/main/java/org/ntlab/radishforandroidstudio/framework/model3D/CollisionResult.java
package org.ntlab.radishforandroidstudio.framework.model3D;
 
import org.ntlab.radishforandroidstudio.java3d.Vector3d;
 
 
public class CollisionResult {
public Position3D collisionPoint = new Position3D();
public Vector3d normal = new Vector3d();
View
96
src/main/java/org/ntlab/radishforandroidstudio/framework/physics/PhysicsUtility.java
import org.ntlab.radishforandroidstudio.java3d.BoundingSphere;
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);
 
public static Vector3d gravityDirection = new Vector3d(0.0, 1.0, 0.0);
 
/**
* 物体に加わる重力を求める
* @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);
}
 
/**
* @param v
gravityDirection = new Vector3d(v.x, v.y, v.z);
}
 
// モーメントの計算
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);
 
}
 
/**
* 物体の反発係数から衝突時に加わる力を求める
* @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;
}
 
/**
* 物体と地面との衝突判定
* @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();
 
// BoundingSphereを使って大雑把に衝突判定を行う
 
if (obj.bs == null) {
// BoundingSphere がまだ作られていななかった場合、
// 詳細な衝突判定のために、最上位の全 BoundingSurface を取得する
if (boundingSurfaceList == null) boundingSurfaceList = new ArrayList<BoundingSurface>();
if (boundingSurfaceList == null)
boundingSurfaceList = new ArrayList<BoundingSurface>();
boundingSurfaceList.add(boundingSurface);
}
 
if (boundingSurfaceList.size() > 0) {
// 粗い衝突判定で衝突していた場合、OBBの集合を用いてより詳しい衝突判定を行う
// (BoundingSphere がまだ作られていない場合、OBB の作成と同時に BoundingSphere を作成される)
BoundingBoxVisitor obbVisitor = new BoundingBoxVisitor();
return cr;
}
}
}
obbVisitor = null;
obbVisitor = null;
}
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) {
*
* @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) {
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);
bs1.transform(t3d);
bs1.transform(t3d);
obj1.pos.getTransform(t3d);
bs1.transform(t3d);
 
// sol2 の BoundingSphere を計算
// sol2 の BoundingSphere を計算
BoundingSphere bs2 = (BoundingSphere) (obj2.bs.clone());
obj2.center.getTransform(t3d);
bs2.transform(t3d);
obj2.scale.getTransform(t3d);
obj2.rot.getTransform(t3d);
bs2.transform(t3d);
obj2.pos.getTransform(t3d);
bs2.transform(t3d);
 
// BoundingSphere 同士の衝突判定
if (bs1.intersect(bs2)) {
f = true;
}
// Yes!!"+cr.collisionPoint.getZ());
// 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);
// System.out.println("checkColision2