|
|
发表于 2009-6-9 12:00:00
|
显示全部楼层
Re:高手进来看一下我的BillBoard算法哪里有错?
我2年前写了个东西,现在已经2年没做3D的东西了,看不懂什么意思了,你要是觉得还凑合就看看。当时是实现了角色上面的名字。
#pragma once
#include "d3d9.h"
#include "d3dx9.h"
#define ReleaseInterface(object) if(object!=NULL) {object->Release();object = NULL;}
#define INDEXCUBE_FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
class yun
{
public:
yun(LPDIRECT3DDEVICE9 pDevice,float width,float heigth);
~yun(void);
void DrawIndexCube(); //绘制立方体
void SetMatrix(float Tx,float Ty,float Tz,float Rx,float Ry,float Rz,float Sl);//设置世界变化
private:
//定义定点信息的结构体
struct INDEXCUBEVERTEX
{
float x, y, z; //顶点坐标
DWORD colour; //顶点颜色
float tu1, tv1; //纹理1的uv值
};
LPDIRECT3DDEVICE9 m_pDevice;
LPDIRECT3DTEXTURE9 m_pTexture;
LPD3DXMESH m_pMesh;
float m_pWidth;
float m_pHeigth;
void yunrun();
void initIndexCube(); //初始化mesh的顶点缓冲,索引缓冲和属性缓冲
void initInterface(); //初始化接口
};
#include ".\yun.h"
yun::yun(LPDIRECT3DDEVICE9 pDevice,float width,float heigth)
{
m_pDevice = pDevice;
m_pTexture=NULL;
m_pMesh = NULL;
m_pWidth = width;
m_pHeigth = heigth;
initInterface();
initIndexCube();
}
yun::~yun(void)
{
ReleaseInterface(m_pMesh);
ReleaseInterface(m_pTexture);
}
void yun::initInterface()
{
HRESULT hr = 0;
//创建一个空的MESH
hr = D3DXCreateMeshFVF(12,24,D3DXMESH_MANAGED,INDEXCUBE_FVF,m_pDevice,&m_pMesh);
for(int i = 0;i<3;i++)
D3DXCreateTextureFromFile(m_pDevice,"我是车.png",&m_pTexture);
}
void yun::initIndexCube()
{
INDEXCUBEVERTEX * vertexbuffer = 0;
m_pMesh->LockVertexBuffer(0,(void**)&vertexbuffer);
vertexbuffer[0].x = -m_pWidth/2; //0
vertexbuffer[0].y = 0.0f;
vertexbuffer[0].z = 0;
vertexbuffer[0].tu1 = 0.0f;
vertexbuffer[0].tv1 = 1.0f;
vertexbuffer[0].colour = 0x00ffffff;
vertexbuffer[1].x = -m_pWidth/2; //1
vertexbuffer[1].y = 0.0f;
vertexbuffer[1].z = m_pHeigth;
vertexbuffer[1].tu1 = 0.0f;
vertexbuffer[1].tv1 = 0.0f;
vertexbuffer[1].colour = 0x00ffffff;
vertexbuffer[2].x = m_pWidth/2; //2
vertexbuffer[2].y = 0.0f;
vertexbuffer[2].z = 0;
vertexbuffer[2].tu1 = 1.0f;
vertexbuffer[2].tv1 = 1.0f;
vertexbuffer[2].colour = 0x00ffffff;
vertexbuffer[3].x = m_pWidth/2; //3
vertexbuffer[3].y = 0.0f;
vertexbuffer[3].z = m_pHeigth;
vertexbuffer[3].tu1 = 1.0f;
vertexbuffer[3].tv1 = 0.0f;
vertexbuffer[3].colour = 0x00ffffff;
m_pMesh->UnlockVertexBuffer();
WORD * indexbuffer = 0;
m_pMesh->LockIndexBuffer(0,(void**)&indexbuffer);
indexbuffer[0] = 0;
indexbuffer[1] = 2;
indexbuffer[2] = 1;
indexbuffer[3] = 2;
indexbuffer[4] = 3;
indexbuffer[5] = 1;
m_pMesh->UnlockIndexBuffer();
DWORD *attributebuffer;
m_pMesh->LockAttributeBuffer(0,&attributebuffer);
attributebuffer[0] = 0;
attributebuffer[1] = 0;
m_pMesh->UnlockAttributeBuffer();
}
void yun: rawIndexCube()
{
//yunrun();
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
m_pDevice->SetTexture(0,m_pTexture);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
m_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
m_pDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
m_pMesh->DrawSubset(0);
D3DXMATRIX world;
D3DXMatrixIdentity(&world);
m_pDevice->SetTransform(D3DTS_WORLD,&world);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
}
void yun::yunrun()
{
INDEXCUBEVERTEX * vertexbuffer = 0;
m_pMesh->LockVertexBuffer(0,(void**)&vertexbuffer);
for (int i=0;i<4;++i)
{
vertexbuffer.tu1+=0.001f;
}
m_pMesh->UnlockVertexBuffer();
}
void yun::SetMatrix(float Tx,float Ty,float Tz,float Rx,float Ry,float Rz,float Sl)
{
D3DXMATRIX mat,matRx,matRy,matRz,matT,matS;
m_pDevice->SetTransform(D3DTS_WORLD,&mat);
D3DXMatrixIdentity(&mat);
D3DXMatrixRotationY(&matRy,Ry);
D3DXMatrixRotationX(&matRx,Rx);
D3DXMatrixMultiply(&matRy,&matRx,&matRy);
D3DXMatrixRotationZ(&matRz,Rz);
D3DXMatrixMultiply(&matRz,&matRz,&matRy);
D3DXMatrixScaling(&matS,Sl,Sl,Sl);
D3DXMatrixMultiply(&matRz,&matS,&matRz);
D3DXMatrixTranslation(&matT,Tx,Ty,Tz);
D3DXMatrixMultiply(&matRz,&matRz,&matT);
m_pDevice->SetTransform(D3DTS_WORLD,&matRz);
}
//这个是调用的地方
yun *yun0=NULL;
yun0=new yun(g_pD3DDevice,513,267);
yun0->SetMatrix(che0->che_shuzu[0][72],che0->che_shuzu[0][73],che0->che_shuzu[0][74],che0->che_shuzu[0][37]-D3DX_PI/2,-che0->she_jiaodu_ping[0],che0->che_shuzu[0][39],0.02f);
yun0->DrawIndexCube();
|
|