合計 昨日 今日

マウスの操作で動くカメラについて

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ctyu
[URL]
Date: 2017年12月01日(金) 10:34
No: 1
(OFFLINE)

 マウスの操作で動くカメラについて

今、DXライブラリの3D関連のところを勉強していて、
FPSのようにマウスを右に動かすと右に向き、
左にうごかすと左に向き、
上下にも向けるというプログラムをつくっています。

code
#include <DxLib.h>
#include <math.h>

void rotate(float *x, float *y, const float ang, const float mx, const float my) {
const float ox = *x - mx, oy = *y - my;
*x = ox * cos(ang) + oy * sin(ang);
*y = -ox * sin(ang) + oy * cos(ang);
*x += mx;
*y += my;
}


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(FALSE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

int Handle = MV1LoadModel("3Dsample/dat/Lat式ミク/Lat式ミクVer2.3_Normal.pmd");
float camera_x = 0.0 , camera_y = 10.0, camera_z = -20.0;
float target_x = 0.0, target_y = 10.0, target_z = 0.0;
float x = 0.0, y = 0.0, z = 0.0;
int mouse_x_check = 0, mouse_y_check = 0;
float camera_speed_x = 0.0;
float camera_speed_y = 0.0;

SetCameraNearFar(0.1, 10000.0);
SetCameraPositionAndTarget_UpVecY(VGet(camera_x, camera_y, camera_z), VGet(target_x, target_y, target_z));

while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {

GetMousePoint(&mouse_x_check, &mouse_y_check); //マウス座標の更新
if (0 < mouse_x_check) { //マウスの横移動の処理、マウスが右に移動したらカメラを右回転に設定
camera_speed_x = 0.05;
}
else {
if (0 > mouse_x_check) { //マウスが左に移動したらカメラを左回転に設定
camera_speed_x = -0.05;
}
else {
camera_speed_x = 0.0; //マウスが動いてなければカメラの横移動をキャンセル
}
}

if (10 > mouse_y_check) { //マウスの横移動の処理、マウスが上に移動したらカメラを右回転に設定
camera_speed_y = 0.05;
}
else {
if (10 < mouse_y_check) { //マウスが下に移動したらカメラを左回転に設定
camera_speed_y = -0.05;
}
else {
camera_speed_y = 0.0; //マウスが動いてなければカメラの縦移動をキャンセル
}
}
SetMousePoint(0, 10); //マウス座標リセット
rotate(&target_x, &target_z, camera_speed_x, camera_x, camera_z); //カメラを回転
rotate(&target_y, &target_z, camera_speed_y, camera_y, camera_z); //カメラを回転
//次のフレームでの比較のためのマウス座標の保存

if (CheckHitKey(KEY_INPUT_A)) {
camera_x -= 0.1;
}
if (CheckHitKey(KEY_INPUT_D)) {
camera_x += 0.1;
}
if (CheckHitKey(KEY_INPUT_W)) {
camera_z += 0.1;
}
if (CheckHitKey(KEY_INPUT_S)) {
camera_z -= 0.1;
}

SetCameraPositionAndTarget_UpVecY(VGet(camera_x, camera_y, camera_z), VGet(target_x, target_y,target_z));
MV1SetPosition(Handle, VGet(x, y, z));
MV1DrawModel(Handle);
DrawFormatString(10, 10, GetColor(0, 255, 0), "mouse_x_check = %d mouse_y_check = %d",mouse_x_check,mouse_y_check);
}
DxLib_End();
return 0;
}
/code

こんな感じです。
左右は正常に動きますが、x軸上で上下にマウスを動かすとなぜかななめにカメラが動いてしまいます。
どうすればよいのでしょうか?

Name: ctyu
[URL]
Date: 2017年12月01日(金) 10:35
No: 2
(OFFLINE)

 Re: マウスの操作で動くカメラについて

今、DXライブラリの3D関連のところを勉強していて、
FPSのようにマウスを右に動かすと右に向き、
左にうごかすと左に向き、
上下にも向けるというプログラムをつくっています。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <DxLib.h>
#include <math.h>
 
void rotate(float *x, float *y, const float ang, const float mx, const float my) {
const float ox = *x - mx, oy = *y - my;
*x = ox * cos(ang) + oy * sin(ang);
*y = -ox * sin(ang) + oy * cos(ang);
*x += mx;
*y += my;
}
 
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(FALSE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
 
int Handle = MV1LoadModel("3Dsample/dat/Lat式ミク/Lat式ミクVer2.3_Normal.pmd");
float camera_x = 0.0 , camera_y = 10.0, camera_z = -20.0;
float target_x = 0.0, target_y = 10.0, target_z = 0.0;
float x = 0.0, y = 0.0, z = 0.0;
int mouse_x_check = 0, mouse_y_check = 0;
float camera_speed_x = 0.0;
float camera_speed_y = 0.0;
 
SetCameraNearFar(0.1, 10000.0);
SetCameraPositionAndTarget_UpVecY(VGet(camera_x, camera_y, camera_z), VGet(target_x, target_y, target_z));
 
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
 
GetMousePoint(&mouse_x_check, &mouse_y_check);  //マウス座標の更新
if (0 < mouse_x_check) {    //マウスの横移動の処理、マウスが右に移動したらカメラを右回転に設定
camera_speed_x = 0.05;
}
else {
if (0 > mouse_x_check) {    //マウスが左に移動したらカメラを左回転に設定
camera_speed_x = -0.05;
}
else {
camera_speed_x = 0.0;   //マウスが動いてなければカメラの横移動をキャンセル
}
}
 
if (10 > mouse_y_check) {   //マウスの横移動の処理、マウスが上に移動したらカメラを右回転に設定
camera_speed_y = 0.05;
}
else {
if (10 < mouse_y_check) {   //マウスが下に移動したらカメラを左回転に設定
camera_speed_y = -0.05;
}
else {
camera_speed_y = 0.0;   //マウスが動いてなければカメラの縦移動をキャンセル
}
}
SetMousePoint(0, 10);   //マウス座標リセット
rotate(&target_x, &target_z, camera_speed_x, camera_x, camera_z);   //カメラを回転
rotate(&target_y, &target_z, camera_speed_y, camera_y, camera_z);   //カメラを回転
//次のフレームでの比較のためのマウス座標の保存
 
if (CheckHitKey(KEY_INPUT_A)) {
camera_x -= 0.1;
}
if (CheckHitKey(KEY_INPUT_D)) {
camera_x += 0.1;
}
if (CheckHitKey(KEY_INPUT_W)) {
camera_z += 0.1;
}
if (CheckHitKey(KEY_INPUT_S)) {
camera_z -= 0.1;
}
 
SetCameraPositionAndTarget_UpVecY(VGet(camera_x, camera_y, camera_z), VGet(target_x, target_y,target_z));
MV1SetPosition(Handle, VGet(x, y, z));
MV1DrawModel(Handle);
DrawFormatString(10, 10, GetColor(0, 255, 0), "mouse_x_check = %d mouse_y_check = %d",mouse_x_check,mouse_y_check);
}
DxLib_End();
return 0;
}


こんな感じです。
左右は正常に動きますが、x軸上で上下にマウスを動かすとなぜかななめにカメラが動いてしまいます。
どうすればよいのでしょうか?

Name: ctyu
[URL]
Date: 2017年12月01日(金) 12:33
No: 3
(OFFLINE)

 Re: マウスの操作で動くカメラについて

お願いします。誰か教えてください、、、。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]