トップページ > 過去ログ > 記事閲覧
3Dモデルの輪郭縁取りについて
名前:Dixq 日時: 2011/10/09 18:27

いつもお世話になっています。 今回、3Dモデルの輪郭縁取り設定について質問させて下さい。 以下、ソースコード・実行結果・実行できるプロジェクトを示しておりますので合わせてご覧下さい。 まず、 輪郭縁取りのある3DモデルをMV1SetScale()で拡大すると、 黒い縁取りでモデルが埋まってしまうと思います。 (ここで@を有効にして下さい) そこで、 MV1SetMaterialOutLineDotWidth()によって マテリアルの輪郭線の太さを拡大した分小さくするようにしました。 すると実行結果「@有効」のように、輪郭は正常になりました。 (ここでAを有効にして下さい) しかし、上下キーボタンでモデルを拡大して頂ければお分かり頂けるように、 何度もコールすると縁取りが表示されてしまいます。 (ここでBを有効にして下さい) 縁取りは無くていいので、MV1SetMaterialOutLineDotWidthに0を渡して縁取りを無くそうとしました。 しかし、実行結果は変わらずでした (ここでCを有効にして下さい) そこで、MV1SetMaterialOutLineWidthの方の関数を使って縁取りを0にしました。 すると正常に表示されました。 [ ソースコード ] #include "lib/DxLib.h" bool Scaling( int sMdlHdl, float fScaleRate ){ MV1SetScale( sMdlHdl, VGet( fScaleRate, fScaleRate, fScaleRate ) ) ; // スケーリングで膨張した縁取りを戻す int MaterialNum = MV1GetMaterialNum( sMdlHdl ); float dotwidth; for( int i = 0 ; i < MaterialNum ; i ++ ){ dotwidth = MV1GetMaterialOutLineDotWidth( sMdlHdl, i ) ; MV1SetMaterialOutLineDotWidth( sMdlHdl, i, dotwidth/fScaleRate ); // MV1SetMaterialOutLineDotWidth( sMdlHdl, i, 0 );//B // MV1SetMaterialOutLineWidth ( sMdlHdl, i, 0 );//C } return true; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); int mdl = MV1LoadModel("Reimu/reimu.pmd"); float size=1.0f; MV1SetPosition( mdl, VGet( 320, 0, 0 )); MV1SetScale( mdl, VGet( 22.f,22.f,22.f ) ); // Scaling(mdl,22.f);//@ while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()){ DrawBox(0,0,640,480,GetColor(255,255,255),TRUE); if( CheckHitKey( KEY_INPUT_UP ) ){ size += 0.1f; } if( CheckHitKey( KEY_INPUT_DOWN ) ){ size -= 0.1f; } // Scaling(mdl,size);//A MV1DrawModel( mdl ); } DxLib_End(); return 0; } [ 実行結果 ] h ttp://dixq.net/private/img/Rinkaku00.png [ 上記サンプルの実行できるプロジェクト ] h ttp://dixq.net/private/zip/Rinkaku.zip 質問1. @有効時が正常で、A有効時が異常なのは何故でしょうか? 質問2. MV1SetMaterialOutLineDotWidth()に0を渡して縁取りが0にならないのは仕様でしょうか? 以上よろしくお願いいたします。     Dixq

Page: 1 |

Re: 3Dモデルの輪郭縁取りについて ( No.1 )
名前:管理人 日時:2011/10/09 20:44

> 質問1. > @有効時が正常で、A有効時が異常なのは何故でしょうか? MV1GetMaterialOutLineDotWidth は MV1SetMaterialOutLineDowWidth で設定した値を 返しますので、何度も Scaling 関数を呼ぶとその度に MV1SetMaterialOutLineDowWidth の 戻り値が変化してしまうからです > 質問2. > MV1SetMaterialOutLineDotWidth()に0を渡して縁取りが0にならないのは仕様でしょうか? はい、仕様です 輪郭線の太さは MV1SetMaterialOutLineWidth で設定できる立体的な太さと MV1SetMaterialOutLineDotWidth で設定できるドット単位の太さの2種類の内、 より太い方の値を使用して輪郭線を描画するようになっていますので、 片方の太さを0にしても、もう片方の太さの設定が0ではない限り、 そちらの太さの設定が使用されるだけで、輪郭線は消えません なので輪郭線を消す場合は MV1SetMaterialOutLineWidth と MV1SetMaterialOutLineDotWidth の 両方に0を指定して呼び出す必要があります ややこしくて申し訳ありません このことをリファレンスに載せておかなければ、と思ってリファレンスを見てみたらそもそも MV1SetMaterialOutLineWidth も MV1SetMaterialOutLineDotWidth もリファレンスにありませんでした orz 後ほど追加しておきます
Re: 3Dモデルの輪郭縁取りについて ( No.2 )
名前:Dixq 日時:2011/10/09 21:01

管理人様 丁寧なご回答ありがとうございます。 > 質問1. あ、そうですね・・単純なミスで質問してしまいすみません。 > 質問2. >輪郭線を消す場合は MV1SetMaterialOutLineWidth と MV1SetMaterialOutLineDotWidth の >両方に0を指定して呼び出す必要があります なるほど、そのような仕様でしたか。 それでCを有効にした時点で反映されたのですね。 すっきりしました。 ありがとうございました。

Page: 1 |