use of maspack.matrix.SymmetricMatrix3d in project artisynth_core by artisynth.
the class PolygonalMesh method computePrincipalAxes.
public static RigidTransform3d computePrincipalAxes(PolygonalMesh mesh) {
Vector3d mov1 = new Vector3d();
Vector3d mov2 = new Vector3d();
Vector3d pov = new Vector3d();
double vol = mesh.computeVolumeIntegrals(mov1, mov2, pov);
double mass = vol;
Point3d cov = new Point3d();
// center of volume
cov.scale(1.0 / vol, mov1);
// [c], skew symmetric
Matrix3d covMatrix = new Matrix3d(0, -cov.z, cov.y, cov.z, 0, -cov.x, -cov.y, cov.x, 0);
// J
Matrix3d J = new Matrix3d((mov2.y + mov2.z), -pov.z, -pov.y, -pov.z, (mov2.x + mov2.z), -pov.x, -pov.y, -pov.x, (mov2.x + mov2.y));
// Jc = J + m[c][c]
Matrix3d Jc = new Matrix3d();
Jc.mul(covMatrix, covMatrix);
Jc.scale(mass);
Jc.add(J);
// Compute eigenvectors and eigenvlaues of Jc
SymmetricMatrix3d JcSymmetric = new SymmetricMatrix3d(Jc);
Vector3d lambda = new Vector3d();
Matrix3d U = new Matrix3d();
JcSymmetric.getEigenValues(lambda, U);
// Construct the rotation matrix
RotationMatrix3d R = new RotationMatrix3d();
R.set(U);
lambda.absolute();
if (lambda.x > lambda.y && lambda.z > lambda.y) {
R.rotateZDirection(new Vector3d(R.m01, R.m11, R.m21));
} else if (lambda.x > lambda.z && lambda.y > lambda.z) {
R.rotateZDirection(new Vector3d(R.m00, R.m10, R.m20));
}
return (new RigidTransform3d(cov, R));
}
use of maspack.matrix.SymmetricMatrix3d in project artisynth_core by artisynth.
the class OBB method setTransform.
/**
* Sets the transform for this OBB from a covariance matrix and centroid.
*/
private void setTransform(Matrix3d C, Point3d cent) {
SymmetricMatrix3d Csym = new SymmetricMatrix3d(C.m00, C.m11, C.m22, C.m01, C.m02, C.m12);
Matrix3d U = new Matrix3d();
Vector3d sig = new Vector3d();
Matrix3d V = new Matrix3d();
// Might want to do this factorization with SVDecomposition3d, but
// SymmetricMatrix3d.getSVD() is a bit faster
Csym.getSVD(U, sig, V);
if (U.determinant() < 0) {
U.m02 = -U.m02;
U.m12 = -U.m12;
U.m22 = -U.m22;
}
// Code to handle degenetrate eigenvalues
// Handle degeneracies corresponding to equal-length axes in the
// inertia ellipsoid. If any two axes have similar lengths, then
// U is redefined solely using the direction of the remaining
// axis.
//
// In determining whether axes have similar lengths, we use
// the fact that the moment of inertia of an ellipsoid
// with unit mass is given by
//
// sig.x = 1/5 (b^2 + c^2)
// sig.y = 1/5 (a^2 + c^2)
// sig.z = 1/5 (a^2 + b^2)
//
// along with the fact that if a and b are close together, then
//
// a^2 - b^2 ~= 2 b (a-b)
//
// a^2 + b^2 ~= 2 a^2 ~= 2 b^2
//
// and so
//
// (a - b) ~= (a^2 - b^2) / 2 b
// ~= (a^2 - b^2) / (sqrt(2) * sqrt(2 b^2))
// ~= (a^2 - b^2) / (sqrt(2) * sqrt(a^2 + b^2))
boolean xout = false, yout = false, zout = false;
sig.scale(5);
double tol = sig.infinityNorm() * 1e-6;
if (Math.abs(sig.x - sig.y) / Math.sqrt(2 * sig.z) < tol) {
// eliminate x and y
xout = yout = true;
}
if (Math.abs(sig.x - sig.z) / Math.sqrt(2 * sig.y) < tol) {
// eliminate x and z
xout = zout = true;
}
if (Math.abs(sig.z - sig.y) / Math.sqrt(2 * sig.x) < tol) {
// eliminate z and y
zout = yout = true;
}
if (zout && xout && yout) {
U.setIdentity();
} else if (zout || yout || xout) {
Vector3d zdir = new Vector3d();
RotationMatrix3d R = new RotationMatrix3d();
if (xout && yout) {
U.getColumn(2, zdir);
} else if (xout && zout) {
U.getColumn(1, zdir);
} else if (zout && yout) {
U.getColumn(0, zdir);
}
R.setZDirection(zdir);
U.set(R);
}
myX.R.set(U);
myX.p.set(cent);
}
use of maspack.matrix.SymmetricMatrix3d in project artisynth_core by artisynth.
the class FemNode3d method setStress.
public void setStress(double vms) {
if (myAvgStress == null) {
myAvgStress = new SymmetricMatrix3d();
}
myAvgStress.setZero();
myAvgStress.m00 = vms;
myAvgStress.m11 = vms;
myAvgStress.m22 = vms;
}
use of maspack.matrix.SymmetricMatrix3d in project artisynth_core by artisynth.
the class NeoHookeanMaterial method main.
public static void main(String[] args) {
NeoHookeanMaterial mat = new NeoHookeanMaterial();
SolidDeformation def = new SolidDeformation();
Matrix3d Q = new Matrix3d();
def.setF(new Matrix3d(1, 3, 5, 2, 1, 4, 6, 1, 2));
Matrix6d D = new Matrix6d();
SymmetricMatrix3d sig = new SymmetricMatrix3d();
mat.setYoungsModulus(10);
mat.computeStress(sig, def, Q, null);
mat.computeTangent(D, sig, def, Q, null);
System.out.println("sig=\n" + sig.toString("%12.6f"));
System.out.println("D=\n" + D.toString("%12.6f"));
}
use of maspack.matrix.SymmetricMatrix3d in project artisynth_core by artisynth.
the class NeoHookeanMaterial method clone.
public NeoHookeanMaterial clone() {
NeoHookeanMaterial mat = (NeoHookeanMaterial) super.clone();
mat.myB = new SymmetricMatrix3d();
// mat.myB2 = new SymmetricMatrix3d();
return mat;
}
Aggregations