ニコニコ
ユーザーブロマガは2021年10月7日をもちましてサービスを終了いたしました。
このページは皆さまから投票いただいた記事を保存したものです。

T0R0のブロマガ

闇鍋プラグイン 選択面のコピー機能

2015-09-14 01:13:45

闇鍋プラグイン(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


面の処理少々めんどうだったのでメモがわり

/// lt;summarygt;
/// 面の含まれる材質を取得する。
/// lt;/summarygt;
/// lt;param name="Face"gt;lt;/paramgt;
/// lt;param name="type"gt;lt;/paramgt;
/// lt;returnsgt;lt;/returnsgt;
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;
}
}
/// lt;summarygt;
/// 面の含まれる材質Indexを取得する。
/// lt;/summarygt;
/// lt;param name="Face"gt;lt;/paramgt;
/// lt;param name="type"gt;lt;/paramgt;
/// lt;returnsgt;lt;/returnsgt;
private int GetFaceMaterialIndex(IPXFace Face, int type = 0)
{
for (int i = 0; i lt; this.PMX.Material.Count; i++)
{
for (int j = 0; j lt; 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("面を含む材質は存在しません。");
}
}
/// lt;summarygt;
/// 選択した面をリストアップする。
/// lt;/summarygt;
/// lt;returnsgt;lt;/returnsgt;
private Listlt;IPXFacegt; GetSelectedFaceList()
{
Listlt;IPXFacegt; Faces = new Listlt;IPXFacegt;();
Listlt;IPXFacegt; AllFaces = this.GetAllFaceList();
for (int i = 0; i lt; 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;
}

/// lt;summarygt;
/// 面の含まれる材質Indexと面Indexを取得する。
/// lt;/summarygt;
/// lt;param name="Face"gt;lt;/paramgt;
/// lt;param name="MaterialIndex"gt;lt;/paramgt;
/// lt;param name="FaceIndex"gt;lt;/paramgt;
private void GetFaceInfo(IPXFace Face, out int MaterialIndex, out int FaceIndex)
{
for (int i = 0; i lt; this.PMX.Material.Count; i++)
{
for (int j = 0; j lt; this.PMX.Material[i].Faces.Count; j++)
{
if (this.PMX.Material[i].Faces[j] == Face)
{
MaterialIndex = i;
FaceIndex = j;
return;
}
}
}
MaterialIndex = -1;
FaceIndex = -1;
}
/// lt;summarygt;
/// すべての面リストを生成する。
/// lt;/summarygt;
/// lt;returnsgt;lt;/returnsgt;
private Listlt;IPXFacegt; GetAllFaceList()
{
Listlt;IPXFacegt; ret = new Listlt;IPXFacegt;();
for (int i = 0; i lt; this.PMX.Material.Count; i++)
{
for (int j = 0; j lt; this.PMX.Material[i].Faces.Count; j++)
{
ret.Add(this.PMX.Material[i].Faces[j]);
}
}
return ret;
}

/// lt;summarygt;
/// 面に含まれる法線の外積
/// lt;/summarygt;
/// lt;param name="Face"gt;lt;/paramgt;
/// lt;returnsgt;lt;/returnsgt;
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;
}


投稿者:

T0R0

プロフィールページ