みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

PMDファイルを作ってみる

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

PMDファイルを作ってみる

投稿記事 by みけCAT » 12年前

テキストファイルを書いて変換することにより、pmdファイルを作成できるソフトを作ってみました。
適当です。汚いです。やっつけです。
► スポイラーを表示
モデル情報、頂点、面、材質、ボーンのみ出力します。
テキストファイルのフォーマットはこうなっています。

CODE:

// MMDではx:右 y:上 z:手前

モデル名(20バイトまで)
コメント(256バイトまで)

頂点数
// ここから頂点の数繰り返す
座標x 座標y 座標z
法線x 法線y 法線z
u v
ボーン1 ボーン2
ボーン1の影響度(0~100)
エッジフラグ(0で通常,1でエッジ無効)
// ここまで頂点の数繰り返す

頂点数(面の数×3)
// ここから面の数繰り返す
//正面から見て時計回りに登録する
面の頂点番号1 面の頂点番号2 面の頂点番号3
// ここまで面の数繰り返す

材質数
// ここから材質数繰り返す
減衰色R 減衰色G 減衰色B
アルファ
光沢度
光沢色R 光沢色G 光沢色B
環境色R 環境色G 環境色B
トゥーンインデックス(とりあえず0)
エッジフラグ
面頂点数(面の数×3)
テクスチャファイル名
//ここまで材質数繰り返す

ボーン数
//ここからボーン数繰り返す
ボーン名
親ボーン番号(ない場合-1)
子ボーン番号(ない場合-1)
ボーンの種類(0:回転 1:回転と移動 7:非表示)
IKボーン番号(0)
ボーンのヘッドx ボーンのヘッドy ボーンのヘッドz
//ここまでボーン数繰り返す
例えば、ここのアイコンの立方体を作ってみる。
► スポイラーを表示
_人人人人人人_
> めんどくさい
#include

#define PI 3.1415926535897932384626433832795028841

int main(int argc,char* argv[]) {
int bunkatu_yoko=10,bunkatu_tate=5;
double hankei=2.5;
int i,j;
int chouten_num;
int men_num;
if(argc!=4) {
fprintf(stderr,"Usage: makeball \n");
return 1;
}
sscanf(argv[1],"%d",&bunkatu_yoko);
sscanf(argv[2],"%d",&bunkatu_tate);
sscanf(argv[3],"%lf",&hankei);

/* 基本情報 */
puts("球");
printf("横の分割数=%d 縦の分割数=%d 半径=%g\n",bunkatu_yoko,bunkatu_tate,hankei);
chouten_num=bunkatu_yoko*(bunkatu_tate*2-1)+2;
men_num=bunkatu_yoko*bunkatu_tate*2*2-bunkatu_yoko*2;
/* 頂点 */
printf("%d\n",chouten_num);
printf("0 -%g 0\n",hankei);
puts("0 -1 0");
puts("0 0");
puts("0 0");
puts("0");
puts("0");

for(i=-bunkatu_tate+1;i<bunkatu_tate;i++) {
for(j=0;j<bunkatu_yoko;j++) {
double x,y,z;
double rx,ry;
rx=2*PI*j/bunkatu_yoko;
ry=PI/2*i/bunkatu_tate;
y=hankei*sin(ry);
z=hankei*cos(ry);
x=z*sin(rx);
z=z*cos(rx);
printf("%g %g %g\n",x,y,z);
printf("%g %g %g\n",x/hankei,y/hankei,z/hankei);
puts("0 0");
puts("0 0");
puts("0");
puts("0");
}
}
printf("0 %g 0\n",hankei);
puts("0 1 0");
puts("0 0");
puts("0 0");
puts("0");
puts("0");

/* 面 */
printf("%d\n",men_num*3);
for(i=1;i<=bunkatu_yoko-1;i++) {
printf("0 %d %d\n",i+1,i);
}
printf("0 1 %d\n",bunkatu_yoko);
for(i=0;i<bunkatu_tate*2-2;i++) {
for(j=1;j<=bunkatu_yoko-1;j++) {
printf("%d %d %d\n",i*bunkatu_yoko+j,(i+1)*bunkatu_yoko+j+1,(i+1)*bunkatu_yoko+j);
printf("%d %d %d\n",i*bunkatu_yoko+j,i*bunkatu_yoko+j+1,(i+1)*bunkatu_yoko+j+1);
}
printf("%d %d %d\n",i*bunkatu_yoko+j,(i+1)*bunkatu_yoko+1,(i+1)*bunkatu_yoko+j);
printf("%d %d %d\n",i*bunkatu_yoko+j,i*bunkatu_yoko+1,(i+1)*bunkatu_yoko+1);
}
j=(bunkatu_tate*2-2)*bunkatu_yoko;
for(i=1;i<=bunkatu_yoko-1;i++) {
printf("%d %d %d\n",chouten_num-1,j+i,j+i+1);
}
printf("%d %d %d\n",chouten_num-1,j+bunkatu_yoko,j+1);

/* 材質 */
puts("1");
puts("0 1 0");
puts("1");
puts("0.5");
puts("0 1 0");
puts("0 1 0");
puts("0");
puts("0");
printf("%d\n",men_num*3);
puts("");

/* ボーン */
puts("2");
puts("センター");
puts("-1");
puts("1");
puts("1");
puts("0");
puts("0 0 0");
puts("センター終点");
puts("0");
puts("-1");
puts("7");
puts("0");
printf("0 %g 0\n",-hankei);

return 0;
}
[/code]
せっかくpmdファイルを作成したので、MikuMikuDanceで使ってみる。
[youtube][/youtube]
バイナリ、モデルなどは添付ファイルにしました。
添付ファイル

[拡張子 zip は無効化されているため、表示できません]

最後に編集したユーザー みけCAT on 2013年2月23日(土) 21:45 [ 編集 1 回目 ]

コメントはまだありません。