您的位置:首页 > 其它

[5] 柱台(Cylinder)图形的生成算法

2013-11-09 08:19 169 查看




顶点数据的生成

bool                        YfBuildCylinderVertices
(
Yreal                   topRadius,
Yreal                   bottomRadius,
Yreal                   height,
Yuint                   slices,
YeOriginPose            originPose,
Yuint                   vertexStriding,
Yuint                   vertexPos,
void*                   pVerticesBuffer
)
{
if (slices < 2 || !pVerticesBuffer)
{
return false;
}

Yuint numVertices  = slices * 2 + 2;

// 顶点赋值
char* vertexPtr   = (char*)pVerticesBuffer + vertexPos;
YsVector3* curVertexPtr   = NULL;
Yuint nOffset = 0;

Yreal originOffsetY = 0.0f;
if (originPose == YE_ORIGIN_POSE_TOP)
{
originOffsetY = -height;
}
else if (originPose == YE_ORIGIN_POSE_CENTER)
{
originOffsetY = -height * 0.5f;
}

// 柱顶顶点赋值
{
nOffset = 0;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = 0.0f;
curVertexPtr->y = height + originOffsetY;
curVertexPtr->z = 0.0f;
}

// 柱底顶点赋值
{
nOffset = (numVertices - 1) * vertexStriding;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = 0.0f;
curVertexPtr->y = originOffsetY;
curVertexPtr->z = 0.0f;
}

Yreal angleXZ;
Yreal posX, posZ;
for (Yuint i = 0; i < slices; i++)
{
angleXZ = YD_REAL_TWAIN_PI * i / slices;
posX = yf_sin(angleXZ);
posZ = yf_cos(angleXZ);

// 上顶点
{
nOffset = (i + 1) * vertexStriding;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = topRadius * posX;
curVertexPtr->y = height + originOffsetY;
curVertexPtr->z = topRadius * posZ;
}

// 下顶点
{
nOffset = (i + 1 + slices) * vertexStriding;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = bottomRadius * posX;
curVertexPtr->y = originOffsetY;
curVertexPtr->z = bottomRadius * posZ;
}
}

return true;
}


三角形索引数据的生成

bool                        YfBuildCylinderTriIndices
(
Yuint                   slices,
YeIndexType             indexType,
Yuint                   indexStriding,
Yuint                   indexPos,
void*                   pTriIndicesBuffer
)
{
if (slices < 2 || !pTriIndicesBuffer)
{
return false;
}

Yuint numVertices  = slices * 2 + 2;
Yuint numTriangles = slices * 4;
if (indexType == YE_INDEX_16_BIT &&
numVertices > YD_MAX_UNSIGNED_INT16)
{
return false;
}

// 索引赋值
char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
Yuint nOffset = 0;
if (indexType == YE_INDEX_16_BIT)
{
YsTriIndex16* triIndexPtr = NULL;
for (Yuint i= 0; i < slices; i++)
{
nOffset = (i * 4) * indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = 1 + i;
triIndexPtr->index2 = 1 + (i + 1)%slices;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = numVertices - 1;
triIndexPtr->index1 = 1 + slices + (i + 1)%slices;
triIndexPtr->index2 = 1 + slices + i;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + i;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + (i + 1)%slices;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + (i + 1)%slices;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + slices + (i + 1)%slices;
}
}
else
{
YsTriIndex32* triIndexPtr = NULL;
for (Yuint i= 0; i < slices; i++)
{
nOffset = (i * 4) * indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = 1 + i;
triIndexPtr->index2 = 1 + (i + 1)%slices;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = numVertices - 1;
triIndexPtr->index1 = 1 + slices + (i + 1)%slices;
triIndexPtr->index2 = 1 + slices + i;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + i;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + (i + 1)%slices;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + (i + 1)%slices;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + slices + (i + 1)%slices;
}
}

return true;
}


线框索引数据的生成

bool                        YfBuildCylinderWireIndices
(
Yuint                   slices,
YeIndexType             indexType,
Yuint                   indexStriding,
Yuint                   indexPos,
void*                   pWireIndicesBuffer
)
{
if (slices < 2 || !pWireIndicesBuffer)
{
return false;
}

Yuint numVertices = slices * 2  + 2;
Yuint numLines    = slices * 5;
if (indexType == YE_INDEX_16_BIT &&
numVertices > YD_MAX_UNSIGNED_INT16)
{
return false;
}

// 索引赋值
char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
Yuint nOffset = 0;
if (indexType == YE_INDEX_16_BIT)
{
YsLineIndex16* lineIndexPtr = NULL;
for (Yuint i= 0; i < slices; i++)
{
nOffset = (i * 5) * indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 1 + i;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + (i + 1)%slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + slices + i;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + slices + i;
lineIndexPtr->index1 = 1 + slices + (i + 1)%slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = numVertices - 1;
lineIndexPtr->index1 = 1 + slices + i;
}
}
else
{
YsLineIndex32* lineIndexPtr = NULL;
for (Yuint i= 0; i < slices; i++)
{
nOffset = (i * 5) * indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 1 + i;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + (i + 1)%slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + slices + i;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + slices + i;
lineIndexPtr->index1 = 1 + slices + (i + 1)%slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = numVertices - 1;
lineIndexPtr->index1 = 1 + slices + i;
}
}

return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: