📄 game_game.cpp
字号:
#include "Game_User.h"
#include "Game_Npc.h"
#include "2DUIManger.h"
#include "3DUIManger.h"
#include "SmallMap.h"
#include "D3DSprite.h"
static int i=0;
CGame::CGame()
{
m_pD3D = NULL;
m_pd3dDevice = NULL;
m_pTerrain = NULL;
m_pSkyBox = NULL;
m_pCamera = NULL;
m_pInput = NULL;
m_pFont = NULL;
m_pRole = NULL;
m_pEnemy = NULL;
m_pEnemy1 = NULL;
m_pEnemy2 = NULL;
m_pEnemy3 = NULL;
m_pTempler = NULL;
m_pGlyph = NULL;
m_pTree1 = NULL;
m_pTree2 = NULL;
m_pTree3 = NULL;
m_pGrass = NULL;
m_pFire = NULL;
m_pCrystal = NULL;
m_pMagicPoPo = NULL;
m_pMagicZhen = NULL;
m_pBone = NULL;
m_pButterflyMesh1 = NULL;
m_pParticle = NULL;
m_pCursor = NULL;
m_pPanelRole = NULL;
m_pPanelEnemy = NULL;
m_pRoleHP = NULL;
m_pRoleMP = NULL;
m_pEnemyHP = NULL;
m_pEnemyMP = NULL;
m_pGameLoadBG = NULL;
m_pNpcBag = NULL;
m_p2DUI = NULL;
//m_p3DUI = NULL;
m_pNpc = NULL;
m_pSmallMap = NULL;
m_pMiNiMapBar = NULL;;
m_pJiNenglan = NULL;
m_pBackBuffer = NULL;
m_pShadowVolume = NULL;
m_IsWalk = false;
m_IsRun = false;
m_IsAABB = false;
m_isMouseDown = false;
m_bRenderVolume = false;
m_iGameState = true;
m_RoleHeight.x = -1000.0f;
m_RoleHeight.y = 1.0f;
m_RoleHeight.z = 950.0f;
m_CamToTer = 0.0f;
m_i = 0;
m_nScreenWidth = 800;
m_nScreenHeight = 600;
m_MagicAttack = false;
m_bBag = false;
m_MagicPos =D3DXVECTOR3(-1000.0f,25.0f,1110.0f);
}
CGame::~CGame()
{
for ( m_v1iter = m_v1.begin( ); m_v1iter != m_v1.end( ); m_v1iter++ )
{
delete (*m_v1iter);
}
for(int i = 0; i < m_pNpcNum; i++)
{
SAFE_DELETE(m_presNpc[i]);
}
m_presNpc.clear();
SAFE_DELETE(m_pParticle);
SAFE_DELETE(m_pMagicPoPo);
SAFE_DELETE(m_pMagicZhen);
SAFE_DELETE(m_pButterflyMesh1);
SAFE_DELETE(m_pSmallMap);
SAFE_DELETE(m_pMiNiMapBar);
SAFE_DELETE(m_pEnemyMP);
SAFE_DELETE(m_pJiNenglan);
SAFE_DELETE(m_pEnemyHP);
SAFE_DELETE(m_pRoleMP);
SAFE_DELETE(m_pRoleHP);
SAFE_DELETE(m_pGameLoadBG);
SAFE_DELETE(m_pNpcBag);
SAFE_DELETE(m_p2DUI);
//SAFE_DELETE(m_p3DUI);
SAFE_DELETE(m_pPanelEnemy);
SAFE_DELETE(m_pPanelRole);
SAFE_DELETE(m_pNpc);
SAFE_DELETE(m_pGlyph);
SAFE_DELETE(m_pCursor);
SAFE_DELETE(m_pTempler);
SAFE_DELETE(m_pTree1);
SAFE_DELETE(m_pTree2);
SAFE_DELETE(m_pTree3);
SAFE_DELETE(m_pGrass);
SAFE_DELETE(m_pFire);
SAFE_DELETE(m_pCrystal);
SAFE_DELETE(m_pMP3);
SAFE_DELETE(m_pRole);
SAFE_DELETE(m_pFont)
SAFE_DELETE(m_pInput)
SAFE_DELETE(m_pSkyBox);
SAFE_DELETE(m_pCamera);
SAFE_DELETE(m_pTerrain);
SAFE_DELETE(m_pShadowVolume);
SAFE_RELEASE(m_pd3dDevice);
SAFE_RELEASE(m_pD3D);
}
void CGame::RenderAABB(LPDIRECT3DDEVICE9 pDevice,D3DXVECTOR3 *pVmin,D3DXVECTOR3 *pVmax)
{
/*
0-----max
/ /|
/ / |
3-----2 5
| | /
| |/
min----6
*/
VERTEX_BOUNDINGBOX VB[]
={
{pVmin->x,pVmax->y,pVmax->z,0xffff0000}, //0 上表面
{pVmax->x,pVmax->y,pVmax->z,0xffff0000}, //1 max
{pVmax->x,pVmax->y,pVmin->z,0xffff0000}, //2
{pVmin->x,pVmax->y,pVmin->z,0xffff0000}, //3
{pVmin->x,pVmin->y,pVmax->z,0xffff0000}, //4 下边四条线
{pVmax->x,pVmin->y,pVmax->z,0xffff0000}, //5
{pVmax->x,pVmin->y,pVmin->z,0xffff0000}, //6
{pVmin->x,pVmin->y,pVmin->z,0xffff0000}, //7 min
};
WORD IB[]=
{0,1,1,2,2,3,3,0,
4,5,5,6,6,7,7,4,
0,4,1,5,2,6,3,7};
D3DXMATRIX matIdentity;
D3DXMatrixIdentity(&matIdentity);
m_pd3dDevice->SetTransform(D3DTS_WORLD, &matIdentity);
m_pd3dDevice->SetTexture(0, NULL);
m_pd3dDevice->SetFVF(D3DFVF_CUSTOM_BOUNDINGBOX);
m_pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST,0,24,12,IB,D3DFMT_INDEX16,
VB,sizeof(VERTEX_BOUNDINGBOX));
}
bool CGame::Init(HWND hWnd, HINSTANCE hInst, UINT nHeight, UINT nWidth)
{
if(InitD3D(hWnd, nHeight, nWidth))
{
if(InitGame(hWnd, hInst))
{
//SetMaterial();
return SetLight();
}
else
{
return false;
}
}
else
{
return false;
}
return true;
}
bool CGame::InitD3D(HWND hWnd, UINT nHeight, UINT nWidth)
{
if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return false;
D3DDISPLAYMODE d3ddm;
if( FAILED( m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.Windowed = TRUE;
d3dpp.hDeviceWindow = hWnd;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.EnableAutoDepthStencil = TRUE;
m_nScreenHeight = d3ddm.Height;
m_nScreenWidth = d3ddm.Width;
D3DCAPS9 caps;
m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pd3dDevice ) ) )
{
return false;
}
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_pd3dDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
m_pd3dDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_BLENDTEXTUREALPHA);
m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
//摄像机
m_pCamera = new CCamera( m_pd3dDevice, &D3DXVECTOR3(0,200,100) );
m_pCamera->Update2DMatrix();
m_pCamera->SetYawPitch(D3DX_PI , -D3DX_PI / 6);
//LOGO画面
m_pGameLoadBG = new CPanel(m_pd3dDevice, 800.0f, 600.0f, m_nScreenWidth, m_nScreenHeight,-1);
m_pGameLoadBG->SetTexture( ".\\UIimage\\MainMenuBG.jpg", D3DCOLOR_XRGB(0, 0, 0) );
m_p2DUI = new C2DUIManger(m_pd3dDevice);
return true;
}
bool CGame::SetLight()
{
D3DLIGHT9 d3dLight;
ZeroMemory(&d3dLight, sizeof(D3DLIGHT9));
d3dLight.Type = D3DLIGHT_POINT;
d3dLight.Diffuse.r = 1.0f;
d3dLight.Diffuse.g = 1.0f;
d3dLight.Diffuse.b = 1.0f;
d3dLight.Ambient.r = 1.0f;
d3dLight.Ambient.g = 1.0f;
d3dLight.Ambient.b = 1.0f;
d3dLight.Specular.r = 0.0f;
d3dLight.Specular.g = 0.0f;
d3dLight.Specular.b = 0.0f;
d3dLight.Position.x = -200.0f;
d3dLight.Position.y = 200.0f;
d3dLight.Position.z = -500.0f;
d3dLight.Attenuation0 = 0.9f;
d3dLight.Attenuation1 = 0.0f;
d3dLight.Attenuation2 = 0.0f;
d3dLight.Range = 100.0f;
m_pd3dDevice->SetLight(0, &d3dLight);
m_pd3dDevice->LightEnable(0, TRUE);
//根据光源位置更新阴影体
m_pShadowVolume->UpdateShadowVolume( d3dLight.Position );
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
m_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(255, 255, 255));
return true;
}
void CGame::SetMaterial()
{
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
m_pd3dDevice->SetMaterial( &mtrl );
}
//Loading 界面渲染
LRESULT CGame::RenderLoad(float fState)
{
m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
//m_pCamera->Update2DMatrix();
//登陆界面
m_pGameLoadBG->setSize(1000,780);
m_pGameLoadBG->MoveTo(0,0);
m_pGameLoadBG->Render();
m_p2DUI->InitUI();
m_p2DUI->UpdataLoading(fState);
m_pd3dDevice->EndScene();
}
m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
return S_OK;
}
bool CGame::InitGame(HWND hWnd, HINSTANCE hInst)
{
m_hWnd = hWnd;
this->RenderLoad(0.1f);
//地图
m_pTerrain = new CTerrain( m_pd3dDevice, D3DXVECTOR3(0,0,0) );
m_pTerrain->Initialize( ".\\Terrain\\Terrain_128_RGB1.bmp", ".\\Terrain\\skin2.jpg", 100, 2000, 100 );
//天空盒
m_pSkyBox = new CSkyBox( m_pd3dDevice, 15 );
m_pSkyBox->LoadSkyBox( ".\\Sky\\World.cfg", "Antarctic" );
//输入设备
m_pInput = new CGInput( hInst, hWnd );
//摄像机
//m_pCamera = new CCamera( m_pd3dDevice, &D3DXVECTOR3(0,0,0) );
m_CamToHero = m_pCamera->GetDistance();
this->RenderLoad(0.3f);
//蝴蝶
m_pButterflyMesh1 = new Mesh(m_pd3dDevice);
m_pButterflyMesh1->InitMesh(m_pd3dDevice);
m_pButterflyMesh1->SetPos(-1000.0f,25.0f,1110.0f);
//粒子
m_pParticle=new CParticleSystem(m_pd3dDevice,NULL) ;
m_pParticle->LoadFromFile(".\\Game\\Particle.cfg","Fire");
m_pParticle->SetPosition(&D3DXVECTOR3(-2215,41,960));
//鼠标
m_pCursor = new CCursor( m_pd3dDevice );
m_pCamera->SetCursor( m_pCursor );
this->RenderLoad(0.4f);
//角色
m_pRole = new CSkinMesh( m_pd3dDevice );
m_pRole->LoadFromXFile( ".\\Role\\enemy2.X", 0.5f, 0.5f );
m_pRole->SetAnimationName( "ready" );
m_pRole->SetPosition( -1000.0f, 1.0f, 950.0f );
m_pRole->m_vTarget = m_pRole->m_vPos;
m_pRole->m_speed1 = 150.0f; //移动速度
m_pRole->m_speed2 = 150.0f; //旋转速度
m_pRole->m_MAXHP = 600.0f;
m_pRole->m_CURHP = 600.0f;
m_pRole->m_MAXMP = 100.0f;
m_pRole->m_CURMP = 100.0f;
m_pRole->n=1.0f;
//魔法阵
m_pMagicZhen = new CSkinMesh( m_pd3dDevice );
m_pMagicZhen->LoadFromXFile( ".\\magic.x", 0.5f, 0.5f );
// m_pMagicZhen->SetPosition( -1000.0f, 1.0f, 950.0f );
m_pMagicZhen->m_pXangle=-D3DX_PI/2;
//怪物NPC
const int nn = 4;
m_pNpcNum = nn;
//m_nLiveNum+=m_iNPCNum;
m_presNpc.reserve(m_pNpcNum);
for(i = 0; i < m_pNpcNum; i++)
{
m_presNpc[i] = new CNPC(m_pd3dDevice);
}
m_presNpc[0]->LoadFromXFile( ".//pig.x", 0.5f,0.5f );
m_presNpc[1]->LoadFromXFile( ".//bear.x", 0.5f,0.5f );
m_presNpc[2]->LoadFromXFile( ".//bloodelf.x", 0.5f,0.5f );
m_presNpc[3]->LoadFromXFile( ".//golem.x", 0.5f,0.5f );
struct Npc_Attribute npc_attribute[nn] =
{
// posx posy posz speed1 speed2 maxhp curhp maxmp curmp scale n
{D3DXVECTOR3(-1500.0f, 0.0f, -405.0f), 60.0f, 30.0f, 200.0f, 200.0f, 50.0f, 50.0f, 0.8f, 1.5f},
{D3DXVECTOR3(-1500.0f, 0.0f, -100.0f), 80.0f, 30.0f, 200.0f, 200.0f, 100.0f, 100.0f, 0.4f, 1.5f},
{D3DXVECTOR3(-1835.0f, 8.0f, -1170.0f), 100.0f, 30.0f, 200.0f, 200.0f, 150.0f, 150.0f, 0.4f, 1.5f},
{D3DXVECTOR3(-1500.0f, 0.0f, 200.0f), 110.0f, 30.0f, 200.0f, 200.0f, 200.0f, 200.0f, 0.4f, 1.5f}
};
m_pattNPC = new Npc_Attribute[nn];
for(i = 0; i < m_pNpcNum; i++)
{
m_presNpc[i]->m_vPos=m_pattNPC[i].m_vPos = m_presNpc[i]->m_vbornPos=npc_attribute[i].m_vPos;
m_presNpc[i]->m_speed1=m_pattNPC[i].m_speed1 = npc_attribute[i].m_speed1;
m_presNpc[i]->m_speed2=m_pattNPC[i].m_speed2 = npc_attribute[i].m_speed2;
m_presNpc[i]->m_MAXHP=m_pattNPC[i].m_MAXHP = npc_attribute[i].m_MAXHP;
m_presNpc[i]->m_CURHP=m_pattNPC[i].m_CURHP = npc_attribute[i].m_CURHP;
m_presNpc[i]->m_MAXMP=m_pattNPC[i].m_MAXMP = npc_attribute[i].m_MAXMP;
m_presNpc[i]->m_CURMP=m_pattNPC[i].m_CURMP = npc_attribute[i].m_CURMP;
m_presNpc[i]->m_fScale=m_pattNPC[i].m_fScale = npc_attribute[i].m_fScale;
m_presNpc[i]->n=m_pattNPC[i].n = npc_attribute[i].n;
m_presNpc[i]->SetPosition(&m_presNpc[i]->m_vPos);
m_presNpc[i]->SetAnimationName("stand");
}
//商店NPC
m_pNpc = new CSkinMesh( m_pd3dDevice );
m_pNpc->LoadFromXFile( ".\\NPC\\npc.x", 0.5f,0.5f );
m_pNpc->m_fScale=0.05f;
m_pNpc->SetAnimationName( "idle" );
m_pNpc->SetPosition( -2180.0f,5.0f, 940.0f );
this->RenderLoad(0.6f);
//建筑物
m_pTempler = new CMesh( m_pd3dDevice, ".\\Construct\\templer.X" );
//树
m_pTree1 = new CMesh( m_pd3dDevice, ".\\bigtree.X" );
m_pTree2 = new CMesh( m_pd3dDevice, ".\\bigtree.X" );
m_pTree3 = new CMesh( m_pd3dDevice, ".\\Construct\\tree_2.X" );
//草
m_pGrass = new CMesh( m_pd3dDevice, ".\\cao.X" );
//火堆
m_pFire = new CMesh( m_pd3dDevice, ".\\Construct\\fire.x");
//水晶
m_pCrystal = new CMesh(m_pd3dDevice, ".\\Construct\\Crystal.X");
//死骨
m_pBone = new CMesh(m_pd3dDevice, ".\\Construct\\dead_cow.X");
//雕像
m_pGlyph = new CMesh( m_pd3dDevice, ".\\Construct\\lotharstatue.x" );
//创建阴影体
m_pShadowVolume = new CShadowVolume();
m_pShadowVolume->Create(m_pd3dDevice, m_pGlyph->GetMesh());
//魔法技能
m_pMagicPoPo = new CParticleSystem(m_pd3dDevice, ".\\Game\\Flare.tga");
this->RenderLoad(0.7f);
//字体
m_pFont = new CFont( m_pd3dDevice, "新宋体" );
//游戏中2D UI
m_pPanelRole = new CPanel( m_pd3dDevice, 210.0f, 80.0f,m_nScreenWidth, m_nScreenHeight);
m_pPanelRole->SetTexture( ".\\UIimage\\HPMP1.tga", D3DCOLOR_XRGB(0, 0, 0) );
m_pPanelEnemy = new CPanel( m_pd3dDevice, 210.0f, 80.0f,m_nScreenWidth, m_nScreenHeight );
m_pPanelEnemy->SetTexture( ".\\UIimage\\HPMP.tga", D3DCOLOR_XRGB(0, 0, 0) );
m_pRoleHP = new CPanel( m_pd3dDevice, 20.0f, 10.0f,m_nScreenWidth, m_nScreenHeight );
m_pRoleHP->SetTexture( ".\\UIimage\\UI_PLAYER_LIFE.bmp", D3DCOLOR_XRGB(0, 0, 0) );
m_pRoleMP = new CPanel( m_pd3dDevice, 15.0f, 10.0f ,m_nScreenWidth, m_nScreenHeight);
m_pRoleMP->SetTexture( ".\\UIimage\\UI_PLAYER_MAGIC.bmp", D3DCOLOR_XRGB(0, 0, 0) );
m_pEnemyHP = new CPanel( m_pd3dDevice, 20.0f, 10.0f ,m_nScreenWidth, m_nScreenHeight);
m_pEnemyHP->SetTexture( ".\\UIimage\\UI_PLAYER_LIFE.bmp", D3DCOLOR_XRGB(0, 0, 0) );
m_pEnemyMP = new CPanel( m_pd3dDevice, 15.0f, 10.0f ,m_nScreenWidth, m_nScreenHeight);
m_pEnemyMP->SetTexture( ".\\UIimage\\UI_PLAYER_MAGIC.bmp", D3DCOLOR_XRGB(0, 0, 0) );
this->RenderLoad(0.8f);
m_pMiNiMapBar = new CPanel( m_pd3dDevice, 265.0f, 265.0f,m_nScreenWidth, m_nScreenHeight,-1);
m_pMiNiMapBar->SetTexture( ".\\UIimage\\minimapFrame.tga", D3DCOLOR_XRGB(0, 0, 0) );
m_pJiNenglan = new CPanel( m_pd3dDevice,800.0f, 60.0f,m_nScreenWidth, m_nScreenHeight,-1);
m_pJiNenglan->SetTexture( ".\\UIimage\\UI_PANEL_JNL.png", D3DCOLOR_XRGB(0, 0, 0) );
m_pNpcBag = new CPanel( m_pd3dDevice,180.0f, 232.0f,m_nScreenWidth, m_nScreenHeight,-1);
m_pNpcBag->SetTexture( ".\\UIimage\\Bag2.png", D3DCOLOR_XRGB(255, 255, 255) );
m_pSmallMap =new CSmallMap(m_pd3dDevice);
m_pSmallMap->Inint();
//游戏3DUI
//m_p3DUI=new C3DUIManger(m_pd3dDevice,m_hWnd,m_pRole);
//m_p3DUI->Init();
this->RenderLoad(0.9f);
InitRect(m_pd3dDevice);
this->RenderLoad(1.0f);
return true;
}
void CGame::InitRect(LPDIRECT3DDEVICE9 m_pd3dDevice)
{
//填充矩形顶点缓冲区
m_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &m_pBackBuffer );
m_pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
float sx = (float)m_d3dsdBackBuffer.Width;
float sy = (float)m_d3dsdBackBuffer.Height;
SHADOWVERTEX v[]=
{
{0, sy, 0.0f,1.0f,0xd0000000},
{0, 0, 0.0f,1.0f,0xd0000000},
{sx, sy,0.0f,1.0f,0xd0000000},
{sx, 0,0.0f,1.0f,0xd0000000},
};
//创建矩形顶点缓冲区
m_pd3dDevice->CreateVertexBuffer( 4*sizeof(SHADOWVERTEX),
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOM_SHADOWVERTEX,
D3DPOOL_MANAGED, &m_pBigSquareVB, NULL );
VOID* pVertices;
m_pBigSquareVB->Lock( 0, sizeof(v), (void**)&pVertices, 0 ) ;
memcpy( pVertices, v, sizeof(v) );
m_pBigSquareVB->Unlock();
}
bool CGame::IntersectTriangle( const D3DXVECTOR3& orig,const D3DXVECTOR3& dir, const D3DXVECTOR3& v0,
const D3DXVECTOR3& v1, const D3DXVECTOR3& v2,FLOAT* t, FLOAT* u, FLOAT* v )
{
D3DXVECTOR3 edge1 = v1 - v0;
D3DXVECTOR3 edge2 = v2 - v0;
// Begin calculating determinant - also used to calculate U parameter
//交点p=edge1*u+edge2*v;
D3DXVECTOR3 pvec;
D3DXVec3Cross( &pvec, &dir, &edge2 ); //|a×b|=|a||b|sinθ
// 如果det接近0,表明射线平行于三角形
FLOAT det = D3DXVec3Dot( &edge1, &pvec ); //|a dot b|=|a||b|cosθ
D3DXVECTOR3 tvec;
if( det > 0 )
{
tvec = orig - v0;
}
else
{
//方向相反
tvec = v0 - orig;
det = -det;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -