いつもお世話になっています。
今回、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