/// <summary> /// 終端を指定してびよんびよんさせる。先端は引っ張られていく。 /// </summary> public void pullToLast(LineUnit line, Vector3 last, float stiffness, float damping) { var ifirst = line.pointId; var ilast = ifirst + numberOfSegmnts + 1; velocities[ilast] = (last - positions[ilast]) * GM.t.deltaR; positions[ilast] = last; var dt = GM.t.delta; // > 0.1f ? 0.1f : GM.t.delta; for (var i = ifirst; i < ilast; i++) { var desired = last; // バネの力を計算 Vector3 stretch = positions[i] - desired; Vector3 force = -stiffness * stretch - damping * velocities[i]; // 速度 velocities[i] += (force + Physics.gravity) * dt; } for (var i = ifirst; i < ilast; i++) { // 移動 positions[i] += velocities[i] * dt; } }
/// <summary> /// 先端を指定して、びよんびよんさせる。終端は先端に引っ張られていく。 /// </summary> public void movePulling(LineUnit line, Vector3 start, float stiffness, float damping) { var ifirst = line.pointId; var iover = ifirst + numberOfSegmnts + 2; velocities[ifirst] = (start - positions[ifirst]) * GM.t.deltaR; positions[ifirst] = start; var dt = GM.t.delta; // > 0.1f ? 0.1f : GM.t.delta; for (var i = ifirst + 1; i < iover; i++) { //var desired = positions[i] + ( velocities[i] + ( Physics.gravity * dt ) ) * dt; var desired = (i == iover - 1 ? positions[i - 1] + positions[i + 0] : positions[i - 1] + positions[i + 1]) * 0.5f; //desired = ( desired + ( positions[i] + ( velocities[i] + Physics.gravity * dt ) * dt ) ) * 0.5f; // バネの力を計算 Vector3 stretch = positions[i] - desired; Vector3 force = -stiffness * stretch - damping * velocities[i]; // 速度 velocities[i] += (force + Physics.gravity) * dt; } for (var i = ifirst + 1; i < iover; i++) { // 移動 positions[i] += velocities[i] * dt; } }
/// <summary> /// 先端と終端を現在の位置のまま、びよんびよんさせる。 /// </summary> public void moveOnFixedBothEnds(LineUnit line, float stiffness, float damping) { var ifirst = line.pointId; var ilast = ifirst + numberOfSegmnts + 1; var dt = GM.t.delta; // > 0.1f ? 0.1f : GM.t.delta; for (var i = ifirst + 1; i < ilast; i++) { //var desired = positions[i] + ( velocities[i] + ( Physics.gravity * dt ) ) * dt; var desired = (positions[i - 1] + positions[i + 1]) * 0.5f; //desired = ( desired + ( positions[i] + ( velocities[i] + Physics.gravity * dt ) * dt ) ) * 0.5f; // バネの力を計算 Vector3 stretch = positions[i] - desired; Vector3 force = -stiffness * stretch - damping * velocities[i]; // 速度 velocities[i] += (force + Physics.gravity) * dt; } for (var i = ifirst + 1; i < ilast; i++) { // 移動 positions[i] += velocities[i] * dt; } }
/// <summary> /// 先端を指定して、びよんびよんさせる。終端は動かない。 /// </summary> public void moveOnFixedBothEndsAtFirst(LineUnit line, Vector3 first, float stiffness, float damping) { var ifirst = line.pointId; velocities[ifirst] = (first - positions[ifirst]) * GM.t.deltaR; positions[ifirst] = first; moveOnFixedBothEnds(line, stiffness, damping); }
/// <summary> /// 終端を指定して、びよんびよんさせる。先端は動かない。 /// </summary> public void moveOnFixedBothEndsAtLast(LineUnit line, Vector3 last, float stiffness, float damping) { var ilast = line.pointId + numberOfSegmnts + 1; velocities[ilast] = (last - positions[ilast]) * GM.t.deltaR; positions[ilast] = last; moveOnFixedBothEnds(line, stiffness, damping); }
/// <summary> /// これはよくわからない。わすれました。両端が引っ張られて縮むのかな…。 /// いや締まるんじゃないかな、まっすぐに /// </summary> public void shrink(LineUnit line, Vector3 first, Vector3 last) { var ifirst = line.pointId; var ilast = ifirst + numberOfSegmnts + 1; velocities[ifirst] = (first - positions[ifirst]) * GM.t.deltaR; velocities[ilast] = (last - positions[ilast]) * GM.t.deltaR; positions[ifirst] = first; positions[ilast] = last; var dt = GM.t.delta; // > 0.1f ? 0.1f : GM.t.delta; var move = (last - first); var sqrmag = move.sqrMagnitude; var magR = MathOpt.invSqrt(sqrmag); var unit = magR * sqrmag / (numberOfSegmnts + 1); var dir = move * magR; for (var i = ifirst + 1; i < ilast; i++) { var desired = first + dir * (unit * i); // 速度 velocities[i] = (desired - positions[i]) * 0.5f * 120.0f; } for (var i = ifirst + 1; i < ilast; i++) { // 移動 positions[i] += velocities[i] * dt; } }