残したいユーザーブロマガ記事への投票はこちらです
闇鍋プラグイン(https://bowlroll.net/file/9765)に
選択面をコピーする機能追加しました。
・CopyFace.dll [FACE] 選択面をコピーする。
・CopyFaceNewMaterial.dll [FACE] 選択面をコピーする。(新規材質)
選択した面を同一材質にコピーする。/選択面を新規材質にコピーする。
・[FACE] 選択面をコピーする。
1.PMXViewにて面を選択し実行します。
2.面が同一材質に追加されます。
・[FACE] 選択面をコピーする。(新規材質)
1.PMXViewにて面を選択し実行します。
2.元材質名_Addという材質が追加されそこに選択面がコピーされます。
以上です。
この記事のコメント欄は以下の記事通り解放します。
http://ch.nicovideo.jp/t0r0/blomaga/ar760385
面の処理少々めんどうだったのでメモがわり
/// <summary>
/// 面の含まれる材質を取得する。
/// </summary>
/// <param name="Face"></param>
/// <param name="type"></param>
/// <returns></returns>
private IPXMaterial GetFaceMaterial(IPXFace Face, int type = 0)
{
int Index = this.GetFaceMaterialIndex(Face, type);
if (Index != -1)
{
return this.PMX.Material[Index];
}
else
{
return null;
}
}
/// <summary>
/// 面の含まれる材質Indexを取得する。
/// </summary>
/// <param name="Face"></param>
/// <param name="type"></param>
/// <returns></returns>
private int GetFaceMaterialIndex(IPXFace Face, int type = 0)
{
for (int i = 0; i < this.PMX.Material.Count; i++)
{
for (int j = 0; j < this.PMX.Material[i].Faces.Count; j++)
{
if (this.PMX.Material[i].Faces[j] == Face)
{
return i;
}
}
}
if (type == 0)
{
return -1;
}
else
{
throw new System.Exception("面を含む材質は存在しません。");
}
}
/// <summary>
/// 選択した面をリストアップする。
/// </summary>
/// <returns></returns>
private List<IPXFace> GetSelectedFaceList()
{
List<IPXFace> Faces = new List<IPXFace>();
List<IPXFace> AllFaces = this.GetAllFaceList();
for (int i = 0; i < this.connect.View.PmxView.GetSelectedFaceIndices().Length; i++)
{if (this.connect.View.PmxView.GetSelectedFaceIndices()[i] % 3 == 0)
{
Faces.Add(AllFaces[this.connect.View.PmxView.GetSelectedFaceIndices()[i] / 3]);
}
}
return Faces;
}/// <summary>
/// 面の含まれる材質Indexと面Indexを取得する。
/// </summary>
/// <param name="Face"></param>
/// <param name="MaterialIndex"></param>
/// <param name="FaceIndex"></param>
private void GetFaceInfo(IPXFace Face, out int MaterialIndex, out int FaceIndex)
{
for (int i = 0; i < this.PMX.Material.Count; i++)
{
for (int j = 0; j < this.PMX.Material[i].Faces.Count; j++)
{
if (this.PMX.Material[i].Faces[j] == Face)
{
MaterialIndex = i;
FaceIndex = j;
return;
}
}
}
MaterialIndex = -1;
FaceIndex = -1;
}
/// <summary>
/// すべての面リストを生成する。
/// </summary>
/// <returns></returns>
private List<IPXFace> GetAllFaceList()
{
List<IPXFace> ret = new List<IPXFace>();
for (int i = 0; i < this.PMX.Material.Count; i++)
{
for (int j = 0; j < this.PMX.Material[i].Faces.Count; j++)
{
ret.Add(this.PMX.Material[i].Faces[j]);
}
}
return ret;
}/// <summary>
/// 面に含まれる法線の外積
/// </summary>
/// <param name="Face"></param>
/// <returns></returns>
private V3 GetFaceNormal(IPXFace Face)
{
V3 ret = Vector3.Cross(Face.Vertex2.Position - Face.Vertex1.Position,Face.Vertex3.Position - Face.Vertex1.Position);
ret.Normalize();
return ret;
}