//頂点数だけculcする,done void calc_latt_deform(ref Vertex co, float weight, int ind) { //obは対象オブジェクト int defgrp_index = -1; var co_pre = co; Vector3 co_prev;// = sv( 0 ); float weight_blend = 0; if (EnableVertexGroup) { co_prev = co.Position; } //coはモデルのローカル頂点、ラティスの座標系に移動する var vec = latma.TransByMat(co.Position); float u, v, w; int ui, vi, wi; if (UVW[0] > 1) { u = (vec[0] - fu) / du; ui = Util.FloorToInt(u); u -= ui; key_curve_position_weights(u, tu, keytype); } else { tu[0] = tu[2] = tu[3] = 0.0f; tu[1] = 1.0f; ui = 0; } if (UVW[1] > 1) { v = (vec[1] - fv) / dv; vi = Util.FloorToInt(v); v -= vi; key_curve_position_weights(v, tv, keytype); } else { tv[0] = tv[2] = tv[3] = 0.0f; tv[1] = 1.0f; vi = 0; } if (UVW[2] > 1) { w = (vec[2] - fw) / dw; wi = Util.FloorToInt(w); w -= wi; key_curve_position_weights(w, tw, keytype); } else { tw[0] = tw[2] = tw[3] = 0.0f; tw[1] = 1.0f; wi = 0; } int idx_w = 0, idx_v, idx_u; int uu, vv, ww; for (ww = wi - 1; ww <= wi + 2; ww++) { //tw[0~3] w = tw[ww - wi + 1]; if (w != 0.0f) { if (ww > 0) { //idx_wをwi-1 * uの分割 *vの分割 if (ww < UVW[2]) { idx_w = ww * UVW[0] * UVW[1]; } else { idx_w = (UVW[2] - 1) * UVW[0] * UVW[1]; } } else { idx_w = 0; } for (vv = vi - 1; vv <= vi + 2; vv++) { v = w * tv[vv - vi + 1]; if (v != 0.0f) { if (vv > 0) { if (vv < UVW[1]) { idx_v = idx_w + vv * UVW[0]; } else { idx_v = idx_w + (UVW[1] - 1) * UVW[0]; } } else { idx_v = idx_w; } for (uu = ui - 1; uu <= ui + 2; uu++) { u = weight * v * tu[uu - ui + 1]; if (u != 0.0f) { if (uu > 0) { if (uu < UVW[0]) { idx_u = idx_v + uu; } else { idx_u = idx_v + (UVW[0] - 1); } } else { idx_u = idx_v; } int v1 = LatticeData.Length - idx_u - 1; var ldata = LatticeData[v1]; Vector3 vector3 = (ldata.Value.Position * u); co.Position += vector3; //co += transform.localPosition; //頂点グループが設定されているならウェイトをもらってきて計算に入れる if (defgrp_index != -1) //恐らくdvert[idx_u] { weight_blend += (u); //* defvert_find_weight(dvert + idx_u, defgrp_index)); } } } } } } } // 異様にuが小さくなってしまう co.Position += co_pre.Position; //if (defgrp_index != -1) //math_vector.c weight_blendで線形補完 // interp_v3_v3v3(co, co_prev, co, weight_blend); }