class Keyframe {
private double time;
private Matrix transform;
public Keyframe(double time, Matrix transform) {
this.time = time;
// Normalize the rotation component of the transform
Quaternion rotation = new Quaternion(transform); // Extracts the rotational component
rotation.normalize();
Matrix rotationMatrix = rotation.toMatrix();
// Adjust the transform to the jPCT coordinate system
this.transform = adjustToJpctCoordinateSystem(rotationMatrix);
// Extract and reset translation
SimpleVector translation = extractTranslation(transform);
resetTranslation(transform);
// Extract, check, and apply uniform scale
SimpleVector scale = extractScale(transform);
if (!isUniformScale(scale)) {
scale = new SimpleVector(1f, 1f, 1f); // (1, 1, 1) Use uniform scale if it's not uniform
}
Utilities.setScale(this.transform, scale);
// Combine rotation and scale, reapply translation
this.transform = combineTransforms(translation, this.transform, scale);
}
// Method to adjust a transformation matrix to jPCT's coordinate system
private Matrix adjustToJpctCoordinateSystem(Matrix transform) {
Matrix adjustedMatrix = new Matrix(transform);
// Flip the Y-axis
adjustedMatrix.set(1, 0, -adjustedMatrix.get(1, 0));
adjustedMatrix.set(1, 1, -adjustedMatrix.get(1, 1));
adjustedMatrix.set(1, 2, -adjustedMatrix.get(1, 2));
// If there's translation on Y-axis, flip it as well
adjustedMatrix.set(1, 3, -adjustedMatrix.get(1, 3));
// Flip the Z-axis
adjustedMatrix.set(2, 0, -adjustedMatrix.get(2, 0));
adjustedMatrix.set(2, 1, -adjustedMatrix.get(2, 1));
adjustedMatrix.set(2, 2, -adjustedMatrix.get(2, 2));
// If there's translation on Z-axis, flip it as well
adjustedMatrix.set(2, 3, -adjustedMatrix.get(2, 3));
return adjustedMatrix;
}
public double getTime() {
return time;
}
// Extract the translation component from a transformation matrix
private SimpleVector extractTranslation(Matrix transform) {
return new SimpleVector(transform.get(3, 0), transform.get(3, 1), transform.get(3, 2));
}
public Matrix getTransform() {
return transform;
}
// Reset the translation component of a transformation matrix to zero
private void resetTranslation(Matrix transform) {
transform.set(3, 0, 0);
transform.set(3, 1, 0);
transform.set(3, 2, 0);
}
// Helper method to extract scale from a transformation matrix
private SimpleVector extractScale(Matrix transform) {
// Assuming the scale is represented by the length of the axis vectors in the matrix
SimpleVector scaleX = new SimpleVector(transform.get(0, 0), transform.get(1, 0), transform.get(2, 0));
SimpleVector scaleY = new SimpleVector(transform.get(0, 1), transform.get(1, 1), transform.get(2, 1));
SimpleVector scaleZ = new SimpleVector(transform.get(0, 2), transform.get(1, 2), transform.get(2, 2));
return new SimpleVector(scaleX.length(), scaleY.length(), scaleZ.length());
}
// Combine the translation, rotation, and scale into a single transformation matrix
private Matrix combineTransforms(SimpleVector translation, Matrix rotation, SimpleVector scale) {
Matrix scaleMatrix = new Matrix();
scaleMatrix.setIdentity();
Utilities.setScale(scaleMatrix, scale);
Matrix combined = new Matrix();
combined.setIdentity();
combined.matMul(rotation);
combined.matMul(scaleMatrix);
combined.translate(translation);
return combined;
}
// Helper method to check if the scale is uniform
private boolean isUniformScale(SimpleVector scale) {
// Check if all components are the same within a small epsilon to account for floating-point precision
final float epsilon = 0.0001f;
return Math.abs(scale.x - scale.y) < epsilon && Math.abs(scale.y - scale.z) < epsilon;
}
// Method to apply scale to a transformation matrix
private void applyScaleToTransform(Matrix transform, SimpleVector scale) {
// Reset the scale component of the matrix to 1
for (int i = 0; i < 3; i++) {
float length = new SimpleVector(transform.get(0, i), transform.get(1, i), transform.get(2, i)).length();
if (length != 0) { // Avoid division by zero
transform.set(0, i, transform.get(0, i) / length);
transform.set(1, i, transform.get(1, i) / length);
transform.set(2, i, transform.get(2, i) / length);
}
}
// Create a scale matrix
Matrix scaleMatrix = new Matrix();
scaleMatrix.setIdentity(); // Start with an identity matrix
scaleMatrix.set(0, 0, scale.x);
scaleMatrix.set(1, 1, scale.y);
scaleMatrix.set(2, 2, scale.z);
// Apply scale by multiplying the existing transform with the scale matrix
transform.matMul(scaleMatrix);
}
}
Page created in 0.063 seconds with 11 queries.