原因はtanを使っていることにあるのは分かっているのですが、他にやり方がわかりません。
言語:C
ライブラリ:DXライブラリ
コンパイラ:VisualStudio2010
カメラの旋回はマウス、カメラの移動はキーボードのWASDキーです。
Wキーを押せばカメラの向いている方向に前進。
Sキーを押せばカメラの向いている方向から後進。
Aキーを押せばカメラの向いている方向から左に移動。
Dキーを押せばカメラの向いている方向から右に移動です。
どうすればいいのでしょうか?
#include "DxLib.h"
#include <math.h>
#define CAMERA_SPEED 10.0f
#define rad(a) (a * DX_PI_F / 180.0f)
int NewX = 0, NewY = 0;
int OldX = 0, OldY = 0;
typedef struct{
float PosX, PosY, PosZ;
float RotV, RotH;
}CameraStatus;
CameraStatus Camera = {800.0f, 0.0f, 800.0f, 0.0f, -135.0f};
void MoveCamera();
void DrawSp();
void Information();
int ProcessLoop(){
if(ProcessMessage() != 0){ return -1; }
if(ClearDrawScreen() != 0){ return -1; }
return 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 16);
SetBackgroundColor(255,255,255);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
SetMousePoint(320,240);
SetMouseDispFlag(FALSE);
GetMousePoint(&OldX, &OldY);
while(ProcessLoop() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE)){
MoveCamera();
DrawFormatString(310, 230, GetColor(0,0,0), "( )");
DrawSp();
Information();
ScreenFlip();
}
DxLib_End();
return 0;
}
void MoveCamera(){
if(CheckHitKey(KEY_INPUT_W) != 0){
Camera.PosX += CAMERA_SPEED * sin(rad(Camera.RotH));
Camera.PosZ += CAMERA_SPEED * cos(rad(Camera.RotH));
Camera.PosY -= CAMERA_SPEED * tan(rad(Camera.RotV));
}
if(CheckHitKey(KEY_INPUT_S) != 0){
Camera.PosX -= CAMERA_SPEED * sin(rad(Camera.RotH));
Camera.PosZ -= CAMERA_SPEED * cos(rad(Camera.RotH));
Camera.PosY += CAMERA_SPEED * tan(rad(Camera.RotV));
}
if(CheckHitKey(KEY_INPUT_D) != 0){
Camera.PosX += CAMERA_SPEED * cos(rad(Camera.RotH));
Camera.PosZ -= CAMERA_SPEED * sin(rad(Camera.RotH));
}
if(CheckHitKey(KEY_INPUT_A) != 0){
Camera.PosX -= CAMERA_SPEED * cos(rad(Camera.RotH));
Camera.PosZ += CAMERA_SPEED * sin(rad(Camera.RotH));
}
GetMousePoint(&NewX, &NewY);
Camera.RotH += NewX - OldX;
Camera.RotV += NewY - OldY;
OldX = NewX; OldY = NewY;
SetCameraPositionAndAngle(VGet(Camera.PosX, Camera.PosY, Camera.PosZ), rad(Camera.RotV) , rad(Camera.RotH), 0);
}
void DrawSp(){
for(float x = 80.0f; x < 5000.0f; x += 80.0f){
DrawSphere3D(VGet(x,0,0), 30, 8, GetColor(255,0,0), GetColor(255,255,255), FALSE);
}
for(float y = 80.0f; y < 5000; y += 80.0f){
DrawSphere3D(VGet(0,y,0), 30, 8, GetColor(0,255,0), GetColor(255,255,255), FALSE);
}
for(float z = 80.0f; z < 5000; z += 80.0f){
DrawSphere3D(VGet(0,0,z), 30, 8, GetColor(0,0,255), GetColor(255,255,255), FALSE);
}
}
void Information(){
DrawFormatString(0, 0, GetColor(0,0,0), "ESCキーで終了します");
DrawFormatString(0, 20, GetColor(0,0,0), "Wキーで前進");
DrawFormatString(0, 40, GetColor(0,0,0), "Sキーで後進");
DrawFormatString(0, 60, GetColor(0,0,0), "Aキーで左移動");
DrawFormatString(0, 80, GetColor(0,0,0), "Sキーで右移動");
}