ページ 11

DXライブラリの三次元モデル表示で左右逆転

Posted: 2013年1月07日(月) 12:56
by yaniki
こんにちは。よろしくお願いいたします。

現在DXライブラリを用いて三次元モデルのビューワーを制作しているのですが、
モデルを表示させたときに

既存のソフト<Rhinoceros>や<MoNoGon>で表示させたモデルと比べると、
左右逆転のモデルが表示されてしまいます。
(カメラが逆の位置にあるなどではなくて、モデルが変形してしまっています。
既存のソフトでは右手を上げているのに、作成したビューワーだと左手を上げているような状態です。)

これはDXライブラリの仕様だったりするのか、それとも自分のプログラムに誤りがあるのか、
わからなくて質問させていただきました。

コードは以下となります。
稚拙なコードですがよろしくお願いいたします。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	// ウィンドウを開いて実行
	ChangeWindowMode( TRUE );

	// ウィンドウのサイズ指定             
	SetGraphMode(1280, 960, 32);

	// ウィンドウの背景色変更
	SetBackgroundColor( 100, 0, 0 );


	// DXライブラリの起動
	SetWindowText( "DxLib:" DXLIB_VERSION_STR );
	if ( DxLib_Init( ) == -1 ) return -1;

	int white = GetColor( 255, 255, 255 );

	// 3Dモデルの設定
	int mh1  = MV1LoadModel( "DXmodel.x" );	

	// 標準ライトの方向
	SetLightDirection( VGet( -1.0f, -1.0f, 0.0f ) ) ;


	//マウス座標系関数の初期化
	int NewX1 = 0, NewY1 = 0, NewX2 = 0, NewY2 = 0, NewBtn = 0, OldX1 = 0, OldY1 = 0, OldX2 = 0, OldY2 = 0, OldBtn = 0;
	int MoveX = 0, MoveY = 0, MoveZ = 0;

	int a = 0, b = 0 ;
	float x = 1.0f, y = 1.0f, lx = 10.0f, ly = -15.0f, lz = 30.0f;

	int Mx, My ;
	int i, MeshNum ;

	

	//カメラのの変数の初期値
	float CamR = 30.0f, CamA = 50.0f, CamB = 0.0f;

	//カメラを移動&ズームさせる時の速度
	const float AngleRate = PHI_F / 360.0f, ZoomRate = 1.0f;
	VECTOR CamPos = VGet( 0.0f, 0.0f, -CamR );

	// 描画先を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK );

	// ウィンドウを閉じるかエスケープが押されるまでループ
	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) 
	{
		// スクリーンの前処理
		ClearDrawScreen( );
		
		// マウスの座標を取得
		GetMousePoint( &Mx, &My ) ;
		GetMousePoint( &a, &b );
		GetMousePoint( &NewX1, &NewY1 );

		// カメラの座標を初期化
		CamPos.x = 50.0f ;
		CamPos.y = 0.0f ;
		CamPos.z = 0.0f ;

		// マウス入力の取得(マウスホイールを回すとズーム)
		MoveZ = -GetMouseWheelRotVol( );
		CamA += MoveZ * ZoomRate ;

			//左クリックが押されている間は新しい座標を取り、古い座標との差を計算し続ける。
			if ( (NewBtn = GetMouseInput( )) & MOUSE_INPUT_RIGHT )
			{	
				MoveX += ( NewX1 - OldX1 ) ;
				MoveY += ( NewY1 - OldY1 ) ;
			}

			if ( (NewBtn = GetMouseInput( )) & MOUSE_INPUT_LEFT )
			{	
				lz += ( NewX1 - OldX1 ) ;
				ly += ( NewY1 - OldY1 ) ;
			}
			else
			{
				OldX1 = NewX1 ;
				OldY1 = NewY1 ;
			}

		CamPos.x = 50.0f + CamA ;

		// カメラの位置と注視点をセット
		SetCameraPositionAndTarget_UpVecY( CamPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
		
		// モデルの位置のセット
		MV1SetPosition( mh1, VGet(  lx , ly / 700.0f, lz / 700.0f) );

		// 3Dモデルの回転値を90度にセットする
		MV1SetRotationXYZ( mh1 , VGet( 0.0f , -MoveX / 700.0f , -MoveY / 700.0f ) ) ;

		// 3Dモデルを表示する
		MV1DrawModel( mh1 );

		//表示する距離の限界の設定
		SetCameraNearFar( 0.08f, 1000.0f ) ;

		//SetDrawAreaFull( );
		ScreenFlip( );
	}
	DxLib_End( );
	return 0;
}

Re: DXライブラリの三次元モデル表示で左右逆転

Posted: 2013年1月07日(月) 13:04
by softya(ソフト屋)
OpenGL系とDirectX系の座標系の違いだと思います。右手系と左手系とも呼ばれますね。
<Rhinoceros>や<MoNoGon>は分かりませんが、座標系を切り替えてファイル出力できない場合は何らかのコンバータを通す必要があると思います。

Re: DXライブラリの三次元モデル表示で左右逆転

Posted: 2013年1月07日(月) 17:59
by yaniki
softyaさん。

いつもありがとうございます。
座標系の違いなのですね。理由が知りたかったので助かりました。

(即興ですが)鏡映しにするような質問、関数を見つけましたので
この方法で対応しようと思います。
ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=1984

ご覧になってくださったみなさまも、ありがとうございました。