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".