>sinさん
確かに名前はそうなっているのですが、これは作った順に番号を振っただけでしてコードでは1>3>2の順に描画しております。
>いっちさん
確かに画像が近すぎました。少し引いた上でメタセコイアと比較した画像も用意してみました。
ttp://lowe.client.jp/img/ss/cap_2.png
ttp://lowe.client.jp/img/ss/cap_3.png(文字入り
とりあえず同じことがおきるコードを作りました。
具体的な位置ですが、1点目は島と海の境界すべて、2点目はだいたいzが500,600、xがマイナス200のあたりです
私の環境でしか起きないのでしょうか・・・
#include <DxLib.h>
#include <math.h>
class CBattleCamera{
VECTOR Position; // カメラ座標
VECTOR Target_position; // 注視点
unsigned Range; // 注視点までの距離
float Angle_down; // 見下ろす角度(単位:ラジアン)
float Angle_rotation; // 回転角度(単位:ラジアン) ただし( 0, 0, -1 )のベクトルを0ラジアンとする
VECTOR Target_position_now;// 現在の注視点
unsigned Range_now; // 現在の注視点までの距離
float Angle_down_now; // 現在の見下ろす角度(単位:ラジアン)
float Angle_rotation_now; // 現在の回転角度(単位:ラジアン) ただし( 0, 0, -1 )のベクトルを0ラジアンとする
float Angle_down_speed; // 見下ろし変化スピード
public:
CBattleCamera()
:Target_position( VGet( 0.0f, 0.0f, 0.0f ))
,Target_position_now( VGet( 0.0f, 0.0f, 0.0f ))
,Range( 800 )
,Range_now( 800 )
,Angle_down( PHI_F/5.0f )
,Angle_down_now( PHI_F/5.0f )
,Angle_rotation( PHI_F/4.0f*3 )
,Angle_rotation_now( PHI_F/4.0f*6 )
{
this->Position.y = this->Range * sin( this->Angle_down );
this->Position.x = sin( this->Angle_rotation )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down)));
this->Position.z = cos( this->Angle_rotation )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down)));
}
~CBattleCamera(){}
bool Process(){
this->Position.x = this->Target_position_now.x + sin( this->Angle_rotation_now )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down)));
this->Position.z = this->Target_position_now.z + cos( this->Angle_rotation_now )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down)));
this->Target_position_now.x += ( this->Target_position.x - this->Target_position_now.x ) / 10;
this->Target_position_now.y += ( this->Target_position.y - this->Target_position_now.y ) / 10;
this->Target_position_now.z += ( this->Target_position.z - this->Target_position_now.z ) / 10;
if( this->Angle_down != this->Angle_down_now ){
if( this->Angle_down > this->Angle_down_now ){
this->Angle_down_now += this->Angle_down_speed;
this->Angle_down < this->Angle_down_now && ( this->Angle_down_now = this->Angle_down );
}
else {
this->Angle_down_now -= this->Angle_down_speed;
this->Angle_down > this->Angle_down_now && ( this->Angle_down_now = this->Angle_down );
}
}
if( this->Angle_rotation != this->Angle_rotation_now ){
if( this->Angle_rotation > this->Angle_rotation_now ){
this->Angle_rotation_now += PHI_F/72.0f;
this->Angle_rotation < this->Angle_rotation_now && ( this->Angle_rotation_now = this->Angle_rotation );
}
else {
this->Angle_rotation_now -= PHI_F/72.0f;
this->Angle_rotation > this->Angle_rotation_now && ( this->Angle_rotation_now = this->Angle_rotation );
}
}
SetCameraPositionAndTarget_UpVecY( this->Position, this->Target_position_now );
return true;
}
void AddCameraTargetPosition( VECTOR pos ){
this->Target_position = DxLib::VAdd( this->Target_position, pos );
this->Position = DxLib::VAdd( this->Position, pos );
}
void AddCameraAngleRotation( float angle ){
this->Angle_rotation += angle;
}
};
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
DxLib::SetGraphMode( 640, 480, 32 ) ; // 解像度設定
DxLib::ChangeWindowMode(TRUE); // ウィンドウモードに変更
DxLib::DxLib_Init(); // DXライブラリ初期化
DxLib::SetDrawScreen( DX_SCREEN_BACK ); // 描画先を裏画面に設定
DxLib::SetUseZBuffer3D(TRUE); // Zバッファを有効にする
DxLib::SetWriteZBuffer3D(TRUE); // Zバッファへの書き込みを有効にする
DxLib::SetMouseDispFlag(TRUE); // マウスを表示状態にする
DxLib::SetUseBackCulling( TRUE ); // バックカリングを行う
DxLib::SetCameraNearFar( 1.0f, 20000.0f );
DxLib::SetupCamera_Perspective( PHI_F/5 );
int ModelHandle = MV1LoadModel( "fie.mqo" );
float u = 0.0f;
CBattleCamera Camera;
while( !DxLib::ScreenFlip() && !DxLib::ProcessMessage() && !DxLib::ClearDrawScreen() && !DxLib::clsDx() ){
u+=0.0025f/60.0f;
if( u > 1.0f ){ u = 0.0f; }
VECTOR CameraPos = VGet(0.0f,0.0f,0.0f);
if( DxLib::CheckHitKey( KEY_INPUT_UP ) > 0 )
{
CameraPos.z += 10.0f ;
}
if( DxLib::CheckHitKey( KEY_INPUT_DOWN ) > 0 )
{
CameraPos.z -= 10.0f ;
}
if( DxLib::CheckHitKey( KEY_INPUT_LEFT ) > 0 )
{
CameraPos.x -= 10.0f ;
}
if( DxLib::CheckHitKey( KEY_INPUT_RIGHT ) > 0 )
{
CameraPos.x += 10.0f ;
}
if( DxLib::CheckHitKey( KEY_INPUT_A ) == 1 )
{
Camera.AddCameraAngleRotation( PHI_F/4.0f/20.0f );
}
Camera.AddCameraTargetPosition( CameraPos );
Camera.Process();
DxLib::MV1SetFrameTextureAddressTransform( ModelHandle, 1, u, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f ) ;
DxLib::MV1SetFrameTextureAddressTransform( ModelHandle, 2, 0.0f, u, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f ) ;
DxLib::MV1DrawFrame( ModelHandle,0 ) ;
DxLib::MV1DrawFrame( ModelHandle,2 ) ;
DxLib::MV1DrawFrame( ModelHandle,1 ) ;
DxLib::DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 500.0f, 0.0f, 0.0f ), GetColor( 255,0,0 ) ) ;
DxLib::DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 500.0f, 0.0f ), GetColor( 0,255,0 ) ) ;
DxLib::DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 0.0f, 500.0f ), GetColor( 0,0,255 ) ) ;
DxLib::printfDx("Aで視点回転できます。");
}
DxLib::DxLib_End();
return 0;
}