xtorcga
Version:
Xtor Compute Geometry Algorithm Libary 计算几何算法库
94 lines (93 loc) • 3.67 kB
JavaScript
;
/*
* @Description :
* @Author : 赵耀圣
* @QQ : 549184003
* @Date : 2021-03-22 17:27:16
* @LastEditTime : 2021-03-23 18:01:49
* @FilePath : \cga.js\src\IKanimation\CCDSolver.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.CCDSolver = void 0;
var Math_1 = require("../math/Math");
var Plane_1 = require("../struct/3d/Plane");
var Quat_1 = require("../math/Quat");
var Vec3_1 = require("../math/Vec3");
var _quat = new Quat_1.Quat();
var _plane = new Plane_1.Plane();
/**
* @description :
* @param {*}
* @return {*}
* @example :
*/
var CCDSolver = /** @class */ (function () {
function CCDSolver() {
}
CCDSolver.prototype.updateTarget = function () {
};
CCDSolver.prototype.projectPlane = function (v, normal) {
return v.clone().projectOnPlaneNormal(normal);
};
CCDSolver.prototype.calcAngle = function (v1, v2, dir) {
var vc1 = v1.clone();
var vc2 = v2.clone();
var angle = Math_1.clamp(vc1.normalize().dot(vc2.normalize()), -1, 1);
angle = Math.acos(angle);
if (vc1.cross(vc2).dot(dir) < 0)
return -angle;
return angle;
};
/**
* @description :
* @param {Vec3} target 目标点
* @param {Vec3} zeroPos 关节原点
* @param {Vec3} effector 末端效应点
* @return {*}
* @example :
*/
CCDSolver.prototype.solveTranslate = function (target, zeroPos, effector) {
};
/**
* @description :
* @param {Vec3} target 目标点
* @param {Vec3} zeroPos 关节原点
* @param {Vec3} effector 末端效应点
* @return {*}
* @example :
*/
CCDSolver.prototype.solveRotation = function (target, zeroPos, effector, contraints) {
var dir0 = effector.clone().sub(zeroPos).normalize();
var dir1 = target.clone().sub(zeroPos).normalize();
var rotationAxis = Vec3_1.v3().cross(dir0, dir1).normalize();
_plane.setFromPointNormal(zeroPos, rotationAxis);
//最近点
var closestDir = this.projectPlane(target, rotationAxis);
closestDir.sub(zeroPos);
var angle = 0;
_quat.setFromUnitVecs(dir0, closestDir);
return _quat.clone();
};
CCDSolver.prototype.solveIK = function (skeleton, target) {
var i = 0;
while (i++ < skeleton.boneNum) {
}
};
CCDSolver.prototype.solve = function (bones) {
// for (var i = bones.Length - 2; i > -1; i--) {
// // Slerp if weight is < 0
// //CCD tends to overemphasise the rotations of the bones closer to the target position. Reducing bone weight down the hierarchy will compensate for this effect.
// var w = bones[i].weight * IKPositionWeight;
// if (w > 0) {
// Vec3 toLastBone = bones[bones.Length - 1].transform.position - bones[i].transform.position;
// Vec3 toTarget = targetPosition - bones[i].transform.position;
// // Get the rotation to direct the last bone to the target
// Quat targetRotation = Quat.FromToRotation(toLastBone, toTarget) * bones[i].transform.rotation;
// if (w >= 1) bones[i].transform.rotation = targetRotation;
// else bones[i].transform.rotation = Quaternion.Lerp(bones[i].transform.rotation, targetRotation, w);
// }
// }
};
return CCDSolver;
}());
exports.CCDSolver = CCDSolver;