DXライブラリの三次元モデル表示で左右逆転
Posted: 2013年1月07日(月) 12:56
こんにちは。よろしくお願いいたします。
現在DXライブラリを用いて三次元モデルのビューワーを制作しているのですが、
モデルを表示させたときに
既存のソフト<Rhinoceros>や<MoNoGon>で表示させたモデルと比べると、
左右逆転のモデルが表示されてしまいます。
(カメラが逆の位置にあるなどではなくて、モデルが変形してしまっています。
既存のソフトでは右手を上げているのに、作成したビューワーだと左手を上げているような状態です。)
これはDXライブラリの仕様だったりするのか、それとも自分のプログラムに誤りがあるのか、
わからなくて質問させていただきました。
コードは以下となります。
稚拙なコードですがよろしくお願いいたします。
現在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;
}