有什么比我现在拥有的更好吗?角度约束的求解越来越乏味。
这最初是 AS3:http ://www.lorenzonuvoletta.com/wp-content/uploads/others/Main.as
自由角度受进出角度HTML 滑块的约束。
我只是通过输入来采样一点:
if (i - 1 == 0) {
angle = solve(points[i - 1], points[i], 'right lock');
}
在循环。
但是当我解决关节角度时,当我把它带到左边时,它的自由度会变得很跳跃:
function solve(point, delta, LF) {
if (!delta.out || !delta.in) return point.s;
point.s = point.s > Math.radians(delta.in.value) + delta.s
? Math.radians(delta.in.value) + delta.s
: point.s < delta.s - Math.radians(delta.out.value)
? delta.s - Math.radians(delta.out.value)
: point.s;
console.log(point.s);
console.log(delta.s);
console.log('Out: ' + (delta.s - Math.radians(delta.out.value)));
console.log('In: ' + (Math.radians(delta.in.value) + delta.s));
return point.s;// return slope
}
代码:
function computeLeftPoints() {
var points = _points[_ikIndex];
var distance = points[0].distance;
var lock = points[0].lock;
var angle;
//var i;
var iMod = 0;
if (!lock) iMod = 1;
for (let i = _pActive; i > 1 - iMod; i--) {
points[i - 1].s = angle = Math.slope(points[i - 1], points[i]);
points[i - 1].a = Math.angle(points[i - 2], points[i - 1], points[i]);
points[i - 1].ap = anglePoint(points[i - 1]);
if (i - 1 == 0) {
angle = solve(points[i - 1], points[i], 'left');
}
points[i - 1].x = points[i].x + distance * Math.cos(angle); //Must be rounded unless will cause error in arc
points[i - 1].y = points[i].y + distance * Math.sin(angle);
}
if (lock) {
for (let i = 0; i < _pActive; i++) {
points[i + 1].s = angle = Math.slope(points[i + 1], points[i]);
points[i + 1].a = Math.angle(points[i + 2], points[i + 1], points[i]);
points[i + 1].ap = anglePoint(points[i + 1]);
if (i + 1 == 0) {
angle = solve(points[i + 1], points[i], 'left lock');
}
points[i + 1].x = points[i].x + distance * Math.cos(angle);
points[i + 1].y = points[i].y + distance * Math.sin(angle);
}
}
}
function computeRightPoints() {
var points = _points[_ikIndex];
var distance = points[0].distance;
var lock = points[0].lock;
var angle;
var i;
var iMod = 0;
if (!lock) iMod = 1;
for (i = _pActive; i < points.length - 2 + iMod; i++) {
points[i + 1].s = angle = Math.slope(points[i + 1], points[i]);
points[i + 1].a = Math.angle(points[i + 2], points[i + 1], points[i]);
points[i + 1].ap = anglePoint(points[i + 1]);
if (i + 1 == 0) {
angle = solve(points[i + 1], points[i], 'right');
}
points[i + 1].x = points[i].x + distance * Math.cos(angle);
points[i + 1].y = points[i].y + distance * Math.sin(angle);
}
if (lock) {
for (i = points.length - 1; i > _pActive; i--) {
points[i - 1].s = angle = Math.slope(points[i - 1], points[i]);
points[i - 1].a = Math.angle(points[i - 2], points[i - 1], points[i]);
points[i - 1].ap = anglePoint(points[i - 1]);
if (i - 1 == 0) {
angle = solve(points[i - 1], points[i], 'right lock');
}
points[i - 1].x = points[i].x + distance * Math.cos(angle); //Must be rounded unless will cause error in arc
points[i - 1].y = points[i].y + distance * Math.sin(angle);
}
}
}
function solve(point, delta, LF) {
if (!delta.out || !delta.in) return point.s;
point.s = point.s > Math.radians(delta.in.value) + delta.s
? Math.radians(delta.in.value) + delta.s
: point.s < delta.s - Math.radians(delta.out.value)
? delta.s - Math.radians(delta.out.value)
: point.s;
console.log(point.s);
console.log(delta.s);
console.log('Out: ' + (delta.s - Math.radians(delta.out.value)));
console.log('In: ' + (Math.radians(delta.in.value) + delta.s));
return point.s;// return slope
}
我只是对颈部进行采样,它在右侧工作正常,但在左侧,我想,我应该在第一天完成约束......哈哈,我之前有过这个想法。