|
|
发表于 2008-3-31 15:59:00
|
显示全部楼层
Re:OGRE如何画多边形?
void createGrassMesh()
{
// Each grass section is 3 planes at 60 degrees to each other
// Normals point straight up to simulate correct lighting
MeshPtr msh = MeshManager::getSingleton().createManual(GRASS_MESH_NAME,
ResourceGroupManager: EFAULT_RESOURCE_GROUP_NAME);
SubMesh* sm = msh->createSubMesh();
sm->useSharedVertices = false;
sm->vertexData = new VertexData();
sm->vertexData->vertexStart = 0;
sm->vertexData->vertexCount = 12;
VertexDeclaration* dcl = sm->vertexData->vertexDeclaration;
size_t offset = 0;
dcl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
offset += VertexElement::getTypeSize(VET_FLOAT3);
dcl->addElement(0, offset, VET_FLOAT3, VES_NORMAL);
offset += VertexElement::getTypeSize(VET_FLOAT3);
dcl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES);
offset += VertexElement::getTypeSize(VET_FLOAT2);
HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton()
.createVertexBuffer(
offset, 12, HardwareBuffer::HBU_STATIC_WRITE_ONLY);
float* pReal = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
Vector3 baseVec(GRASS_WIDTH/2, 0, 0);
Vector3 vec = baseVec;
Quaternion rot;
rot.FromAngleAxis(Degree(60), Vector3::UNIT_Y);
int i;
for (i = 0; i < 3; ++i)
{
// position
*pReal++ = -vec.x;
*pReal++ = GRASS_HEIGHT;
*pReal++ = -vec.z;
// normal
*pReal++ = 0;
*pReal++ = 1;
*pReal++ = 0;
// uv
*pReal++ = 0;
*pReal++ = 0;
// position
*pReal++ = vec.x;
*pReal++ = GRASS_HEIGHT;
*pReal++ = vec.z;
// normal
*pReal++ = 0;
*pReal++ = 1;
*pReal++ = 0;
// uv
*pReal++ = 1;
*pReal++ = 0;
// position
*pReal++ = -vec.x;
*pReal++ = 0;
*pReal++ = -vec.z;
// normal
*pReal++ = 0;
*pReal++ = 1;
*pReal++ = 0;
// uv
*pReal++ = 0;
*pReal++ = 1;
// position
*pReal++ = vec.x;
*pReal++ = 0;
*pReal++ = vec.z;
// normal
*pReal++ = 0;
*pReal++ = 1;
*pReal++ = 0;
// uv
*pReal++ = 1;
*pReal++ = 1;
vec = rot * vec;
}
vbuf->unlock();
sm->vertexData->vertexBufferBinding->setBinding(0, vbuf);
sm->indexData->indexCount = 6*3;
sm->indexData->indexBuffer = HardwareBufferManager::getSingleton()
.createIndexBuffer(HardwareIndexBuffer::IT_16BIT, 6*3,
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
uint16* pI = static_cast<uint16*>(
sm->indexData->indexBuffer->lock(HardwareBuffer::HBL_DISCARD));
for (i = 0; i < 3; ++i)
{
int off = i*4;
*pI++ = 0 + off;
*pI++ = 3 + off;
*pI++ = 1 + off;
*pI++ = 0 + off;
*pI++ = 2 + off;
*pI++ = 3 + off;
}
sm->indexData->indexBuffer->unlock();
sm->setMaterialName(GRASS_MATERIAL);
msh->load();
}
ogre demo中很多这样的例子啊,这是草墩里的 |
|