Exemple #1
0
    //頂点数だけ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);
    }