📄 colmesh.cpp
字号:
#include "colmesh.h"
struct Vertex
{
float x,y,z;
//float nx,ny,nz;
//float tu,tv;
};
HRESULT CCollidableMesh::Create( LPDIRECT3DDEVICE8 pd3dDevice, TCHAR* strFilename )
{
HRESULT rc=CD3DMesh::Create(pd3dDevice,strFilename);
if (SUCCEEDED(rc))
{
m_ColModel=newCollisionModel3D();
LPD3DXMESH clone;
if (SUCCEEDED(m_pSysMemMesh->CloneMeshFVF(D3DXMESH_SYSTEMMEM,D3DFVF_XYZ,pd3dDevice,&clone)))
{
int vnum=clone->GetNumVertices();
int fnum=clone->GetNumFaces();
Vertex* v;
if (SUCCEEDED(clone->LockVertexBuffer(D3DLOCK_READONLY,(BYTE**)&v)))
{
WORD* ind;
if (SUCCEEDED(clone->LockIndexBuffer(D3DLOCK_READONLY,(BYTE**)&ind)))
{
for(int i=0;i<fnum;i++)
{
m_ColModel->addTriangle((float*)&v[ind[i*3+0]],
(float*)&v[ind[i*3+1]],
(float*)&v[ind[i*3+2]]);
}
m_ColModel->finalize();
clone->UnlockIndexBuffer();
}
clone->UnlockVertexBuffer();
}
clone->Release();
}
}
return rc;
}
void CCollidableMesh::SetPosition(const Vector3D& v)
{
Vector3D& pos=*((Vector3D*)&m_Transform(3,0));
pos=v;
}
void CCollidableMesh::SetDirection(const Vector3D& v)
{
float speed=m_Speed.Magnitude();
m_Speed=speed*v;
}
HRESULT CCollidableMesh::Render(LPDIRECT3DDEVICE8 pd3dDevice,
BOOL bDrawOpaqueSubsets,
BOOL bDrawAlphaSubsets)
{
pd3dDevice->SetTransform( D3DTS_WORLD, (D3DMATRIX*)&m_Transform );
return CD3DMesh::Render(pd3dDevice,bDrawOpaqueSubsets,bDrawAlphaSubsets);
}
bool CCollidableMesh::Collision(CCollidableMesh& other)
{
return m_ColModel->collision(other.m_ColModel);
}
HRESULT CCollidableMesh::Advance(float dt)
{
Matrix3D m=PitchMatrix3D(0);
m.rotate(dt*m_RotateSpeed);
m_Transform=m*m_Transform;
m_ColModel->setTransform((float*)&m_Transform);
Vector3D& pos=*((Vector3D*)&m_Transform(3,0));
pos+=dt*m_Speed;
return D3D_OK;
}
void CCollidableMesh::React(CCollidableMesh& other)
{
Vector3D t1[3],t2[3];
Vector3D p;
m_ColModel->getCollisionPoint((float*)&p,false);
Vector3D dir1=Vector3D(m_Transform(3,0),m_Transform(3,1),m_Transform(3,2)) - p;
Vector3D dir2=Vector3D(other.m_Transform(3,0),
other.m_Transform(3,1),
other.m_Transform(3,2)) - p;
dir1 /= dir1.Magnitude();
dir2 /= dir2.Magnitude();
float momentum1 = m_Speed.Magnitude() * m_Mass;
float momentum2 = other.m_Speed.Magnitude() * other.m_Mass;
SetSpeed((momentum2/m_Mass)*dir1);
other.SetSpeed((momentum1/other.m_Mass)*dir2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -