VC++とDXライブラリを始めたばかりの初心者です。
DrawModiGraphで画像を三次元的に回転させる方法を考えているのですが、上手く行かず困っています。
どう上手く行かないのかは後述します。
以下の「DrawModiGraph関数を用いて画像を回転させたいのですが」というトピックで
DrawModiGraphで画像を平面方向に回転させる方法を見つけ、XYZ軸にも回転できるのでは、と考えました。
DrawModiGraphに拘っているのは、二次元の座標上に三次元的に回転する画像を表示させたいのと
画像の四つの頂点の座標を当たり判定に使用したいからです。
・「DrawModiGraph関数を用いて画像を回転させたいのですが」
http://dixq.net/forum/viewtopic.php?f=3&t=9720
数学が苦手で回転の公式は理解が難しかったので、とりあえず上記トピックのコードを
色々と試行錯誤しながらXYZ軸に回転できるよう改造してみたものが以下のコードです。
#include "DxLib.h"
#include <math.h>
// Π(パイ)
#define PI 3.1415926535897932384626433832795f
// 回転描画処理
extern void kaiten();
extern int size_x = 0; // 画像のxサイズ
extern int size_y = 0; // 画像のyサイズ
extern float x = 320; // 画像の中心x座標
extern float y = 240; // 画像の中心y座標
extern int rota_x = 0; // x軸回転角度
extern int rota_y = 0; // y軸回転角度
extern int rota_z = 0; // z軸回転角度
extern int graph = 0; // グラフィックハンドル
// WinMain 関数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
//ウィンドウモードに変更
ChangeWindowMode(TRUE) ;
// DXライブラリ初期化処理 エラーが起きたら終了
if(DxLib_Init() == -1) {
return -1;
}
// 描画先を裏画面に設定
SetDrawScreen(DX_SCREEN_BACK);
// グラフィックハンドルの設定
graph = LoadGraph("test.png");
GetGraphSize(graph, &size_x, &size_y);
while (0 == ProcessMessage() && 0 == ClearDrawScreen() &&
0 == CheckHitKey(KEY_INPUT_ESCAPE)) {
// 回転描画処理
kaiten();
// 回転角度加算
// rota_x++;
// rota_y++;
// rota_z++;
ScreenFlip();
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
// 回転描画処理
void kaiten()
{
// 回転後の座標
int X = 0;
int Y = 0;
// 各回転角度をラジアンに変換
double radi_x = rota_x * PI / 180.0;
double radi_y = rota_y * PI / 180.0;
double radi_z = rota_z * PI / 180.0;
X = -(size_x / 2) * cos(radi_z + radi_y) - -(size_y / 2) * sin(-radi_z);
Y = -(size_x / 2) * sin(-radi_z) + -(size_y / 2) * cos(radi_z + radi_x);
int ax = x + X;
int ay = y + Y;
X = (size_x / 2) * cos(radi_z + radi_y) - -(size_y / 2) * sin(-radi_z);
Y = (size_x / 2) * sin(-radi_z) + -(size_y / 2) * cos(radi_z + radi_x);
int bx = x + X;
int by = y + Y;
X = (size_x / 2) * cos(radi_z + radi_y) - (size_y / 2) * sin(-radi_z);
Y = (size_x / 2) * sin(-radi_z) + (size_y / 2) * cos(radi_z + radi_x);
int cx = x + X;
int cy = y + Y;
X = -(size_x / 2) * cos(radi_z + radi_y) - (size_y / 2) * sin(-radi_z);
Y = -(size_x / 2) * sin(-radi_z) + (size_y / 2) * cos(radi_z + radi_x);
int dx = x + X;
int dy = y + Y;
// 描画
DrawModiGraph(ax, ay, bx, by, cx, cy, dx, dy, graph, TRUE);
}
実現させたい動きを、メタセコイアという3DCG作成ツールで再現したアニメーションを作りました。
・三次元回転アニメーション
https://gifmagazine.net/post_images/1254897
アニメーションの①~③のように単一の軸で回転させたときの動きは実現できているのですが
④~⑦のように複数の軸で回転させたときの動きがアニメーションの動きと違ってしまいます。
どう違うのかは言葉で表現しづらいので、上記コードの46~48行目のコメントアウトを外して
実際に画像を回転させてみてご確認いただければと思います。
アニメーションのように複数の軸で回転させるにはどうすれば良いでしょうか?
出来れば上記コードを具体的に修正したものをご回答いただけると嬉しいです。
よろしくお願い致します。
・開発環境
OS:Windows7(64bit)
コンパイラ:VC++ 2008 ExpressEdition
ライブラリ:DXライブラリVer3.17c