質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

2970閲覧

マウスのホイールによるモデルの拡大縮小

north

総合スコア8

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2018/07/10 13:08

いつもお世話になっております。
現在DXライブラリのC#版とwindowsフォームを利用してデスクトップマスコットを作成しているのですが
マウスのホイールによるモデルの拡大縮小を実装しているのですが
ホイール拡大縮小をした後にすぐに最初の大きさに戻ってしまうというバグに悩まされていて原因がわかりません。
下記がコードとなります

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using DxLibDLL;//DxLibを使用 11using CoreTweet; //CoreTweetを使用 12using System.IO;//FileInfoを使用 13 14namespace DesctopMascot 15{ 16 public partial class Form1 : Form 17 { 18 private int modelHandle; 19 private int attachIndex; 20 private float totalTime; 21 private float playTime; 22 private float playSpeed; 23 private int motionNum; 24 private const int maxNum = 2; 25 private Tokens token; 26 private DX.VECTOR StartPos, EndPos; 27 private DX.VECTOR ScreenPos; 28 private DX.VECTOR modelPos; 29 private DX.VECTOR oldScreenPos; 30 private int MouseX; 31 private int MouseY; 32 private DX.MV1_COLL_RESULT_POLY HitPoly; 33 private bool firstFlg; 34 private DX.VECTOR scale; 35 private int rot; 36 37 public Form1() 38 { 39 InitializeComponent(); 40 MouseWheel += new MouseEventHandler(Form1_MouseWheel); 41 42 ClientSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);//画面サイズの設定 43 Text = "DesktopMascot";//ウインドウの名前を設定 44 AllowDrop = true;//ドラッグ&ドロップを許可 45 46 token = Tokens.Create("", "", 47 "", ""); //twitterアカウントの認証 48 firstFlg = false; 49 50 DX.SetOutApplicationLogValidFlag(DX.FALSE); //Log.txtを生成しないように設定 51 DX.SetUserWindow(Handle); //DxLibの親ウインドウをこのフォームに設定 52 DX.SetZBufferBitDepth(24); //Zバッファの精度を変更 53 DX.DxLib_Init(); //DxLibの初期化処理 54 DX.SetDrawScreen(DX.DX_SCREEN_BACK); //描画先を裏画面に設定 55 56 System.Random rand = new System.Random(); 57 motionNum = rand.Next(maxNum); 58 59 modelHandle = DX.MV1LoadModel("Data/kaede/kaede.mv1");//3Dモデルの読み込み 60 attachIndex = DX.MV1AttachAnim(modelHandle, motionNum, -1, DX.FALSE); 61 totalTime = DX.MV1GetAttachAnimTotalTime(modelHandle, attachIndex); 62 playTime = 0.0f; 63 playSpeed = 0.2f; 64 scale = DX.MV1GetScale(modelHandle); 65 66 67 DX.SetCameraNearFar(0.1f, 1000.0f);//奥行0.1~1000をカメラの描画範囲とする 68 DX.SetCameraPositionAndTarget_UpVecY(DX.VGet(12.0f, 25.0f, -35.0f), DX.VGet(0.0f, 15.0f, 0.0f));//第1引数の位置から第2引数の位置を見る角度にカメラを設置 69 70 DX.MV1SetupCollInfo(modelHandle, -1, 8, 8, 8); 71 } 72 73 public void MainLoop() 74 { 75 DX.ClearDrawScreen();//裏画面を消す 76 77 DX.DrawBox(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, DX.GetColor(1, 1, 1), DX.TRUE);//背景を設定(透過させる) 78 79 playTime += playSpeed; 80 81 //モーションの再生位置が終端まで来たら最初に戻す 82 if (playTime >= totalTime) 83 { 84 playTime = 0.0f; 85 } 86 87 DX.MV1SetAttachAnimTime(modelHandle, attachIndex, playTime);//モーションの再生位置を設定 88 89 DX.MV1RefreshCollInfo(modelHandle, -1); 90 91 DX.MV1DrawModel(modelHandle);//3Dモデルの描画 92 93 ModelMove(); 94 95 //ESCキーを押したら終了 96 if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) != 0) 97 { 98 Close(); 99 } 100 101 DX.ScreenFlip();//裏画面を表画面にコピー 102 } 103 104 private void Form1_FormClosed(object sender, FormClosedEventArgs e) 105 { 106 DX.DxLib_End();//DxLibの終了処理 107 } 108 109 private void Form1_Load(object sender, EventArgs e) 110 { 111 FormBorderStyle = FormBorderStyle.None;//フォームの枠を非表示にする 112 Bitmap bmp = new Bitmap(@"form.bmp"); //画像を読み込み 113 Color transColor = bmp.GetPixel(0, 0); 114 bmp.MakeTransparent(transColor); //画像を透明にする 115 BackgroundImage = bmp; //背景画像を指定する 116 //背景色を指定する 117 BackColor = transColor; 118 //透明を指定する 119 TransparencyKey = transColor; 120 } 121 122 private void Form1_DragEnter(object sender, DragEventArgs e) 123 { 124 //ファイルがドラッグされた場合のみ受け付け 125 if(e.Data.GetDataPresent(DataFormats.FileDrop)) 126 { 127 e.Effect = DragDropEffects.Copy; 128 } 129 else 130 { 131 e.Effect = DragDropEffects.None; 132 } 133 } 134 135 private void Form1_DragDrop(object sender, DragEventArgs e) 136 { 137 string[] path = (string[])e.Data.GetData(DataFormats.FileDrop, false); //ドロップされたファイルのパスを取得する 138 var ids = new List<long>(); 139 140 //各画像をアップロードしIDを取得 141 foreach(var p in path) 142 { 143 MediaUploadResult image = token.Media.Upload(media: new FileInfo(p)); 144 ids.Add(image.MediaId); 145 } 146 147 //画像をツイートする 148 Status s = token.Statuses.Update(status: "Upload Image", media_ids: ids); 149 } 150 151 private void ModelMove() 152 { 153 //マウスのクリックが左クリックの時に実行 154 if ((DX.GetMouseInput() & DX.MOUSE_INPUT_LEFT) != 0) 155 { 156 157 DX.GetMousePoint(out MouseX, out MouseY); 158 ScreenPos.x = (float)MouseX; 159 ScreenPos.y = (float)MouseY; 160 161 if(!firstFlg) 162 { 163 oldScreenPos.x = (float)MouseX; 164 oldScreenPos.y = (float)MouseY; 165 firstFlg = true; 166 } 167 168 //ローカル座標を画面の指定の座標のワールド座標での一番手前(画面に近い側)の座標に変換 169 ScreenPos.z = 0.0f; 170 StartPos = DX.ConvScreenPosToWorldPos(ScreenPos); 171 172 //ローカル座標を画面の指定の座標のワールド座標での画面の奥側の座標に変換 173 ScreenPos.z = 1.0f; 174 EndPos = DX.ConvScreenPosToWorldPos(ScreenPos); 175 176 //マウスポインタがモデル上にあるかチェック 177 HitPoly = DX.MV1CollCheck_Line(modelHandle, -1, StartPos, EndPos); 178 if (HitPoly.HitFlag == DX.TRUE) 179 { 180 modelPos = DX.MV1GetPosition(modelHandle); 181 DX.DrawStringF(100, 500, ">>クリックされてるよ~", 0xffffff); 182 if (oldScreenPos.x != ScreenPos.x || oldScreenPos.y != ScreenPos.y) 183 { 184 DX.VECTOR modelPos2D = DX.ConvWorldPosToScreenPos(modelPos); 185 modelPos2D.x += ScreenPos.x - oldScreenPos.x; 186 modelPos2D.y += ScreenPos.y - oldScreenPos.y; 187 if(modelPos2D.x > Screen.PrimaryScreen.Bounds.Width) 188 { 189 modelPos2D.x = Screen.PrimaryScreen.Bounds.Width; 190 } 191 if(modelPos2D.y > Screen.PrimaryScreen.Bounds.Height) 192 { 193 modelPos2D.y = Screen.PrimaryScreen.Bounds.Height; 194 } 195 DX.MV1SetPosition(modelHandle, DX.ConvScreenPosToWorldPos(modelPos2D)); 196 //DX.VECTOR oldScreenPos3D = DX.ConvScreenPosToWorldPos(oldScreenPos); 197 //DX.VECTOR ScreenPos3D = DX.ConvScreenPosToWorldPos(ScreenPos); 198 //DX.MV1SetPosition(modelHandle, DX.VGet(modelPos.x + (ScreenPos3D.x - oldScreenPos3D.x), modelPos.y + (ScreenPos3D.y - oldScreenPos3D.y), modelPos.z)); 199 } 200 oldScreenPos = ScreenPos; 201 } 202 else 203 { 204 firstFlg = false; 205 } 206 207 } 208 } 209 210 private void Form1_MouseWheel(object sender, MouseEventArgs e) 211 { 212 //if(e.Delta != 0) 213 //{ 214 DX.MV1SetScale(modelHandle, DX.VGet(scale.x + (float)e.Delta * SystemInformation.MouseWheelScrollLines / 12000, scale.y + (float)e.Delta * SystemInformation.MouseWheelScrollLines / 12000, scale.z + e.Delta * SystemInformation.MouseWheelScrollLines / 12000)); 215 //} 216 } 217 } 218}

Form1_MouseWheel関数内で処理を行っております。
また、この機能をDXライブラリの関数 GetMouseWheelRotVol()でやろうとしたらどのようにしたらいいでしょうか?
一度実装してみたのですがマイフレーム関数が呼ばれてしまうため回転数がとれなかったので・・・

どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MouseEventArgsのDeltaはホイールの回転量を表します
ズームさせるなら、ホイール回転量を積算してズーム量としなければいけません

回転量そのままズーム量としたら元に戻るのは当たり前ですね

投稿2018/07/10 14:16

編集2018/07/10 14:17
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

north

2018/07/13 14:20

ありがとうございます。 原因は仰るとおりでした。 お陰様で無事修正できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問