トップページ > 記事閲覧
2Dでカメラを使いたい
名前:CRCR 日時: 2021/04/20 17:14

平面のワールドをドラッグで移動できるプログラムを書いたのですが、スクロールで拡大縮小もできるようにしたいです。 カメラを使えば簡単に実装できそうですが、2Dのプログラムなので3Dのカメラをどう使えばいいのか分かりません... どのようにすれば2D画面でカメラを使用できますでしょうか。
メンテ

Page: 1 |

Re: 2Dでカメラを使いたい ( No.1 )
名前:名無三 日時:2021/04/20 21:34

背景を3Dで描画していないのであればカメラを操作する意味はないです、自力で拡大縮小を駆使するのが1番効果的です。 ビルボードで3D空間上に画像を描画するのもいいかもしれません。
メンテ
Re: 2Dでカメラを使いたい ( No.2 )
名前:無名 日時:2021/04/21 00:42

別に2D処理でもDrawRotaGraph3を使えばそんなに難しくないですよ。 多分3Dのカメラ操作するよりこっちの方が楽です。 (3D空間だとドットバイドットで描画するのがちょっと面倒。) ↓サンプル #include "DxLib.h" #define WinX 640 #define WinY 480 #define GMAX 50 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetGraphMode(WinX, WinY, 32); if (DxLib_Init() == -1)return -1; int MousX = 0, MousY = 0, DragCX = 0, DragCY = 0, ShiftXTnp = 0, ShiftYTnp = 0, ShiftX = -WinX / 2, ShiftY = -WinY / 2, Rot = 0, posX[GMAX], posY[GMAX]; double Scale = 1.0; bool MousFlag = false; //画像読み込み(適当な画像を指定する) int GH = LoadGraph("Test.png"); //画像の座標を乱数で作成 for (int i = 0; i < GMAX; i++) { posX[i] = rand() % WinX; posY[i] = rand() % WinY; } SetDrawScreen(DX_SCREEN_BACK); //メインループ while (!ProcessMessage()) { //ドラックでスライド if(GetMouseInput() & MOUSE_INPUT_LEFT){ if (MousFlag) { GetMousePoint(&MousX, &MousY); ShiftX = ShiftXTnp + int(double(MousX - DragCX)/ Scale); ShiftY = ShiftYTnp + int(double(MousY - DragCY)/ Scale); } else { MousFlag = true; GetMousePoint(&DragCX, &DragCY); ShiftXTnp = ShiftX; ShiftYTnp = ShiftY; } }else { MousFlag = false; } //スクロールでスケール変更 Rot = GetMouseWheelRotVol(); if (Rot != 0) { Scale += 0.2 * Rot; if (Scale <= 0.2)Scale = 0.2; } //描画 ClearDrawScreen(); for (int i = 0;i< GMAX;i++) { DrawRotaGraph3(int(Scale * (ShiftX + posX[i])) + WinX / 2, int(Scale * (ShiftY + posY[i])) + WinY / 2, 0, 0, Scale, Scale, 0, GH, TRUE, FALSE); } DrawString(0,0, "マウス左クリックドラッグで移動\nマウスホイールを回転で拡大縮小", 0xffffff); DrawFormatString(0,32,0xffffff,"X座標X=%d\nY座標=%d\nスケール=%f", ShiftX, ShiftY, Scale); ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: 2Dでカメラを使いたい ( No.3 )
名前:CRCR 日時:2021/04/21 15:38

やはり自力でするしかないんですね。 サンプルありがとうございます! それを見て頑張ってみます。 ちなみに、DrawBoxで描画した際の拡大縮小方法も教えていただけないでしょうか
メンテ
Re: 2Dでカメラを使いたい ( No.4 )
名前:無名 日時:2021/04/21 21:38

すいません、逆に聞きますが何がわからないのか教えてもらえませんか? サンプル見ても全く意味がわからない感じですかね? 元の座標に移動した分を加算してそれに拡大率を乗算してるだけですよ。 (※int()で囲ってあるのは実数を整数にするため) ついでに、拡大縮小の基準が画面の中心になるように画面サイズの半分を加算してます。 ↓単純にやってるのはこれだけの事です。 int(拡大率*(移動分+元の座標))+画面の半分 DrawBoxを使うなら、左上(x1 , y1)と右下(x2 , y2)の座標を同じように処理すればいいだけですが? (画像描画ならDrawRotaGraph3を使えば拡大率で指定できるので、右下の座標を計算しなくて済む)
メンテ
Re: 2Dでカメラを使いたい ( No.5 )
名前:無名 日時:2021/04/23 19:28

すいません、あとから気づきましたが、 拡大縮小の縦横比が同じならDrawRotaGraph3よりDrawRotaGraph2の方が引数一つ少ないから楽ですね。 あと、グラフィックのサイズ調べたりする処理が増えますが、DrawExtendGraphでも同じ事はできます。 マップチップのように同じサイズのグラフィックをタイル状に並べるのはDrawExtendGraphの方がいいかもしれません。 (DrawRotaGraph2で並べると繋ぎ目が目立つ場合もあるので…)
メンテ
Re: 2Dでカメラを使いたい ( No.6 )
名前:CRCR 日時:2021/04/27 10:28

ありがとうございます。 頑張ってみます!
メンテ

Page: 1 |

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

   クッキー保存