ページ 1 / 1
アイテム表示
Posted: 2012年7月09日(月) 17:16
by わからんこ
コード:
void Camera_Process(void){
////SetMouseDispFlag(FALSE);
float h,v;
MATRIX z;
MATRIX y;
float Camera_model_Length ;
Camera_model_Length =4000.0f;//CAMERA_PLAYER_LENGTH;
// マウスの位置を取得
int mouse_x, mouse_y;
GetMousePoint( &mouse_x , &mouse_y ) ;
set.MouseX += mouse_x - 320;
set.MouseY += mouse_y - 240;
if(set.MouseY>=80)set.MouseY=80;
if(set.MouseY<=-70)set.MouseY=-70;
h=(set.MouseX/120.0f);
v=(set.MouseY/120.0f);
y=MGetRotY(h);
z=MGetRotZ(v);
cam.pos=VAdd(mod.pos,VGet(0.0f,PLAYER_HIT_HEIGHT+25.0f,0));
cam.target_pos = VAdd( VTransform( VTransform( VGet( -Camera_model_Length, 0.0f, 0.0f ), z ), y ), cam.pos) ;
mod.aitem_pos= VAdd( VTransform( VTransform( VGet( -70.0f, -50.0f, 0.0f ), z ), y ), cam.pos) ;
// カメラの情報をライブラリのカメラに反映させる
SetCameraPositionAndTarget_UpVecY( cam.pos,cam.target_pos ) ;
SetMousePoint(320,240);
}
コード:
void aitem_model(void){
MV1SetMatrix(mod.aitem_Handle, MGetIdent());
MV1SetScale(mod.aitem_Handle, VGet(20.0f, 20.0f, 20.0f) );
MV1SetRotationXYZ( mod.aitem_Handle, VNorm(VSub( cam.target_pos,cam.pos ))) ;
MV1SetPosition(mod.aitem_Handle,mod.aitem_pos);
}
今、見えている視野の目の前にアイテムを表示させたいのですが、うまくいきません。
アイテムはカメラの注視点を使いモデルの手前に表示しています。
しかし、カメラを動かすとアイテムが回転してしまいます。
3Dシューティングゲームのように視点を動かし、それに銃の動きがついてくるようにしたいのです。
MV1SetRotationXYZ( mod.aitem_Handle, VNorm(VSub( cam.target_pos,cam.pos ))) ;
カメラの注視点ーカメラ座標、この値を正規化したものでは向きが出せないのでしょうか?
Re: アイテム表示
Posted: 2012年7月09日(月) 19:32
by softya(ソフト屋)
カメラのビュー行列を得て、それを平行移動したものをアイテムに反映させれば目の前に出現できるはずですが。
Re: アイテム表示
Posted: 2012年7月09日(月) 21:15
by わからんこ
ビュー行列、ちょっと勉強してきます
Re: アイテム表示
Posted: 2012年7月09日(月) 23:08
by わからんこ
コード:
void Aitem_Process(void){
MATRIX byu;
MATRIX In1;
VECTOR vect1;
//単位行列渡してるだけとサイズ変更
MV1SetMatrix(mod.aitem_Handle, MGetIdent());
MV1SetScale(mod.aitem_Handle, VGet(20.0f, 20.0f, 20.0f) );
//カメラのビュー行列を得る
byu=GetCameraProjectionMatrix();
In1=MGetTranslate(VGet(0.0f,0.0f,50.0f)) ;
In1=MAdd( In1, byu ) ;
VTransform(mod.aitem_pos, In1) ;
MV1SetPosition(mod.Gun_Handle,mod.aitem_pos);
}
ビュー行列というのは、カメラの座標で、
そこを基準に平行移動させることで、表示画面につねに描写する。
こういうことを実現させようとしましたが、これではうまくいきませんでした。
Re: アイテム表示
Posted: 2012年7月09日(月) 23:20
by softya(ソフト屋)
ビュー行列を平行移動して、そのままMV1SetMatrix()してみてください。
Re: アイテム表示
Posted: 2012年7月09日(月) 23:32
by わからんこ
自分では上の関数でビュー行列を平行移動させているつもりなのですが、
あれでは平行移動になってないですか?
Re: アイテム表示
Posted: 2012年7月10日(火) 00:57
by softya(ソフト屋)
わからんこ さんが書きました:自分では上の関数でビュー行列を平行移動させているつもりなのですが、
あれでは平行移動になってないですか?
せっかくの回転成分が消えますが良いのですか?
Re: アイテム表示
Posted: 2012年7月10日(火) 01:44
by softya(ソフト屋)
失礼しました。逆行列化と行列を掛けないいけないですね。
サンプルを用意しました。
数値やファイル名は実物に合わせて調整してみてください。
コード:
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle,ItemHandle ;
VECTOR CameraPos ;
//ウィンドウモードにする
ChangeWindowMode(TRUE);
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "sample/SimpleModel.mqo" ) ;
ItemHandle = MV1LoadModel( "item.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラの座標を初期化
CameraPos.x = 0.0f ;
CameraPos.y = 0.0f ;
CameraPos.z = -800.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 方向キーでカメラの座標を移動
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
CameraPos.y += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
CameraPos.y -= 20.0f ;
}
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
CameraPos.x -= 20.0f ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
CameraPos.x += 20.0f ;
}
// カメラの位置と注視点をセット、注視点は原点
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ) ;
// モデルの描画
MV1DrawModel( ModelHandle ) ;
// カメラのビューマトリクス
MATRIX viewMtx = GetCameraViewMatrix();
// アイテムの位置の計算
MATRIX itemMtx = MInverse(viewMtx);
MATRIX moveMtx = MGetTranslate( VGet(0.0f,0.0f,800.0f) );
itemMtx = MMult( moveMtx, itemMtx ) ;
// アイテムにマトリクスを反映。
MV1SetMatrix( ItemHandle,itemMtx );
MV1DrawModel( ItemHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Re: アイテム表示
Posted: 2012年7月11日(水) 00:53
by わからんこ
わざわざコードまで作っていただき、
ありがとうございます。
もう一度勉強してきましたが、
以前のビュー行列の解釈が間違ってました。
Re: アイテム表示
Posted: 2012年7月11日(水) 16:24
by わからんこ
すいません、ひとつだけわからないことがありました。
書いていただいた、アイテムを表示するコードは
手前フリップも変更してしまうのですか?
z軸成分を800fから40fにすると映らなくなってしまいます。
50fではうつるのですが・・・
Re: アイテム表示
Posted: 2012年7月11日(水) 16:32
by softya(ソフト屋)
わからんこ さんが書きました:すいません、ひとつだけわからないことがありました。
書いていただいた、アイテムを表示するコードは
手前フリップも変更してしまうのですか?
z軸成分を800fから40fにすると映らなくなってしまいます。
50fではうつるのですが・・・
SetCameraNearFar()の事でしょうか?
http://homepage2.nifty.com/natupaji/DxL ... html#R12N1
変えていませんのでクリップがうまく働かないなら、もともとの問題だと思います。
アイテムはカメラの直近に描画されますのでnearクリップ値を良く考えないとマズイでしょう。
Re: アイテム表示
Posted: 2012年7月11日(水) 18:01
by わからんこ
これで本当に解決しました。
なんどもありがとうございました!