T0R0ブロマガ相关翻译计划(0.6)_PMDE插件的制作方法 骨骼操作篇5
※本文不保证百分之百的翻译准确,仅供参考,具体内容依然以日文原版为准。
原作者T0R0的博客原地址:https://sp.ch.nicovideo.jp/t0r0/blomaga/ar155800
本文内容与暗锅插件并无关系,但也可能能对他人有所帮助,所以也进行翻译。关于对本文翻译内容玩文字游戏、钻空子,从而违反原文使用规约的行为,本人概不负责。
※非原文部分会使用灰色字色。对一些个人认为重要的部分会进行加粗/变色强调。
PMXe相关名词以Emil制作的“多功能信息处理与汉化插件”中的文本为准。
文中图片均为本人依照原博客自作而非搬运,请注意。
对个别词的理解有一定的主观成分,且本文有编程相关专业名词可能会有误译,欢迎评论区理性讨论。
※本篇翻译文章并未获得原作者授权/知悉,仅做交流用途。如有不妥,请评论区留言告知,我会立刻进行删除。
※请勿使用本文章内任何文本/图片做个人参考以外的其他用途,包括但不限于用于汉化文本,二次上传至公共网络等。
○仅限于「PMDE插件的制作方法」系列文章,请自由地取用文章中的代码部分文本(蓝色文本)。对代码中的注释都进行了翻译,虽然并不专业,但希望能为中文使用者提供些许的便利。

原文投稿日期为2013/03/12 21:11

PMDE插件的制作方法 骨骼操作篇4
虽说是插件但也只是普通的C#所以有很多种记载方法,但为了让文章更加易懂,在此为记载方法添加限制。并不是只有这一种写法,请注意。
与上次相同,本文会以此项目示例文件(http://bowlroll.net/up/dl15339)为基础进行说明,所以请务必下载。
在此文件中事先记载了骨骼操作所必需的功能。说明也会按照文件内容的顺序进行。以及,可以使用此项目文件中的内容制作插件。
接下来将会记载骨骼操作与对应的代码。与上次相同,应该直接复制粘贴到项目示例文件中就可以使用。
1.来做多段化吧
作为示例将使右ひじ多段化。
//试着把右ひじ多段化。
IPXBone BaseBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右ひじ", 1)];
//制作一个暂时储存多段骨的箱子
List<IPXBone> LayerBoneList = new List<IPXBone>();
//多段数
int layer = 3;
for (int i = 0; i < layer; i++)
{
//从原骨骼中复制出多段骨
IPXBone LayerBone = (IPXBone)BaseBone.Clone();
//为了不重名进行改名
LayerBone.Name = BaseBone.Name + "_" + i.ToString();
//将骨骼追加与原骨骼的上方(骨骼顺序)
this.UpperInsertBone(LayerBone, BaseBone);
//保存于暂时储存箱
LayerBoneList.Add(LayerBone);
}
//亲骨的设置
LayerBoneList[0].Parent = BaseBone.Parent;
for (int j = 1; j < layer; j++)
{
LayerBoneList[j].Parent = LayerBoneList[j - 1];
}
BaseBone.Parent = LayerBoneList[layer - 1];
这样就姑且是将右ひじ进行了3段多段化。
但是,以各个单独骨骼为单位来记载这些内容比较麻烦
所以接下来试着把多段化的部分记为函数。
public void CreateLayerBone(IPXBone BaseBone,int layer = 3){
//暂时储存多段骨的箱子
List<IPXBone> LayerBoneList = new List<IPXBone>();
for (int i = 0; i < layer; i++)
{
//从原骨骼中复制出多段骨
IPXBone LayerBone = (IPXBone)BaseBone.Clone();
//为了不重名进行改名
LayerBone.Name = BaseBone.Name + "_" + i.ToString();
//将骨骼追加与原骨骼的上方(骨骼顺序)
this.UpperInsertBone(LayerBone, BaseBone);
//保存于暂时储存箱
LayerBoneList.Add(LayerBone);
}
//亲骨的设置
LayerBoneList[0].Parent = BaseBone.Parent;
for (int j = 1; j < layer; j++)
{
LayerBoneList[j].Parent = LayerBoneList[j - 1];
}
BaseBone.Parent = LayerBoneList[layer - 1];
}
按这样的感觉进行函数化后添加到项目里的话
就可以只记载为以下内容。
例)各自多段化右肩(10段)/右腕(10段)/右ひじ(10段)/右手首(3段)。
IPXBone RightShoulder = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右肩", 1)];
IPXBone RightArm = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右腕", 1)];
IPXBone RightElbow = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右ひじ", 1)];
IPXBone RightWrist = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右手首", 1)];
this.CreateLayerBone(RightShoulder,10);
this.CreateLayerBone(RightArm,10);
this.CreateLayerBone(RightElbow,10);
this.CreateLayerBone(RightWrist,3);
像这样整理为处理单元后后续就会便利很多。
下次将会记载骨骼表示枠相关的内容。