DXライブラリのカメラの回転の軸について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tanakayama

DXライブラリのカメラの回転の軸について

#1

投稿記事 by tanakayama » 8年前

初めましてtanakayamaと申します

最近DXライブラリで3Dに手を付け始めたのですがカメラの縦方向(X軸)の回転がいまいちうまくいきません
具体的に何がうまくいかないかと言うとカメラの回転の軸が(0.0.0)で固定されているので(0.10.0)を中心にして回転したいのですができません
よろしければ教えてくださいお願いします

色々実験してたのでコメントアウトが多くて申し訳ないのですがそれも何を試したのかの参考ということでお願いします

コード:

#define _USE_MATH_DEFINES
#include <math.h>
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	SetFullSceneAntiAliasingMode(12, 3);
	SetGraphMode(640, 480, 16);
	if (ChangeWindowMode(TRUE) != 0) {
		return -1;
	}
	if (DxLib_Init() != 0) {
		return -1;
	}
	if (SetDrawScreen(DX_SCREEN_BACK) != 0) {
		return -1;
	}
	int ModelHandle[343];
	double RotateX = 0;			//単位は度 ラジアン = 度 * π / 180
	double RotateY = 0;
	double Radius = 30.0;	//回転の半径 中心の物体との距離

	ModelHandle[0] = MV1LoadModel("block3.x");
	SetCameraNearFar(1.0f, 150.0f);
	//SetupCamera_Perspective(30 * M_PI / 180);
	//SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 10.0f, 0.0f), VGet(0.0f, 10.0f, 0.0f));

	while (!CheckHitKey(KEY_INPUT_ESCAPE)) {
		ClearDrawScreen();
		DrawBox(0, 0, 640, 480, 0xFFFFBB, TRUE);
		if (CheckHitKey(KEY_INPUT_S)) {
			RotateX -= 1;
			if (RotateX < -75) {
				RotateX = -75;
			}
		}
		if (CheckHitKey(KEY_INPUT_W)) {
			RotateX += 1;
			if (RotateX > 70) {
				RotateX = 70;
			}
		}
		if (CheckHitKey(KEY_INPUT_A)) {
			RotateY += 10;
		}
		if (CheckHitKey(KEY_INPUT_D)) {
			RotateY -= 10;
		}

		MATRIX Center = MGetTranslate(VGet(0.0f, 10.0f, 0.0f));
		MATRIX R = MGetTranslate(VGet(0.0f, 0.0f, -Radius));

		//MATRIX RotX = MGetRotAxis(VGet(0.0f, 0.0f, 0.0f), RotateX * M_PI / 180);
		MATRIX RotX = MGetRotX(RotateX * M_PI / 180);
		MATRIX RotY = MGetRotY(RotateY * M_PI / 180);
		MATRIX Mat1 = MMult(RotX, RotY);
		MATRIX Mat2 = MMult(Center, R);
		MATRIX Mat3 = MMult(Center, Mat1);
		//VECTOR CamPos = VTransform(VTransform(VGet(10.0f, 0.0f, -Radius), RotX), RotY);
		//VECTOR CamPos = VTransform(VTransform(VGet(0.0f, 15.0f, -Radius), RotX), RotY);
		//VECTOR CamPos = VTransform(VTransform(VGet(0.0f, 0.0f, 0.0f), Mat2), Mat1);
		//VECTOR CamPos = VTransform(VGet(0.0f, 10.0f, 0.0f), Mat1);
		VECTOR CamPos = VTransform(VGet(0.0f, 0.0f, -Radius), Mat3);
		SetCameraPositionAndTargetAndUpVec(CamPos, VGet(0.0f, 0.0f, 0.0f), VGet(0.0f, 1.0f, 0.0f));

		MV1DrawModel(ModelHandle[0]);
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}

と成りのトトロ

Re: DXライブラリのカメラの回転の軸について

#2

投稿記事 by と成りのトトロ » 8年前

ここのホームページhttp://dixq.net/g/の3d.2、3d.3、3d.4を見れば完璧に分かるはずです。
http://i-libro.net/wpmu/blog/archives/652ここも参考に。
...遣り掛けでごめんね。

コード:

#define _USE_MATH_DEFINES
#include <math.h>
#include "DxLib.h"
//------------------------------------------------------------------------------------------------ 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//------------------------------------------------------------------------------------------------
    SetGraphMode(640, 480, 16);//::SetFullSceneAntiAliasingMode(12, 3);
    if (ChangeWindowMode(TRUE) != 0) { return -1; }         //ウィンドウモード変更
    if (DxLib_Init() != 0) { return -1; }                  //初期化
    if (SetDrawScreen(DX_SCREEN_BACK) != 0) { return -1; }//裏画面設定
    int ModelHandle[343];
    double RotateX = 0;        //単位は度 ラジアン = 度 * π / 180
    double RotateY = 0;
    double Radius = 30.0;    //回転の半径 中心の物体との距離
 
	ModelHandle[0] = MV1LoadModel("d:/dat/Cube.x");//"block3.x");
    SetCameraNearFar(1.0f, 150.0f);
    //SetupCamera_Perspective(30 * M_PI / 180);
    //SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 10.0f, 0.0f), VGet(0.0f, 10.0f, 0.0f));
    //-------------------------------------------------------------------------------------------------------
    while (ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey(KEY_INPUT_ESCAP==0){
    //-------------------------------------------------------------------------------------------------------
        //ClearDrawScreen();
        DrawBox(0, 0, 640, 480, 0xFFFFBB, TRUE);
        if (CheckHitKey(KEY_INPUT_S)) {
            RotateX -= 1;
            if (RotateX < -75) {
                RotateX = -75;
            }
        }
        if (CheckHitKey(KEY_INPUT_W)) {
            RotateX += 1;
            if (RotateX > 70) {
                RotateX = 70;
            }
        }
        if (CheckHitKey(KEY_INPUT_A)) {
            RotateY += 10;
        }
        if (CheckHitKey(KEY_INPUT_D)) {
            RotateY -= 10;
        }
 
        MATRIX Center = MGetTranslate(VGet(0.0f, 10.0f, 0.0f));
        MATRIX R = MGetTranslate(VGet(0.0f, 0.0f, -Radius));
 
        //MATRIX RotX = MGetRotAxis(VGet(0.0f, 0.0f, 0.0f), RotateX * M_PI / 180);
        MATRIX RotX = MGetRotX(RotateX * M_PI / 180);
        MATRIX RotY = MGetRotY(RotateY * M_PI / 180);
        MATRIX Mat1 = MMult(RotX, RotY);
        MATRIX Mat2 = MMult(Center, R);
        MATRIX Mat3 = MMult(Center, Mat1);
        //VECTOR CamPos = VTransform(VTransform(VGet(10.0f, 0.0f, -Radius), RotX), RotY);
        //VECTOR CamPos = VTransform(VTransform(VGet(0.0f, 15.0f, -Radius), RotX), RotY);
        //VECTOR CamPos = VTransform(VTransform(VGet(0.0f, 0.0f, 0.0f), Mat2), Mat1);
        //VECTOR CamPos = VTransform(VGet(0.0f, 10.0f, 0.0f), Mat1);
        VECTOR CamPos = VTransform(VGet(0.0f, 0.0f, -Radius), Mat3);
        SetCameraPositionAndTargetAndUpVec(CamPos, VGet(0.0f, 0.0f, 0.0f), VGet(0.0f, 1.0f, 0.0f));
 
        MV1DrawModel(ModelHandle[0]);
        //ScreenFlip();
    }//-----------------------------------------------------------------------------------------------------
    DxLib_End();
    return 0;
}
///EOF///

tanakayama

Re: DXライブラリのカメラの回転の軸について

#3

投稿記事 by tanakayama » 8年前

コードとリンクまで貼ってくださってありがとうございます
リンク先はここで質問する前に何回か読んだのですがどちらも回転の中心の変え方が書いてなかったので…

コードを試してみたのですがやはり回転の中心を変えることはできませんでした
回転の中心が原点かもしくはモデルに設定されているDXLibModelViewerで言う「全ての親」になっているようです
プログラムで「全ての親」の座標を変えることはできないんでしょうかね

簡素なものですけどやりたいことを絵で表すとこういうことです よろしくお願いします
画像

tanakayama

Re: DXライブラリのカメラの回転の軸について

#4

投稿記事 by tanakayama » 8年前

色々調べたのですがやはり原点の位置を変える方法が乗っていなかったので教えてください

カメラを回転させるんじゃなくてモデルを回転させる方法だとモデルが増えた時に大変だと思うので方法があるのならカメラだけ動かす方法を教えてください
もしないようなら複数のモデルを一括で平行移動させるような関数があるのでしょうか?それとも全てのモデルをfor文で移動させなくてはいけないのでしょうか

カメラの回転の中心は常に原点になっているので下の画像(俯瞰視点)のように中心を変えたいのです お願いします
画像

tanakayama

Re: DXライブラリのカメラの回転の軸について

#5

投稿記事 by tanakayama » 8年前

本当に申し訳ありません
ふと冷静に考えてみたら原点で回転した後の座標に増減させたいX,Y,Zの値を足せばいいだけでした

ご迷惑おかけしました ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る