//①Form.OnLoadをオーバーライドする。 protected override void OnLoad(EventArgs e) { base.OnLoad(e); //RenderFormはOnLoad内で3DCG空間を初期化しているため、base.OnLoadがOnLoad内で一番初めに呼ぶべきである。 //ファイルを開くダイアログ OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { //ダイアログの返値がOKの場合、モデルの読み込み処理をする //②モデルを読み込む PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);//MMDModel MMDModelWithPhysics.OpenLoad(string ファイル名,RenderContext);となっています //以下のように書けば、物理演算を無効にして読み込むことも可能 //MMDModel model=MMDModel.OpenLoad(ofd.FileName, RenderContext); //RenderContextはカメラの情報やデバイスの情報など3DCG描画に必要な変数である。RenderFormを継承している場合、メンバー変数として利用可能である。 //基本的にモデルなどの読み込みが必要なものは、DirectX11デバイスの情報などを保持するRenderContextの値を要求する場合が多い。 //③ワールド空間にモデルを追加する WorldSpace.AddResource(model); //WorldSpaceは、このフォームの描画する3D空間を示している。ここにモデルなど(IDrawableを実装している)ものを渡すと、描画してくれる。 //WorldSpaceは、ScreenContext.WorldSpaceと常に等しい。ウィンドウごとに必要な3DCG描画に必要な情報はScreenContextに保管されている。 } }
protected override void OnClosed(EventArgs e) { model?.Dispose(); model = null; base.OnClosed(e); }
static void FindTextures(PMXModel md, string[] textureFolders, string outputFolder) { string textureOutputFolder = outputFolder + Path.DirectorySeparatorChar.ToString() + "tex"; foreach (PMXMaterial mat in md.Materials) { if (mat.DiffuseTexture == null || mat.DiffuseTexture.Length == 0) { continue; } string texFileName = mat.DiffuseTexture; if (File.Exists(textureOutputFolder + Path.DirectorySeparatorChar.ToString() + texFileName)) { mat.DiffuseTexture = "tex\\" + mat.DiffuseTexture; continue; } foreach (string textureFolder in textureFolders) { if (File.Exists(textureFolder + Path.DirectorySeparatorChar.ToString() + texFileName)) { mat.DiffuseTexture = "tex\\" + mat.DiffuseTexture; if (!Directory.Exists(textureOutputFolder)) { Directory.CreateDirectory(textureOutputFolder); } File.Copy(textureFolder + Path.DirectorySeparatorChar.ToString() + texFileName, textureOutputFolder + Path.DirectorySeparatorChar.ToString() + texFileName); break; } } } }
/// <summary> /// モデルの初期状態における外接直方体を計算します. /// </summary> /// <param name="model">対称のモデル.</param> /// <returns>外接直方体.</returns> private static CubeF CalculateModelCube(PMXModel model) { VertexList list = model.Model.VertexList; float left, top, right, bottom, front, back; VertexData first = list.Vertexes.First(); left = right = first.Position.X; top = bottom = first.Position.Y; front = back = first.Position.Z; foreach (VertexData v in list.Vertexes) { left = v.Position.X < left ? v.Position.X : left; top = top < v.Position.Y ? v.Position.Y : top; right = right < v.Position.X ? v.Position.X : right; bottom = v.Position.Y < bottom ? v.Position.Y : bottom; front = v.Position.Z < front ? v.Position.Z : front; back = back < v.Position.Z ? v.Position.Z : back; } return(new CubeF { X = left, Width = right - left, Y = bottom, Height = top - bottom, Z = front, Depth = back - front }); }
//①Form.OnLoadをオーバーライドする。 protected override void OnLoad(EventArgs e) { base.OnLoad(e); //The RenderForm Initializes the 3D space within the OnLoad for the base.OnLoadがOnLoad内で一番初めに呼ぶべきである。 //The file open dialog OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { //OK if the return value of the dialog to model loading process //②モデルを読み込む PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);//MMDModel MMDModelWithPhysics.OpenLoad(string ファイル名,RenderContext);となっています //Possible to disable physics if you write the following in the load //MMDModel model=MMDModel.OpenLoad(ofd.FileName, RenderContext); //RenderContext is required to draw the camera or device information, including 3D variable。RenderFormを継承している場合、メンバー変数として利用可能である。 //To request the value of RenderContext DirectX11 device information to hold a basically loads, such as those that require a lot。 //③ワールド空間にモデルを追加する WorldSpace.AddResource(model); //WorldSpace shows the 3D space to draw on this form.。ここにモデルなど(IDrawableを実装している)ものを渡すと、描画してくれる。 //WorldSpace is a ScreenContext.WorldSpaceと常に等しい。ウィンドウごとに必要な3DCG描画に必要な情報はScreenContextに保管されている。 } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext); OpenFileDialog ofd2 = new OpenFileDialog(); ofd2.Filter = "vmdモーションファイル(*.vmd)|*.vmd"; if (ofd2.ShowDialog() == DialogResult.OK) { IMotionProvider motion = model.MotionManager.AddMotionFromFile(ofd2.FileName, true); model.MotionManager.ApplyMotion(motion, 0, ActionAfterMotion.Replay); } WorldSpace.AddResource(model); //③ カメラモーションの選択ダイアログを表示し、選ばれたものをScreenContext.CameraMotionProviderに代入する。 CameraControlSelector selector = new CameraControlSelector(model); selector.ShowDialog(this); ScreenContext.CameraMotionProvider = selector.ResultCameraMotionProvider; /* * ScreenContext.CameraMotionProviderに代入されたインターフェースのUpdateCameraが毎回呼ばれることによりカメラを更新している。 * この変数の型はICameraMotionProviderのため、これを実装すればカメラの動きは容易に定義可能である。 */ } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext); OpenFileDialog ofd2 = new OpenFileDialog(); ofd2.Filter = "vmdモーションファイル(*.vmd)|*.vmd"; if (ofd2.ShowDialog() == DialogResult.OK) { IMotionProvider motion = model.MotionManager.AddMotionFromFile(ofd2.FileName, true); model.MotionManager.ApplyMotion(motion, 0, ActionAfterMotion.Replay); } WorldSpace.AddResource(model); //②コントローラーフォームに対して読み込んだモデルを渡して表示します。 Controller controller = new Controller(model); controller.Show(); } }
public MaterialMorphProvider(PMXModel model) { this.model = model; foreach (MorphData materialMorphData in model.Model.MorphList.Morphes) { if(materialMorphData.type==MorphType.Matrial)Morphs.Add(materialMorphData.MorphName,new MaterialMorphData(materialMorphData)); } }
private static PMXVertex ReplaceVertexIfRequired(PMXVertex input, PMXModel md, int[] duplicateList) { int dupIndex = duplicateList[((PMXExtendedVertex)input).EasySlashIndex]; if (dupIndex >= 0) { return(md.Vertices[dupIndex]); } return(input); }
public ModelData(string name, PMXModel model, IShell shell) { Name = name; Model = model; shell.LoadModel(model); MotionManager = new ModelMotionManager(model); ModelCube = CalculateModelCube(model); _baloonReferenceBone = model.Skinning.BoneDictionary["頭"]; _centerReferenceBone = model.Skinning.BoneDictionary["下半身"]; }
public BoneMorphProvider(PMXModel model) { this.skinningProvider = model.Skinning; foreach (MorphData morphData in model.Model.MorphList.Morphes) { if (morphData.type == MorphType.Bone) { this.MorphList.Add(morphData.MorphName, new BoneMorphData(morphData)); } } }
private void Add2Form1_Click(object sender, EventArgs e) { var ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { PMXModel model = PMXModel物理変形付き.ファイルから読み込む(ofd.FileName); form1.ScreenContext.ワールド空間.Drawableを追加する(model); } }
private void loadModel_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog(this) == DialogResult.OK) { model = PMXModelWithPhysics.OpenLoad(ofd.FileName, renderControl1.RenderContext); renderControl1.WorldSpace.AddResource(model); } }
public PMXMorphManager(PMXModel model) { this.MMDMorphs.Add(new VertexMorphProvider(model.Model, model.BufferManager)); this.MMDMorphs.Add(new BoneMorphProvider(model)); this.MMDMorphs.Add(new MaterialMorphProvider(model)); this.MMDMorphs.Add(new GroupMorphProvider(model, this)); this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV)); this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional1)); this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional2)); this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional3)); this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional4)); }
private void Add2ChildForm_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, childForm.RenderContext); //RenderContext pass here are common in childForm form1 so good either childForm.WorldSpace.AddResource(model); } }
private void Add2ChildForm_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, childForm.RenderContext); //ここで渡すRenderContextはform1とchildFormで共通しているのでどちらでも良い childForm.WorldSpace.AddResource(model); } }
public override void Subscribe(EffectVariable subscribeTo, SubscribeArgument variable) { if (!this.isCached) { this.modelCache = variable.Model as PMXModel; this.isCached = true; } if (this.modelCache != null) { Subscribe(subscribeTo, this.modelCache.MotionManager, variable.Context); } }
static void Main(string[] args) { /*string folder = @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\0500\001"; * * string[] textureFolders = new string[2] * { * @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\texture", * @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\texture2" * };*/ string folder = @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011"; string[] textureFolders = new string[2] { @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011\texture\001", @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011\face\001" }; Stopwatch sw = Stopwatch.StartNew(); string[] ism2Files = Directory.GetFiles(folder, "*.ism2"); foreach (string ism2 in ism2Files) { if (ism2.IndexOf("col_") != -1) { continue; //Don't export collission data } string outputDir = Path.GetDirectoryName(ism2) + Path.DirectorySeparatorChar.ToString() + "pmx"; if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } string pmx = outputDir + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(Path.ChangeExtension(ism2, ".pmx")); Console.WriteLine("Importing " + Path.GetFileNameWithoutExtension(ism2)); PMXModel md = ISMModel.ImportISM(ism2); CleanUpModel(md); TriangleClearance.SeperateTriangles(md, false, true); MirrorX(md); FindTextures(md, textureFolders, outputDir); md.SaveToFile(pmx); Console.WriteLine(""); } sw.Stop(); Console.WriteLine("Import complete - " + (int)Math.Round(sw.Elapsed.TotalSeconds) + " seconds"); Console.ReadLine(); }
/// <summary> /// Constractor /// /// </summary> /// <param name="model"></param> /// <param name="boneName"></param> /// <param name="distance"></param> /// <param name="viewFrom"></param> /// <param name="rotationZaxis"></param> public BoneFollowCameraMotionProvider(PMXModel model, string boneName, float distance, Vector3 viewFrom, bool rotationZaxis = false) { this.followModel = model; var bones = (from bone in model.Skinning.Bone where bone.BoneName == boneName select bone).ToArray(); if (bones.Length == 0) { throw new InvalidOperationException(string.Format("ボーン\"{0}\"は見つかりませんでした。", boneName)); } this.followBone = bones[0]; this.Distance = distance; this.IsRotationZAxis = rotationZaxis; this.ViewFrom = viewFrom; }
public static void StraightenHierarchie(PMXModel mdl, PMXBone source) { List <PMXBone> bones = new List <PMXBone>() { source }; bones.AddRange(GetAllChildBones(mdl, source)); foreach (PMXBone b in bones) { b.CreateLocalCoodinateAxis(); } }
public GroupMorphProvider(PMXModel model, IMorphManager morph) { this.morphManager = morph; int i = 0; foreach (MorphData morphData in model.Model.MorphList.Morphes) { if (morphData.type == MorphType.Group) { this.Morphs.Add(morphData.MorphName, new GroupMorphData(morphData)); } this.morphNameList.Add(i, morphData.MorphName); i++; } }
public void TestLoadmodel() { var form = new RenderForm(); RenderContext Context = new RenderContext(); ScreenContext _scContext = Context.Initialize(form); PMXModel Model = PMXModelWithPhysics.OpenLoad(@"C:\Users\ZhiYong\Documents\CodeBase\mmflex\debug\1.pmx", Context); Model.Transformer.Position = new Vector3(0, 0, 0); _scContext.WorldSpace.AddResource(Model); _scContext.Dispose(); Model.Dispose(); Context.Dispose(); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == DialogResult.OK) { PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext); WorldSpace.AddResource(model); //②ボーン、モーフの編集用に作成したサンプルのGUIを表示する TransformController controller=new TransformController(model); controller.Show(this); } }
protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "表示するモデルファイルを選んでください。"; ofd.Filter = "PMXモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == true) { PMXModel model = PMXModel.OpenLoad(ofd.FileName, RenderControl.RenderContext); RenderControl.WorldSpace.AddResource(model); RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraPosition = new Vector3(0, 10, -25); RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraLookAt = new Vector3(0, 10, 0); RenderControl.TextureContext.CameraMotionProvider = new WPFBasicCameraControllerMotionProvider(RenderControl, 10);//So do not react only on a fully transparent controls with the color of the Background#01000000などにすることでウィンドウ全域で反応するようになる。 } }
protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "表示するモデルファイルを選んでください。"; ofd.Filter = "PMXモデルファイル(*.pmx)|*.pmx"; if (ofd.ShowDialog() == true) { PMXModel model = PMXModel.OpenLoad(ofd.FileName, RenderControl.RenderContext); RenderControl.WorldSpace.AddResource(model); RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraPosition = new Vector3(0, 10, -25); RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraLookAt = new Vector3(0, 10, 0); RenderControl.TextureContext.CameraMotionProvider = new WPFBasicCameraControllerMotionProvider(RenderControl, 10);//コントロールを完全に透過すると、色のある部分の上しか反応しないので、Backgroundを#01000000などにすることでウィンドウ全域で反応するようになる。 } }
public UVMorphProvider(PMXModel model, MorphType targetType) { bufferManager = model.BufferManager; targetMorph = targetType; this.model = model.Model; if (model.Model.Header.AdditionalUVCount + 2 <= (int)targetType) { return; //このとき対応した追加UVは存在しない } foreach (MorphData morphData in model.Model.MorphList.Morphes) { if (morphData.type == targetMorph) { Morphs.Add(morphData.MorphName, new UVMorphData(morphData)); } } }
public static List <PMXBone> GetAllChildBones(PMXModel mdl, PMXBone parent) { List <PMXBone> res = new List <PMXBone>(); foreach (PMXBone b in mdl.Bones) { if (b.Parent != parent) { continue; } res.Add(b); res.AddRange(GetAllChildBones(mdl, b)); } return(res); }
public UVMorphProvider(PMXModel model, MorphType targetType) { this.bufferManager = model.BufferManager; this.targetMorph = targetType; this.model = model.Model; if (model.Model.Header.AdditionalUVCount + 2 <= (int)targetType) { return; //Does not exist at this time for additional UV } foreach (MorphData morphData in model.Model.MorphList.Morphes) { if (morphData.type == this.targetMorph) { this.Morphs.Add(morphData.MorphName, new UVMorphData(morphData)); } } }
protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); //② 使い方は今までのサンプルとほとんど同じだが、Renderメソッドなどを呼び出す必要性はない。 //Also, you need to override WPFRenderControl if the RenderContext is created automatically, but this is disgusting。 //The initialization, such as recommended in the OnInitialized RenderControl.Background = new Color4(1, 0, 0, 1); BasicGrid grid = new BasicGrid(); grid.Load(RenderControl.RenderContext); RenderControl.WorldSpace.AddResource(grid); RenderControl.TextureContext.CameraMotionProvider = new WPFBasicCameraControllerMotionProvider(this); OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == true) { PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderControl.RenderContext); RenderControl.WorldSpace.AddResource(model); } }
public static void SeperateTriangles(PMXModel model, bool ignoreSmallParts, bool combineVertexLocations) { TriangleClearance clearModel = new TriangleClearance(model, ignoreSmallParts, combineVertexLocations); int i = 0; for (i = 0; i < clearModel._model.Vertices.Count; i++) { ((PMXExtendedVertex)clearModel._model.Vertices[i]).EasySlashIndex = i; } List <PMXMaterial> resultMaterials = new List <PMXMaterial>(); foreach (PMXMaterial mat in clearModel._model.Materials) { List <PMXMaterial> splittedMaterials = clearModel.SplitTriangles(mat); resultMaterials.AddRange(splittedMaterials); } clearModel._model.Materials.Clear(); clearModel._model.Materials.AddRange(resultMaterials); }