Newer
Older
SproutServerMicro / src / main / java / framework / physics / Inertia3D.java
s-bekki on 30 Nov 2017 1 KB initial commit
package framework.physics;

import framework.model3D.OBB;

import javax.vecmath.Vector3d;


public class Inertia3D {
	double ixx;
	double iyy;
	double izz;
	static final Inertia3D ZERO = new Inertia3D( 0.0, 0.0, 0.0);
	
	public Inertia3D(double x,double y,double z){
		this.ixx = x;
		this.iyy = y;
		this.izz = z;
	}
	
	public Inertia3D(Vector3d v) {
		this.ixx = v.x;
		this.iyy = v.y;
		this.izz = v.z;
	}

	public Inertia3D(Solid3D obj) {
		BoundingBoxVisitor visitor = new BoundingBoxVisitor();
		obj.accept(visitor);
		if (visitor.getObbList().size() == 1) {
			OBB obb = visitor.getObbList().get(0);
			Vector3d vx = new Vector3d();
			vx.sub(obb.getVertex(4), obb.getVertex(0));

			Vector3d vy = new Vector3d();
			vy.sub(obb.getVertex(1), obb.getVertex(0));

			Vector3d vz = new Vector3d();
			vz.sub(obb.getVertex(2), obb.getVertex(0));
			
//			System.out.println("vx:" + vx + ",vy:" + vy + ",vz:" + vz);
			this.ixx = obj.mass * (1.0/12.0 * (Math.pow(vy.length(), 2.0) + Math.pow(vz.length(), 2.0)));
			this.iyy = obj.mass * (1.0/12.0 * (Math.pow(vx.length(), 2.0) + Math.pow(vz.length(), 2.0)));
			this.izz = obj.mass * (1.0/12.0 * (Math.pow(vx.length(), 2.0) + Math.pow(vy.length(), 2.0)));	
		} else {
			this.ixx = obj.mass;
			this.iyy = obj.mass;
			this.izz = obj.mass;			
		}
	}

	public Vector3d getVector3d() {
		return new Vector3d(ixx, iyy, izz);
	}
}