やりたいことはタイトルの通りなのですが、とりあえず最初に移動と周囲の見渡しができるように書いたコードが以下です。
#include "../dxlib_vc/DxLib.h"
const float PI = 3.1415926525897932f;
const float PI2 = 6.28318530718f;
const int DC_WIDTH = 800;
const int DC_HEIGHT = 600;
const int KEYMAX = 256;
const float ROTATE_AMOUNT = PI2 / 360;
const float MOVE_AMOUNT = 10.0f;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
ChangeWindowMode(TRUE);
SetGraphMode(DC_WIDTH, DC_HEIGHT, 32);
if (DxLib_Init()) return -1;
SetDrawScreen(DX_SCREEN_BACK);
char keystateBuf[KEYMAX];
char keystate[KEYMAX] = { 0 };
const float baseX = -500.0f;
const float baseY = -500.0f;
const float baseZ = -500.0f;
const int LINE_MAX = 24;
const float interval = 150.0f;
const float endX = baseX + interval * LINE_MAX;
const float endY = baseY + interval * LINE_MAX;
const float endZ = baseZ + interval * LINE_MAX;
VECTOR rotate = { 0 };
VECTOR cameraPos = { DC_WIDTH / 2, DC_HEIGHT / 2, -1.0f };
while (!ScreenFlip() && !ClearDrawScreen() && !ProcessMessage() && !CheckHitKey(KEY_INPUT_ESCAPE)){
// keystate準備
GetHitKeyStateAll(keystateBuf);
for (int i = 0; i < KEYMAX; ++i){
keystate[i] = keystateBuf[i] ? ++keystate[i] : 0;
}
// ☆
if (keystate[KEY_INPUT_A]) cameraPos.x -= MOVE_AMOUNT;
if (keystate[KEY_INPUT_D]) cameraPos.x += MOVE_AMOUNT;
if (keystate[KEY_INPUT_W]) cameraPos.y += MOVE_AMOUNT;
if (keystate[KEY_INPUT_S]) cameraPos.y -= MOVE_AMOUNT;
if (keystate[KEY_INPUT_LSHIFT]) cameraPos.z += MOVE_AMOUNT;
if (keystate[KEY_INPUT_LCONTROL]) cameraPos.z -= MOVE_AMOUNT;
if (keystate[KEY_INPUT_LEFT]) rotate.x -= ROTATE_AMOUNT;
if (keystate[KEY_INPUT_RIGHT]) rotate.x += ROTATE_AMOUNT;
if (keystate[KEY_INPUT_UP]) rotate.y -= ROTATE_AMOUNT;
if (keystate[KEY_INPUT_DOWN]) rotate.y += ROTATE_AMOUNT;
if (keystate[KEY_INPUT_RSHIFT]) rotate.z += ROTATE_AMOUNT;
if (keystate[KEY_INPUT_RCONTROL]) rotate.z -= ROTATE_AMOUNT;
SetCameraPositionAndAngle(cameraPos, rotate.y, rotate.x, rotate.z);
// 線
for (int i = 0; i <= LINE_MAX; ++i){
for (int j = 0; j <= LINE_MAX; ++j){
DrawLine3D(VGet(baseX, baseY + i * interval, baseZ + j * interval), VGet(endX, baseY + i * interval, baseZ + j * interval), GetColor(255.f * i / LINE_MAX, 255.f * j / LINE_MAX, 255));
DrawLine3D(VGet(baseX + i * interval, baseY, baseZ + j * interval), VGet(baseX + i * interval, endY, baseZ + j * interval), GetColor(255.f * i / LINE_MAX, 255.f * j / LINE_MAX, 255));
DrawLine3D(VGet(baseX + i * interval, baseY + j * interval, baseZ), VGet(baseX + i * interval, baseY + j * interval, endZ), GetColor(255.f * i / LINE_MAX, 255.f * j / LINE_MAX, 255));
}
}
// debug output
DrawFormatString(0, 0, GetColor(255, 255, 255), "Rotate Y:% .2f,X:% .2f,Z:% .2f,", rotate.y, rotate.x, rotate.z);
}
DxLib_End();
return 0;
}
最終的には、LSHIFTキー(初期状態では前進の意)を押し続けると(絶対座標が)右上を向いていれば右上に、左下手前を向いていれば左下手前にcameraPosが移動するようにしたく、
//☆の部分を色々いじってみたのですが、自分が行列が苦手なこともあり、
rotateを回転行列としてMMultしたりしましたが、富士急ハイランドのような動きになってしまったり、思った通りの動きになりません。
また、
if (keystate[KEY_INPUT_A]) cameraPos = VTransform(cameraPos, MGetTranslate(VGet(+1.0f,0.0f,0.0f)));
if (keystate[KEY_INPUT_D]) cameraPos = VTransform(cameraPos, MGetTranslate(VGet(-1.0f,0.0f,0.0f)));
if (keystate[KEY_INPUT_W]) cameraPos = VTransform(cameraPos, MGetTranslate(VGet(0.0f,+1.0f,0.0f)));
if (keystate[KEY_INPUT_S]) cameraPos = VTransform(cameraPos, MGetTranslate(VGet(0.0f,-1.0f,0.0f)));
if (keystate[KEY_INPUT_LSHIFT]) cameraPos = VTransform(cameraPos, MGetTranslate(VGet(0.0f,0.0f,+1.0f)));
if (keystate[KEY_INPUT_LCONTROL]) cameraPos = VTransform(cameraPos, MGetTranslate(VGet(0.0f,0.0f,-1.0f)));
今向いている方向を基準にしてキー押下で移動するためには、どのようにすればいいのでしょうか。