+ -
当前位置:首页 → 问答吧 → 两个物体的相对位置D3D

两个物体的相对位置D3D

时间:2011-07-11

来源:互联网

我想把床放在屋子的图片里 老是早不好相对的位置 哪位大侠帮帮忙
另外 我都设了了旋转 但是看的迷糊于是我都把旋转的命令删了 然后一个也不显示了是为啥呢
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice,  
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
void* pUserContext )
{
  HRESULT hr;

  V_RETURN( g_DialogResourceManager.OnCreateDevice( pd3dDevice ) );
  V_RETURN( g_SettingsDlg.OnCreateDevice( pd3dDevice ) );
   
  //创建字体
  V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
  OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
  L"Arial", &g_pFont ) );

//创建老虎网格模型
V_RETURN(g_pMesh.Create(pd3dDevice, L"Media\\墙壁和门_1.x")) ;
V_RETURN(g_pMesh1.Create(pd3dDevice, L"Media\\床_1.x")); 

D3DXVECTOR3 vecAt ( 0,0,0 );
D3DXVECTOR3 vecEye( 0,2,-5);
g_Camera.SetViewParams( &vecEye, &vecAt );
g_Camera.SetScalers(0.01f,50.0f);//摄象机前后移动弧度
g_Camera.SetEnableYAxisMovement(true);//按Q,E是否可以移动
g_Camera.SetEnablePositionMovement(true);//摄象机是否可以移动
return hr;
}


//-----------------------------------------------------------------------------
// Desc: 在此创建默认内存类型资源对象, 设置相关渲染状态(重置设备)
//-----------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
  const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
void* pUserContext )
{
  HRESULT hr;

  V_RETURN( g_DialogResourceManager.OnResetDevice() );
  V_RETURN( g_SettingsDlg.OnResetDevice() );

//设置对话框位置和尺寸
  g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
  g_HUD.SetSize( 170, 170 );
  g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170, 
pBackBufferSurfaceDesc->Height-350 );
  g_SampleUI.SetSize( 170, 300 );
g_move.SetLocation( pBackBufferSurfaceDesc->Width-170, 
pBackBufferSurfaceDesc->Height-700 );
g_SampleUI.SetSize( 170, 430 );

//恢复字体
  if( g_pFont )
  V_RETURN( g_pFont->OnResetDevice() );
   
//创建ID3DXSprite接口对象
  V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );



//设置投影矩阵

float fAspectRatio = (float)pBackBufferSurfaceDesc->Width / pBackBufferSurfaceDesc->Height;//定义fAspectRatio 
  
   

//设置纹理渲染状态
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );

//关闭光照
pd3dDevice->SetRenderState( D3DRS_LIGHTING, false );


g_Camera.SetProjParams( D3DX_PI / 4, fAspectRatio, 1.0f, 1000000.0f );//观察距离

  return S_OK;
}


//-----------------------------------------------------------------------------
// Desc: 更新场景(框架移动)
//-----------------------------------------------------------------------------
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, 
float fElapsedTime, void* pUserContext )
{  
g_Camera.FrameMove(fElapsedTime);//必须写的自由摄象机命令 更新
   
//世界变换
D3DXMATRIXA16 matWorld;//世界变换矩阵
D3DXMATRIXA16 matTranlate;
UINT iTime = timeGetTime() % 10000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 10000.0f;
D3DXMatrixRotationY( &matWorld, fAngle );//填充matWorld为一个旋转矩阵,fAngle是旋转角度
D3DXMatrixTranslation(&matTranlate,i+0.0f,0.0f,0.0f);//沿X平移30个单位1
D3DXMatrixMultiply(&matWorld,&matWorld,&matTranlate);//组合得到世界变幻矩阵
pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );//将matWorld设置为世界转换矩阵

}


//-----------------------------------------------------------------------------
// Desc: 渲染场景(框架渲染)
//-----------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, 
float fElapsedTime, void* pUserContext )
{
  HRESULT hr;
  
//如果正在利用Direct3D设备设置对话框进行设置, 则不渲染场景
  if( g_SettingsDlg.IsActive() )
  {
  g_SettingsDlg.OnRender( fElapsedTime );
  return;
  }

  //清除后台颜色缓冲区和深度缓冲区
  V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 
D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
  pd3dDevice->SetTransform( D3DTS_VIEW, g_Camera.GetViewMatrix() );// 摄象机取→观察
pd3dDevice->SetTransform( D3DTS_PROJECTION, g_Camera.GetProjMatrix());//摄象机 投影
  //开始渲染场景
  if( SUCCEEDED( pd3dDevice->BeginScene() ) )
  {

//渲染网格模型
g_pMesh.Render( pd3dDevice );


D3DXMATRIXA16 matWorld1;//世界变换矩阵
//D3DXMATRIXA16 matTranlate;
UINT iTime = timeGetTime() % 10000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 10000.0f;
D3DXMatrixRotationZ( &matWorld1, fAngle );//填充matWorl
pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld1 );



g_pMesh1.Render( pd3dDevice );

//渲染文本和对话框
  DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); 
  RenderText();
  V( g_HUD.OnRender( fElapsedTime ) );
  V( g_SampleUI.OnRender( fElapsedTime ) );
V( g_move.OnRender( fElapsedTime ) );
  DXUT_EndPerfEvent();

//结束渲染场景
  V( pd3dDevice->EndScene() );
  }
}

作者: lengyuefengyun   发布时间: 2011-07-11

拿张纸 把你想要的结果画出来,然后检查模型视图矩阵是否正确。

作者: dizuo   发布时间: 2011-07-11

热门下载

更多