Пример #1
0
        /**
         * DirectX管理下にあるPMDデータを作成します。
         * このAPIは低速系です。
         **/
        public void setPmd(MmdPmdModel i_pmd, IMmdDataIo i_io)
        {
            releaseD3dResource();

            this._ref_pmd = i_pmd;
            int number_of_vertex = i_pmd.getNumberOfVertex();

            this._vertex_array = new CustomVertex.PositionNormalTextured[number_of_vertex];


            MmdTexUV[] uv_array = i_pmd.getUvArray();
            //先にセットできるものはセットしておく
            for (int i = 0; i < number_of_vertex; i++)
            {
                this._vertex_array[i].Tu = uv_array[i].u;
                this._vertex_array[i].Tv = uv_array[i].v;
            }

            //matreial
            PmdMaterial[]      m             = i_pmd.getMaterials();
            List <D3dMaterial> d3d_materials = new List <D3dMaterial>();

            for (int i = 0; i < m.Length; i++)
            {
                short[]     indics_array = i_pmd.getIndicsArray();
                D3dMaterial new_material = new D3dMaterial();
                //indics配列の分解
                short[] tmp_indics = new short[m[i].number_of_indics];
                System.Array.Copy(indics_array, m[i].start_of_indics, tmp_indics, 0, tmp_indics.Length);
                new_material.index_buf = new IndexBuffer(this._device, tmp_indics.Length * sizeof(short), Usage.WriteOnly, Pool.Managed, true);
                new_material.index_buf.SetData(tmp_indics, 0, 0);


                new_material.material.DiffuseColor      = new ColorValue(m[i].col4Diffuse.r, m[i].col4Diffuse.g, m[i].col4Diffuse.b, m[i].col4Diffuse.a);
                new_material.material.AmbientColor      = new ColorValue(m[i].col4Ambient.r, m[i].col4Ambient.g, m[i].col4Ambient.b, m[i].col4Ambient.a);
                new_material.material.SpecularColor     = new ColorValue(m[i].col4Specular.r, m[i].col4Specular.g, m[i].col4Specular.b, m[i].col4Specular.a);
                new_material.material.SpecularSharpness = m[i].fShininess;
                if (m[i].texture_name != null)
                {
                    new_material.texture = this._texture_list.getTexture(m[i].texture_name, i_io);
                }
                else
                {
                    new_material.texture = null;
                }
                new_material.unknown      = m[i].unknown;
                new_material.ulNumIndices = tmp_indics.Length;
                d3d_materials.Add(new_material);
            }
            this._materials = d3d_materials.ToArray();
            //
            this._vertex_buffer = new VertexBuffer(
                typeof(CustomVertex.PositionNormalTextured),
                number_of_vertex, this._device, 0, CustomVertex.PositionNormalTextured.Format, Pool.Managed);
            return;
        }
Пример #2
0
        //この関数でthis._vertex_arrayを更新する。
        public void updateSkinning(MmdMatrix[] i_skinning_mat)
        {
            MmdPmdModel pmd = this._ref_pmd;
            int         number_of_vertex = pmd.getNumberOfVertex();

            MmdVector3[]  org_pos_array    = pmd.getPositionArray();
            MmdVector3[]  org_normal_array = pmd.getNormatArray();
            PmdSkinInfo[] org_skin_info    = pmd.getSkinInfoArray();
            CustomVertex.PositionNormalTextured[] vertex_array = this._vertex_array;
            // 頂点スキニング
            MmdMatrix  matTemp  = new MmdMatrix();
            MmdVector3 position = new MmdVector3();
            MmdVector3 normal   = new MmdVector3();

            for (int i = 0; i < number_of_vertex; i++)
            {
                PmdSkinInfo si = org_skin_info[i];
                if (si.fWeight == 0.0f)
                {
                    MmdMatrix mat = i_skinning_mat[si.unBoneNo[1]];
                    position.Vector3Transform(org_pos_array[i], mat);
                    normal.Vector3Rotate(org_normal_array[i], mat);
                }
                else if (si.fWeight >= 0.9999f)
                {
                    MmdMatrix mat = i_skinning_mat[si.unBoneNo[0]];
                    position.Vector3Transform(org_pos_array[i], mat);
                    normal.Vector3Rotate(org_normal_array[i], mat);
                }
                else
                {
                    MmdMatrix mat0 = i_skinning_mat[si.unBoneNo[0]];
                    MmdMatrix mat1 = i_skinning_mat[si.unBoneNo[1]];
                    matTemp.MatrixLerp(mat0, mat1, si.fWeight);
                    position.Vector3Transform(org_pos_array[i], matTemp);
                    normal.Vector3Rotate(org_normal_array[i], matTemp);
                }
                //ここの転写は少し考える。
                vertex_array[i].X  = position.x;
                vertex_array[i].Y  = position.y;
                vertex_array[i].Z  = position.z;
                vertex_array[i].Nx = normal.x;
                vertex_array[i].Ny = normal.y;
                vertex_array[i].Nz = normal.z;
            }
            return;
        }
Пример #3
0
        public void setPmd(MmdPmdModel i_pmd, IMmdDataIo i_io)
        {
            this._ref_pmd = i_pmd;

            Device dev = this._device;

            int number_of_vertex = i_pmd.getNumberOfVertex();

            this._vertex_array = new CustomVertex.PositionNormalTextured[number_of_vertex];

            MmdTexUV[] uv_array = i_pmd.getUvArray();
            //先にセットできるものはセットしておく
            for (int i = 0; i < number_of_vertex; i++)
            {
                this._vertex_array[i].Tu = uv_array[i].u;
                this._vertex_array[i].Tv = uv_array[i].v;
            }

            short[] indics_array = i_pmd.getIndicsArray();

            // メッシュを作成
            // 参考:http://msdn.microsoft.com/ja-jp/library/ms229646%28VS.80%29.aspx
            Mesh mesh = new Mesh(indics_array.Length / 3, number_of_vertex, MeshFlags.Managed, createVertexElements(), dev);

            mesh.VertexBuffer.SetData(this._vertex_array, 0, LockFlags.None);
            mesh.IndexBuffer.SetData(indics_array, 0, LockFlags.None);
            dev.VertexDeclaration = new VertexDeclaration(dev, createVertexElements());


            // DrawSubsetのインデックスを設定
            int[] attrBuf = mesh.LockAttributeBufferArray(LockFlags.None);
            makeSubsetIndex(i_pmd.getMaterials(), ref attrBuf);
            mesh.UnlockAttributeBuffer(attrBuf);

            //コンテナを一回解放
            if (this._container != null)
            {
                this._container.Dispose();
                this._container = null;
            }
            // モデルをメッシュコンテナに格納
            NyMmdMeshContainer container = new NyMmdMeshContainer(dev, i_io, i_pmd.getMaterials());

            container.mesh  = mesh;
            this._container = container;
        }
Пример #4
0
        // 初期化
        public void initialize(string pmd_FileName, string vmd_FileName)
        {
            // PMDファイルを開く
            StreamReader pmds = new StreamReader(pmd_FileName);

            pmd = new MmdPmdModel(pmds);

            // VMDファイルを開く
            StreamReader vmds = new StreamReader(vmd_FileName);

            vmd = new MmdVmdMotion(vmds);

            //Mmdプレイヤーのオブジェクトを作る
            player = new MmdMotionPlayer(this.pmd, this.vmd);

            player.setLoop(false); // ループさせるフラグ


            // -----------------------------------------------------
            // 表情ファイルを読みとる
            morph.Load(Application.StartupPath + @"/表情");
        }