トップページ > 記事閲覧
DxLibを使用したサブフォームを再表示した際にモデルが再描画されない
名前:梶井 日時: 2022/09/03 17:54

はじめまして。DxLib を初めて使わせていただいており、おそらく初手の段階で躓いています。 使用言語: C#(.NET Framework 4.7.2) OS:    Windows 10 64bit -------------------- ■やりたいこと ・メインフォームに入力されたファイルパスを元に、サブフォームにそのモデルをDxLibで描画したい ・サブフォームは開閉でき、ファイルパスを変更した際には該当モデルを読み直して描画したい ・サブフォームのPictureBoxを対象として描画したい -------------------- ■悩んでいること 最初にサブフォームを表示した時にはモデルが正常に描画されるのですが、一度閉じて開き直すとモデルが表示されません。 背景色も描画されていないので、何か設定が抜けているのではないかとは考えてますが、理由が分からないでいます。 -------------------- ■サブフォームのコード public partial class PmxViewer : System.Windows.Forms.Form { public List<PmxModel> PmxModels { get; set; } = new List<PmxModel>(); public CancellationTokenSource boxTaskTokenSource; public PmxViewer() { InitializeComponent(); PmxLabel.Text = Properties.Resources.PmxLabel; VmdLabel.Text = Properties.Resources.VmdLabel; // ウィンドウモードで描画 ChangeWindowMode(TRUE); // Direct3D9Ex を使用する SetUseDirect3DVersion(DX_DIRECT3D_9EX); // DxLib_Init の前に出力先ウインドウを SetUserWindow で指定する SetUserWindow(ViewerBox.Handle); // 背景色設定 SetBackgroundColor(140, 140, 140); // 計算速度を犠牲にしてでも精度を double で計算する SetUseFPUPreserveFlag(TRUE); // 透過色を指定しない、これが無いとデフォルトでは黒が透過されてしまう SetUseTransColor(FALSE); } private float Degree2Radian(float degree) { return (float)(degree / 180 * Math.PI); } private void PmxViewer_Shown(object sender, EventArgs e) { foreach (PmxModel model in PmxModels) { // 3Dモデルの読み込み model.InitDraw(); } } private void ViewerBox_Paint(object sender, PaintEventArgs e) { boxTaskTokenSource = new CancellationTokenSource(); CancellationToken boxTaskToken = boxTaskTokenSource.Token; Task.Run(() => { // DXライブラリの初期化 if (DxLib_Init() < 0) { // エラーが発生したら直ちに終了 return; } while (true & !boxTaskToken.IsCancellationRequested) { DrawModel(); } // DXライブラリの破棄 DxLib_End(); }); } private void DrawModel() { ClearDrawScreen(); ProcessMessage(); // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // Zバッファを使用する SetUseZBufferFlag(TRUE); // Zバッファへの書き込みを行う SetWriteZBufferFlag(TRUE); // バックカリングを行う SetUseBackCulling(TRUE); // pngなどの透過チャンネルを有効に設定 SetMovieColorA8R8G8B8Flag(TRUE); // モデルの見える位置にカメラを配置 SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 16.0f, -50.0f), VGet(0.0f, 14.0f, 0.0f)); // 視野角設定 SetupCamera_Perspective(Degree2Radian(35.0f)); foreach (PmxModel model in PmxModels) { // 3Dモデルの描画 model.Draw(); } ScreenFlip(); } private void PmxViewer_FormClosing(object sender, FormClosingEventArgs e) { boxTaskTokenSource.Cancel(); } } -------------------- サブフォームを何度開き直してもモデルを描画させられるようにしたいのですが、どのように記述すればよろしいでしょうか。 (下記コードには拘っておらず、やりたい事ができれば、どのような表記でも構いません) お忙しいところ大変恐縮ですが、何卒ご教示いただけますよう、よろしくお願いいたします。
メンテ

Page: 1 |

Re: DxLibを使用したサブフォームを再表示した際にモデルが再描画されない ( No.1 )
名前:管理人 日時:2022/09/04 13:15

はじめまして、DXライブラリをお使い頂きありがとうございます m(_ _)m SetUserWindow でサブフォームのウィンドウを指定された後に DxLib_Init を呼ばれていますが、 こちらはサブフォームを開いた際に DxLib_Init を実行、閉じる際に DxLib_End を実行されている形でしょうか? DXライブラリには SetScreenFlipTargetWindow という、出力先のウィンドウを指定できる関数がありますので、 DxLib_Init と DxLib_End はアプリケーションの起動時と終了時のみにして、 サブフォームを開いた際には SetScreenFlipTargetWindow でサブフォームを出力先にする、 という形の方が安定して動作すると思います // ScreenFlip で画像を転送する先のウインドウを設定する( NULL を指定すると設定解除 ) int SetScreenFlipTargetWindow( HWND TargetWindow, double ScaleX = 1.0, double ScaleY = 1.0 ) ; よろしければお試しください m(_ _)m
メンテ
Re: DxLibを使用したサブフォームを再表示した際にモデルが再描画されない ( No.2 )
名前:梶井(解決済) 日時:2022/09/06 23:32

管理人様 お返事が遅くなってしまいすみません。 SetScreenFlipTargetWindowとTimerを使って、ウィンドウを再度表示したときにも描画されるようになりました! ご回答、ありがとうございました。 これからもよろしくお願いいたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存