Serge Bernier wrote:
Hi all,
does anyone know how to convert the scaleOrientation information in a VRML
file to a Transform3D from Java3D???
Not directly. We do it as part of a large series of matrix multiplies
for all the Transform fields to make the final matrix that we use for
Java3d.
Here's the complete code from inside our Transform node implementation:
/**
* Calculate transforms needed to handle VRML semantics
* formula: T x C x R x SR x S x -SR x -C
*/
private void updateTransform() {
//System.out.println(this);
tempVec.x = -vfCenter[0];
tempVec.y = -vfCenter[1];
tempVec.z = -vfCenter[2];
matrix.setIdentity();
matrix.setTranslation(tempVec);
float scaleVal = 1.0f;
if (floatEq(vfScale[0], vfScale[1]) &&
floatEq(vfScale[0], vfScale[2])) {
scaleVal = vfScale[0];
tempMtx1.set(scaleVal);
//System.out.println("S" + tempMtx1);
} else {
// non-uniform scale
//System.out.println("Non Uniform Scale");
tempAxis.x = vfScaleOrientation[0];
tempAxis.y = vfScaleOrientation[1];
tempAxis.z = vfScaleOrientation[2];
tempAxis.angle = -vfScaleOrientation[3];
double tempAxisNormalizer =
1 / Math.sqrt(tempAxis.x * tempAxis.x +
tempAxis.y * tempAxis.y +
tempAxis.z * tempAxis.z);
tempAxis.x *= tempAxisNormalizer;
tempAxis.y *= tempAxisNormalizer;
tempAxis.z *= tempAxisNormalizer;
tempMtx1.set(tempAxis);
tempMtx2.mul(tempMtx1, matrix);
// Set the scale by individually setting each element
tempMtx1.setIdentity();
tempMtx1.m00 = vfScale[0];
tempMtx1.m11 = vfScale[1];
tempMtx1.m22 = vfScale[2];
matrix.mul(tempMtx1, tempMtx2);
tempAxis.x = vfScaleOrientation[0];
tempAxis.y = vfScaleOrientation[1];
tempAxis.z = vfScaleOrientation[2];
tempAxis.angle = vfScaleOrientation[3];
tempMtx1.set(tempAxis);
}
tempMtx2.mul(tempMtx1, matrix);
//System.out.println("Sx-C" + tempMtx2);
float magSq = vfRotation[0] * vfRotation[0] +
vfRotation[1] * vfRotation[1] +
vfRotation[2] * vfRotation[2];
if(magSq < ZEROEPS) {
tempAxis.x = 0;
tempAxis.y = 0;
tempAxis.z = 1;
tempAxis.angle = 0;
} else {
if ((magSq > 1.01) || (magSq < 0.99)) {
float mag = (float)(1 / Math.sqrt(magSq));
tempAxis.x = vfRotation[0] * mag;
tempAxis.y = vfRotation[1] * mag;
tempAxis.z = vfRotation[2] * mag;
} else {
tempAxis.x = vfRotation[0];
tempAxis.y = vfRotation[1];
tempAxis.z = vfRotation[2];
}
tempAxis.angle = vfRotation[3];
}
tempMtx1.set(tempAxis);
//System.out.println("R" + tempMtx1);
matrix.mul(tempMtx1, tempMtx2);
//System.out.println("RxSx-C" + matrix);
tempVec.x = vfCenter[0];
tempVec.y = vfCenter[1];
tempVec.z = vfCenter[2];
tempMtx1.setIdentity();
tempMtx1.setTranslation(tempVec);
//System.out.println("C" + tempMtx1);
tempMtx2.mul(tempMtx1, matrix);
//System.out.println("CxRxSx-C" + tempMtx2);
tempVec.x = vfTranslation[0];
tempVec.y = vfTranslation[1];
tempVec.z = vfTranslation[2];
tempMtx1.setIdentity();
tempMtx1.setTranslation(tempVec);
matrix.mul(tempMtx1, tempMtx2);
transform.set(matrix);
implTG.setTransform(transform);
}
--
Justin Couch http://www.vlc.com.au/~justin/
Java Architect & Bit Twiddler http://www.yumetech.com/
Author, Java 3D FAQ Maintainer http://www.j3d.org/
-------------------------------------------------------------------
"Look through the lens, and the light breaks down into many lights.
Turn it or move it, and a new set of arrangements appears... is it
a single light or many lights, lights that one must know how to
distinguish, recognise and appreciate? Is it one light with many
frames or one frame for many lights?" -Subcomandante Marcos
-------------------------------------------------------------------
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".