ページ 1 / 1
3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 16:25
by yaniki
はじめまして。
現在DXライブラリを用いて3Dモデルの形状を編集するソフトの
作成を行っています。
球体とモデルの衝突判定(MV1 CollCheck_Sphere)を使ってモデルの一部分を
3次元で範囲指定することはできたのですが、指定した部分を削除したり
指定した以外の場所を削除するにはどのようにしたらよいのでしょうか。
また編集後のモデルのデータを保存する関数や方法はありますか。
説明不足かもしれませんが、よろしければご教授お願い致します。
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 19:00
by AKIЯA
2ヶ月前にメタセコイアで3Dモデリングをしていて
自動でモデリングできるように元画像(bmpファイル)の1×1ピクセルずつからデータを読み取り平面上に四角ポリゴンを貼って行き
mqoファイルを吐き出すプログラムを作ったのですが、結局ボツにしましたけど^^;
どのファイル形式で保存させるかによってデータの持ち方が変わってくると思います。
mqoファイルとかxファイルとかpmdファイルとか独自規格の形式など、どの形式をお考えでしょうか?
pmdファイルからmqoへ変換してmqoファイルの中身を解析したことがあるのですが
mqoファイルはテキストエディターで開いて直接編集することもできますので
どんなデータを保持しているかの参考にはなると思います。
※mqoはググったらそれっぽい資料がありましたのでそこからモデリングデータだけなら解析できました。
※ボーンやアンカーまで組んでしまうとより複雑になるので、そこまでは解析しませんでした。
おそらく必要な情報は頂点の情報と、どの頂点がどの頂点と繋がっているかという情報が必要になると思います。
そこの仕様が決まれば、ポリゴンの削除も可能になるのではと思います。
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 20:23
by yaniki
ご返信ありがとうございます。
説明不足となってしまい申し訳ありません。
現在 xファイルでの読み込み・保存を考えています。
その理由ですが、大学の研究の一部として編集ソフトの作成に
取り組んでいるので、メタセコイアなどのソフトの利用を
控えています。
また形状モデルを作成する際、STLファイルで吐き出したので(その後
xファイルへ自作で変換)xファイルでの処理を考えていました。
xファイルでの処理は難しいのでしょうか。
MV1CollCheck_Sphere の説明文に「 当たったポリゴンに関する情報を扱いたい場合は
Dim の先にある配列にアクセスするという使い方になります」とあったのですが
MV1DeleteModel で部分的に削除することができずに行き詰ってしまいました。
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 20:33
by AKIЯA
ググってみましたがここを見ればXファイルのデータ構造がわかると思います。
かなり親切に書いてあります。
http://rudora7.blog81.fc2.com/blog-entry-238.html
新規作成の場合もポリゴン作成したときに同時にmesh部分をメモリ内で保持しなければなりませんし
削除に関してもXファイル形式のmesh部分のデータ構造をメモリ内で保持して
面もしくは辺もしくは点に対応したものが削除された場合、メモリ内で保持しているデータを変更して
残ったmeshデータを描画する感じになるのかと思います。
つまりはXファイルのmesh内を保持しなければなりません。
保存する際はそのmeshデータをそのままファイルへ書き込めばよいかと思います。
三角ポリゴンとか四角ポリゴンとかあると思いますがまずは1つ選んでやってみてはどうでしょうか。
説明がヘタクソですいません^^;
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 21:10
by h2so5
DXライブラリはゲーム用なので、モデルの細かい編集はできません。
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 21:32
by AKIЯA
まだエアホッケー作ってる最中なのですが、頑張ってサンプル作ってみます。
行けそうな気がする~勢いだけでw
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月05日(月) 23:50
by yaniki
AKIRAさん、h2so5さん、ご返信ありがとうございます。
やはりDXライブラリの関数を使うだけではxファイルの編集は
できないようですね。
AKIRAさん、丁寧にご説明ありがとうございます。
ファイルの構造から理解しなくてはいけないのですね。
自分の勉強・知識が足りない部分が多々あるので
少しずつでも補いつつ取り組んでみます。
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月06日(火) 13:50
by AKIЯA
Mesh内の頂点数と頂点座標と三角ポリゴン数まではこれで取得できます。
残りは辺取得です。
やってて悲鳴上げそうになってきた。時間かかりますね。
結論 フリーのモデリングソフト使いましょうw
► スポイラーを表示
コード:
#include "DxLib.h"
#define VERTE_X 1000
#define VERTE_Y 1000
#define VERTE_Z 1000
#define SPACE 0x20
char filename[] = "./data/test.x";
int vertes = 0;
float verte_x[VERTE_X] = {-1}; // 頂点
float verte_y[VERTE_Y] = {-1};
float verte_z[VERTE_Z] = {-1};
int face = 0; // 面の数
double part_a[65535] = {-1}; // 辺
double part_b[65535] = {-1};
double part_c[65535] = {-1};
double part_d[65535] = {-1};
double plane[65535] = {-1};
int no = 0;
int plane =0;
int divide = 0; // 種別
// 辺構成取得
int get3(char *buf,int cnt,int len)
{
int i;
for(i=0;i<len;i++)
{
if( buf[i] != '\0' )
{
if( buf[i] != SPACE )
{
}
}
}
return 0;
}
// 面の数取得
void get2(char *buf, int len)
{
int i=0,j=0;
char str1[8];
for(i=0;i<len;i++)
{
if( buf[i] != '\0' )
{
if( buf[i] != SPACE )
{
str1[j] = buf[i];
j++;
}
}else{
i = len;
}
}
face = atoi(str1);
}
// 頂点座標取得
int get1(char *buf, int cnt, int len)
{
int i=0,j=0,c=0;
char str1[64],str2[64],str3[64];
for(i=0;i<len;i++)
{
if( buf[i] != SPACE )
{
if( buf[i] != ';' )
{
if( buf[i] != ',' )
{
switch( c )
{
case 0:
str1[j] = buf[i];
j++;
break;
case 1:
str2[j] = buf[i];
j++;
break;
case 2:
str3[j] = buf[i];
j++;
break;
default:
break;
}
}else{
verte_x[cnt] = atof(str1);
verte_y[cnt] = atof(str2);
verte_z[cnt] = atof(str3);
no++;
return 0;
}
}else{
cnt++;
j=0;
}
}
}
return 0;
}
// 頂点数取得
void get0(char *buf, int len)
{
int i=0,j=0;
char str1[8];
for(i=0;i<len;i++)
{
if( buf[i] != '\0' )
{
if( buf[i] != SPACE )
{
str1[j] = buf[i];
j++;
}
}else{
i = len;
}
}
vertes = atoi(str1);
}
int load()
{
int fh;
char buf[256];
bool flg = false;
int i = 0;
int size = 0;
int cnt = 0;
// Xファイル読み込み
// test.cpp ファイルを開く
fh = FileRead_open( filename );
// Meshまで読み飛ばす
for(i=0;i<134;i++)
{
// 一行読み込み
FileRead_gets( buf, 256, fh );
}
// ファイルの終端が来るまで表示する
while( FileRead_eof( fh ) == 0 )
{
// 一行読み込み
FileRead_gets( buf, 256, fh );
size = sizeof(buf);
switch( divide )
{
// 頂点数取得
case 0:
get0(buf,size);
divide++;
break;
// 頂点座標取得
case 1:
if(cnt < vertes)
{
get1(buf,cnt,size);
cnt++;
}else{
divide++;
cnt = 0;
}
break;
// 面数取得
case 2:
get2(buf,size);
divide++;
break;
// 辺取得
case 3:
get3(buf,cnt,size);
divide++;
break;
default:
break;
}
}
// ファイルを閉じる
FileRead_close( fh );
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int ret,cr1,cr2;
// 画面モードを32ビットカラーにセット
SetGraphMode(1280, 720, 32);
// タイトルを Test に変更
SetMainWindowText("Test");
// ウインドウモード起動
ChangeWindowMode(true);
// 描画先画面を表にする
SetDrawScreen(DX_SCREEN_BACK);
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
// エラーが起きたら直ちに終了
return -1;
}
ret = load();
if( ret == -1 )
{
return -1;
}
// 白色の値を取得
cr1 = GetColor( 255, 255, 255 );
cr2 = GetColor( 0, 0, 0 );
// メッセージループ処理
while( ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 )
{
// 画面を初期化
ClearDrawScreen();
// 裏画面表示
ScreenFlip();
}
// DXライブラリ使用の終了処理
DxLib_End();
// ソフトの終了
return 0;
}
Re: 3Dモデルの編集について(DXライブラリ)
Posted: 2012年11月06日(火) 17:09
by yaniki
返信ありがとうございます。
サンプルも参考にさせていただきつつ、
可能か否か(結論いただいてますが)判断し
研究に取り組んでいきます。
結論も出ていますので解決にさせていただきます。
回答してくださった方、またご覧になっていただいた方、
ありがとうございました。