h2so5 さんが書きました:
SetupCamera_Ortho, SetCameraViewMatrix, DrawBillboard3D を組み合わせれば可能だと思います。
アドバイスありがとうございます。
おかげで行列を描画に反映する事ができました。
コード:
/*ベクトルクラス*/
class Vector2D{
public:
Vector2D();
Vector2D(int ax,int ay);
Vector2D(double ax,double ay);
void operator+=(const Vector2D& a);
void operator-=(const Vector2D& a);
void operator=(const Vector2D& a);
double x;//座標
double y;
};
/*カメラクラス*/
class Camera2D{
public:
Vector2D pos; //カメラの座標
Vector2D Lpos; //カメラの注視点。LookPositionてきな
Vector2D scale; //拡大率
double rotate;
Camera2D(); //コンストラクタ
void Move(); //カメラノムーブ
MATRIX GetMatrix();//カメラ行列生成
};
/*ベクトルクラスのメンバ関数定義はこの辺にあるが、省略*/
Camera2D::Camera2D(){
pos.x = SCREEN_WIDTH/2; //カメラの初期位置は画面の中央
pos.y = SCREEN_HEIGHT/2;
Lpos.x = SCREEN_WIDTH/2; //画面の中心点
Lpos.y = SCREEN_HEIGHT/2;
rotate = 0.0;
scale.x = 1.0; //拡大率は1
scale.y = 1.0;
}
void Camera2D::Move(){
//移動量
Vector2D move;
move.x=2.0;move.y=2.0;
//カメラの位置移動処理
if(CheckKey(KEY_INPUT_A)>0){
pos.x-=move.x;
}
if(CheckKey(KEY_INPUT_D)>0){
pos.x+=move.x;
}
if(CheckKey(KEY_INPUT_W)>0){
pos.y-=move.y;
}
if(CheckKey(KEY_INPUT_S)>0){
pos.y+=move.y;
}
//カメラの拡大率走査
if(CheckMouse(MOUSE_INPUT_LEFT)>0){//拡大
scale.x+=0.1;
scale.y+=0.1;
}
if(CheckMouse(MOUSE_INPUT_RIGHT)>0){//縮小
scale.x-=0.1;
scale.y-=0.1;
}
}
MATRIX Camera2D::GetMatrix(){
MATRIX m1;
VECTOR Pos;
VECTOR LPos;
VECTOR Scale;
/*ベクトルを2dから3dに*/
Pos.x = pos.x*-1;
Pos.y = pos.y*-1;
Pos.z = 0.0*-1;
Scale.x = scale.x;
Scale.y = scale.y;
Scale.z = 1.0;
LPos.x = Lpos.x;
LPos.y = Lpos.y;
LPos.z = 0.0;
/*上記を元に行列を生成*/
m1 = MMult(MGetTranslate(Pos),MGetScale(Scale));//平行移動(-位置)×拡大
m1 = MMult(m1,MGetRotZ( rotate ));//それに回転をかける
m1 = MMult(m1,MGetTranslate(LPos));//さいごに画面の中心をかける
return m1;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
int haikei;//グラハン
Camera2D c;
MATRIX mat;
// 読み込み
haikei = LoadGraph("img/1351422467412.jpg")/*("img/0a4f3fd9.png")*/;
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!UpdateKey()&&!UpdateMouse()){
c.Move();
mat = c.GetMatrix();
SetupCamera_Ortho( 480 ) ;
// カメラクラス行列をビュー行列としてセット
SetCameraViewMatrix( mat ) ;
//適当な画像を描画
DrawBillboard3D( VGet( 800.0f, 0.0f,0.0f), 0.5f, 0.5f, 338.0f, 0.0f, haikei, TRUE ) ;
//行列がどうなってるか表示
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "m[0][0] %f m[0][1] %f m[0][2] %f m[0][3] %f",
mat.m[0][0], mat.m[0][1], mat.m[0][2],mat.m[0][3] ) ;
DrawFormatString( 0, 32*2, GetColor( 255,255,255 ), "m[1][0] %f m[1][1] %f m[1][2] %f m[1][3] %f",
mat.m[1][0], mat.m[1][1], mat.m[1][2],mat.m[1][3] ) ;
DrawFormatString( 0, 32*3, GetColor( 255,255,255 ), "m[2][0] %f m[2][1] %f m[2][2] %f m[2][3] %f",
mat.m[2][0], mat.m[2][1], mat.m[2][2],mat.m[2][3] ) ;
DrawFormatString( 0, 32*4, GetColor( 255,255,255 ), "m[3][0] %f m[3][1] %f m[3][2] %f m[3][3] %f",
mat.m[3][0], mat.m[3][1], mat.m[3][2],mat.m[3][3] ) ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
と、コードはこんな感じになり、行列は反映できたのですが、
カメラをいくら動かしても、画面が真っ暗なままです。
どうやら描画されてるのですが、カメラがそれをとらえてないようです。
行列を以下のようにカメラクラス以外のものにし、回転率をいじってみたら
カメラが描画された画像をとらえました。
コード:
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!UpdateKey()&&!UpdateMouse()){
// 左右キーでカメラの回転値を変更
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
Rot1 -= PHI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
Rot1 += PHI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
Rot2 -= PHI_F / 60.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
Rot2 += PHI_F / 60.0f ;
}
// 回転値を使用してXY軸の回転行列を作成
mat = MMult(MGetRotX( Rot2 ),MGetRotY( Rot1 )) ;
SetupCamera_Ortho( 480 ) ;
// 回転行列をビュー行列としてセット
SetCameraViewMatrix( mat ) ;
DrawBillboard3D( VGet( 800.0f, 0.0f,0.0f), 0.5f, 0.5f, 338.0f, 0.0f, haikei, TRUE ) ;
画面が真っ暗な状態の直し方はもちろんわからないのですが、それ以前に、画面内の3d空間がどうなってるのかいまいちわかりません。
回転行列でいろいろいじってみましたが、いまいちどうなってるのかがわかりません。
2d画面はxは横、yは縦とわかったのですが、
3d空間はどれがx方向、y方向、z方向なのか、どれもわからず、暗闇にどんと突き落とされたみたいです。
y方向に回転するとなぜか2d画面で言う横、xの動きをするし、x方向にカメラを回転すると縦に動くし、z方向にカメラを回転すると画面が回るし、だんだん頭がおかしく―――(^ω^;)
おかげで図も書けず、画面真っ暗問題をどう直すかも考えられない始末です。
正射角に変えたカメラは、どんな3d空間のどこにあり、どこを向いていて、描画された画像はどこにあるんでしょうか?
3Dははじめてなのでかなり初歩的な事を聞いていると思いますが、この言葉をググれでもかまいません。
アドバイスお願いします。