DXライブラリの3D視点

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

DXライブラリの3D視点

#1

投稿記事 by DADADA » 13年前

こんばんは。
DXライブラリの3Dプログラミングについてです。
下の画像のようにモデルとカメラの座標,視点(オレンジ色の線)を設定しました。
http://uploda.cc/img/img50f42027e8518.jpg
しかし出力画像が
http://uploda.cc/img/img50f420e002e7f.jpg
のようになってしまいます。
青い線はZ軸です。
Z軸が画面の横方向にあるので明らかに見てる方向がおかしいと思います。
何故でしょうか。

コード:

float mx=0,my=0,mz=800;//モデルの座標

  while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

   SetCameraPositionAndTargetAndUpVec(VGet(400,0.0f,0.0f),VGet(400,0.0f,10000),VGet(0.0f,1.0f,0.0f));
   MV1SetPosition(model,VGet(mx,my,mz));
   MV1DrawModel(model);

  //座標系表示
	DrawLine3D(VGet(0.0,0.0,0.0),VGet(1000.0,0.0,0.0),GetColor(255,0,0));
	DrawLine3D(VGet(0.0,0.0,0.0),VGet(0.0,1000.0,0.0),GetColor(0,255,0));
	DrawLine3D(VGet(0.0,0.0,0.0),VGet(0.0,0.0,1000.0),GetColor(0,0,255));

    DxLib_End(); 
    return 0;
   }  
よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DXライブラリの3D視点

#2

投稿記事 by softya(ソフト屋) » 13年前

明らかにコードが間違ってますがコピペ失敗でしょうか?
夜遅いので明日また検証しますので、モデルを使わずに代わりに球などを描画して、そのまま動くコードを張ってもらえますか?
お願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

DADADA

Re: DXライブラリの3D視点

#3

投稿記事 by DADADA » 13年前

返信ありがとうございます。
すみません。
コードをそのまま貼ります。

コード:

#include "DxLib.h"

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

float b=400.0f;//カメラのX座標
float mx=0.0f,my=0.0f,mz=800.0f;//球の座標

 SetUseZBuffer3D(TRUE);
 SetWriteZBuffer3D(TRUE);

 while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

       SetCameraPositionAndTargetAndUpVec(VGet(b,0.0f,0.0f),VGet(b,0.0f,10000.0f),VGet(0.0f,1.0f,0.0f));
       DrawSphere3D( VGet(mx,my,mz), 80.0f, 16, GetColor( 255,0,0 ), GetColor( 0,0,0 ), TRUE ) ;

       //座標軸を表示
       DrawLine3D(VGet(0.0f,0.0f,0.0f),VGet(1000.0f,0.0f,0.0f),GetColor(255,0,0));
       DrawLine3D(VGet(0.0f,0.0f,0.0f),VGet(0.0f,1000.0f,0.0f),GetColor(0,255,0));
       DrawLine3D(VGet(0.0f,0.0f,0.0f),VGet(0.0f,0.0f,1000.0f),GetColor(0,0,255));
 }
 DxLib_End(); 
 return 0;
}  

よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: DXライブラリの3D視点

#4

投稿記事 by h2so5 » 13年前

表示としては正常ではないでしょうか?
Z軸が壁だとして、壁に対して平行に立ったら壁が横に見えますよね。

透視法射影ではなく、正射影カメラを使った場合は見えないと思いますが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DXライブラリの3D視点

#5

投稿記事 by softya(ソフト屋) » 13年前

結論としては正常です。Zは奥行き方向ですがデフォルトの画角が確か45から50度ぐらいだったはずのでああいう風に見えます。
こんなイメージです。
3d.png
3d.png (10.25 KiB) 閲覧数: 2087 回
分かりやすくするためにZ方向の線の長さを長くして平行線を走らせてみました。

コード:

#include "DxLib.h"

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

	float b = 400.0f; //カメラのX座標
	float mx = 0.0f, my = 0.0f, mz = 800.0f; //球の座標

	SetUseZBuffer3D( TRUE );
	SetWriteZBuffer3D( TRUE );

	while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {

		SetCameraPositionAndTargetAndUpVec( VGet( b, 0.0f, 0.0f ), VGet( b, 0.0f, 10000.0f ), VGet( 0.0f, 1.0f, 0.0f ) );
		DrawSphere3D( VGet( mx, my, mz ), 80.0f, 16, GetColor( 255, 0, 0 ), GetColor( 0, 0, 0 ), TRUE ) ;

		//座標軸を表示
		DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 1000.0f, 0.0f, 0.0f ), GetColor( 255, 0, 0 ) );
		DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 1000.0f, 0.0f ), GetColor( 0, 255, 0 ) );
		DrawLine3D( VGet( 0.0f, -100.0f, 0.0f ), VGet( 0.0f, -100.0f, 2000.0f ), GetColor( 0, 0, 255 ) );
		DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 0.0f, 2000.0f ), GetColor( 0, 0, 255 ) );
		DrawLine3D( VGet( 0.0f, 100.0f, 0.0f ), VGet( 0.0f, 100.0f, 2000.0f ), GetColor( 0, 0, 255 ) );
	}
	DxLib_End();
	return 0;
}

by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

DADADA

Re: DXライブラリの3D視点

#6

投稿記事 by DADADA » 13年前

理解することができました!
ありがとうございました!

閉鎖

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