package com.akjava.gwt.three.client.gwt.boneanimation.ik; import com.akjava.gwt.three.client.java.utils.GWTThreeUtils; import com.akjava.gwt.three.client.js.THREE; import com.akjava.gwt.three.client.js.math.Matrix4; import com.akjava.gwt.three.client.js.math.Quaternion; import com.akjava.gwt.three.client.js.math.Vector3; public class CDDIK { public Matrix4 doStep(Vector3 lastJointPos,Vector3 jointPos,Matrix4 jointRot,Vector3 targetPos){ Vector3 jointVector=lastJointPos.clone().sub(jointPos).normalize(); Vector3 targetVector=targetPos.clone().sub(jointPos).normalize(); double acv=jointVector.dot(targetVector); double angle=Math.acos(acv); if(angle<= 1.0e-5f){ return null; } //LogUtils.log("angle:"+angle+","+Math.toDegrees(angle)); Vector3 axis=THREE.Vector3().crossVectors(jointVector,targetVector); axis.normalize(); Quaternion q=THREE.Quaternion().setFromAxisAngle(axis,angle); Matrix4 matrix=THREE.Matrix4().makeRotationFromQuaternion(q); matrix.multiplyMatrices(jointRot, matrix); return matrix; } //support root rotation public Matrix4 getStepAngleMatrix(Vector3 parentAngle,Vector3 lastJointPos,Vector3 jointPos,Matrix4 jointRot,Vector3 targetPos){ Vector3 parentVec=parentAngle.clone().negate(); Matrix4 mx=GWTThreeUtils.degitRotationToMatrix4(parentVec.getX(),parentVec.getY(), parentVec.getZ()); /* Vector3 jointPosParent=jointPos.clone(); mx.multiplyVector3(jointPosParent); Vector3 jointVector=mx.multiplyVector3(lastJointPos.clone()).subSelf(jointPosParent).normalize(); Vector3 targetVector=mx.multiplyVector3(targetPos.clone()).subSelf(jointPosParent).normalize(); */ Vector3 jointVector=lastJointPos.clone().sub(jointPos); //mx.multiplyVector3(jointVector); jointVector.applyProjection(mx); jointVector.normalize(); Vector3 targetVector=targetPos.clone().sub(jointPos); targetVector.applyProjection(mx); //mx.multiplyVector3(targetVector); targetVector.normalize(); double acv=jointVector.dot(targetVector); double angle=Math.acos(acv); if(angle<= 1.0e-5f){ return null; } //LogUtils.log("angle:"+angle+","+Math.toDegrees(angle)); Vector3 axis=THREE.Vector3().crossVectors(jointVector,targetVector); axis.normalize(); Quaternion q=THREE.Quaternion().setFromAxisAngle(axis,angle); Matrix4 matrix=THREE.Matrix4().makeRotationFromQuaternion(q); return matrix; } public Matrix4 getStepAngleMatrix(Vector3 lastJointPos,Vector3 jointPos,Matrix4 jointRot,Vector3 targetPos){ Vector3 jointVector=lastJointPos.clone().sub(jointPos).normalize(); Vector3 targetVector=targetPos.clone().sub(jointPos).normalize(); double acv=jointVector.dot(targetVector); double angle=Math.acos(acv); if(angle<= 1.0e-5f){ return null; } //LogUtils.log("angle:"+angle+","+Math.toDegrees(angle)); Vector3 axis=THREE.Vector3().crossVectors(jointVector,targetVector); axis.normalize(); Quaternion q=THREE.Quaternion().setFromAxisAngle(axis,angle); Matrix4 matrix=THREE.Matrix4().makeRotationFromQuaternion(q); return matrix; } }