/** * 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; }
//この関数で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; }
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; }
// 初期化 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 + @"/表情"); }