Пример #1
0
    bool InitSkin()
    {
        if (target)
        {
            SkinnedMeshRenderer skin = target.GetComponent <SkinnedMeshRenderer>();

            if (skin)
            {
                Quaternion rot = transform.rotation;
                attachrot = Quaternion.identity;

                skinned = true;

                Mesh ms = skin.sharedMesh;

                Vector3 pt = transform.position;

                CalcSkinVerts();
                Vector3   objSpacePt = pt;
                Vector3[] verts      = calcskinverts;
                int[]     tris       = ms.triangles;
                int       index      = -1;
                MegaNearestPointTest.NearestPointOnMesh1(objSpacePt, verts, tris, ref index, ref BaryCoord);                    //ref tribary);

                if (index >= 0)
                {
                    BaryVerts[0] = tris[index];
                    BaryVerts[1] = tris[index + 1];
                    BaryVerts[2] = tris[index + 2];
                }

                MegaNearestPointTest.NearestPointOnMesh1(objSpacePt + attachforward, verts, tris, ref index, ref BaryCoord1);

                if (index >= 0)
                {
                    BaryVerts1[0] = tris[index];
                    BaryVerts1[1] = tris[index + 1];
                    BaryVerts1[2] = tris[index + 2];
                }

                skinverts = new MegaSkinVert[6];

                for (int i = 0; i < 3; i++)
                {
                    int        vert = BaryVerts[i];
                    BoneWeight bw   = ms.boneWeights[vert];
                    skinverts[i] = new MegaSkinVert();

                    skinverts[i].vert       = vert;
                    skinverts[i].weights[0] = bw.weight0;
                    skinverts[i].weights[1] = bw.weight1;
                    skinverts[i].weights[2] = bw.weight2;
                    skinverts[i].weights[3] = bw.weight3;

                    skinverts[i].bones[0] = skin.bones[bw.boneIndex0];
                    skinverts[i].bones[1] = skin.bones[bw.boneIndex1];
                    skinverts[i].bones[2] = skin.bones[bw.boneIndex2];
                    skinverts[i].bones[3] = skin.bones[bw.boneIndex3];

                    skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0];
                    skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1];
                    skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2];
                    skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3];
                }

                for (int i = 3; i < 6; i++)
                {
                    int        vert = BaryVerts1[i - 3];
                    BoneWeight bw   = ms.boneWeights[vert];
                    skinverts[i] = new MegaSkinVert();

                    skinverts[i].vert = vert;

                    skinverts[i].weights[0] = bw.weight0;
                    skinverts[i].weights[1] = bw.weight1;
                    skinverts[i].weights[2] = bw.weight2;
                    skinverts[i].weights[3] = bw.weight3;

                    skinverts[i].bones[0] = skin.bones[bw.boneIndex0];
                    skinverts[i].bones[1] = skin.bones[bw.boneIndex1];
                    skinverts[i].bones[2] = skin.bones[bw.boneIndex2];
                    skinverts[i].bones[3] = skin.bones[bw.boneIndex3];

                    skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0];
                    skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1];
                    skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2];
                    skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3];
                }

                GetSkinPos1();
                attachrot = Quaternion.Inverse(transform.rotation) * rot;
                return(true);
            }
            else
            {
                skinned = false;
            }
        }

        return(false);
    }
Пример #2
0
    bool InitSkin()
    {
        if ( target )
        {
            SkinnedMeshRenderer skin = target.GetComponent<SkinnedMeshRenderer>();

            if ( skin )
            {
                Quaternion rot = transform.rotation;
                attachrot = Quaternion.identity;

                skinned = true;

                Mesh ms = skin.sharedMesh;

                Vector3 pt = transform.position;

                CalcSkinVerts();
                Vector3 objSpacePt = pt;
                Vector3[] verts = calcskinverts;
                int[] tris = ms.triangles;
                int index = -1;
                //Vector3 tribary = Vector3.zero;
                MegaNearestPointTest.NearestPointOnMesh1(objSpacePt, verts, tris, ref index, ref BaryCoord);	//ref tribary);

                if ( index >= 0 )
                {
                    BaryVerts[0] = tris[index];
                    BaryVerts[1] = tris[index + 1];
                    BaryVerts[2] = tris[index + 2];
                }

                //Vector3 worldPt = target.transform.TransformPoint(meshPt);

                //if ( index >= 0 )
                //{
                    //Vector3 cp2 = GetCoordMine(verts[tris[index]], verts[tris[index + 1]], verts[tris[index + 2]], tribary);
                    //worldPt = cp2;
                //}

                MegaNearestPointTest.NearestPointOnMesh1(objSpacePt + attachforward, verts, tris, ref index, ref BaryCoord1);

                if ( index >= 0 )
                {
                    BaryVerts1[0] = tris[index];
                    BaryVerts1[1] = tris[index + 1];
                    BaryVerts1[2] = tris[index + 2];
                }

                skinverts = new MegaSkinVert[6];

                for ( int i = 0; i < 3; i++ )
                {
                    int vert = BaryVerts[i];
                    BoneWeight bw = ms.boneWeights[vert];
                    skinverts[i] = new MegaSkinVert();

                    skinverts[i].vert = vert;
                    skinverts[i].weights[0] = bw.weight0;
                    skinverts[i].weights[1] = bw.weight1;
                    skinverts[i].weights[2] = bw.weight2;
                    skinverts[i].weights[3] = bw.weight3;

                    skinverts[i].bones[0] = skin.bones[bw.boneIndex0];
                    skinverts[i].bones[1] = skin.bones[bw.boneIndex1];
                    skinverts[i].bones[2] = skin.bones[bw.boneIndex2];
                    skinverts[i].bones[3] = skin.bones[bw.boneIndex3];

                    skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0];
                    skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1];
                    skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2];
                    skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3];
                }

                for ( int i = 3; i < 6; i++ )
                {
                    int vert = BaryVerts1[i - 3];
                    BoneWeight bw = ms.boneWeights[vert];
                    skinverts[i] = new MegaSkinVert();

                    skinverts[i].vert = vert;

                    skinverts[i].weights[0] = bw.weight0;
                    skinverts[i].weights[1] = bw.weight1;
                    skinverts[i].weights[2] = bw.weight2;
                    skinverts[i].weights[3] = bw.weight3;

                    skinverts[i].bones[0] = skin.bones[bw.boneIndex0];
                    skinverts[i].bones[1] = skin.bones[bw.boneIndex1];
                    skinverts[i].bones[2] = skin.bones[bw.boneIndex2];
                    skinverts[i].bones[3] = skin.bones[bw.boneIndex3];

                    skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0];
                    skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1];
                    skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2];
                    skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3];
                }

                //Vector3 up = transform.up;
                //Vector3 fwd = transform.forward;
                GetSkinPos1();
                attachrot = Quaternion.Inverse(transform.rotation) * rot;

                //Debug.Log("arot " + attachrot.eulerAngles);
                return true;
            }
            else
                skinned = false;
        }

        return false;
    }