1

有什么比我现在拥有的更好吗?角度约束的求解越来越乏味。

这最初是 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
}

我只是对颈部进行采样,它在右侧工作正常,但在左侧,我想,我应该在第一天完成约束......哈哈,我之前有过这个想法。

4

0 回答 0