您的位置:首页 > 其它

[14] 齿轮(Gear Wheel)图形的生成算法

2013-11-09 08:51 330 查看




顶点数据的生成

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

Yuint numVertices  = slices*4 + 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;
Yreal fRadius;
for (Yuint i = 0; i < 2*slices; i++)
{
angleXZ = YD_REAL_TWAIN_PI * i / (slices*2);
posX = yf_sin(angleXZ);
posZ = yf_cos(angleXZ);
fRadius = (i%2 == 0) ? radius : assistRadius;

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

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

return true;
}


三角形索引数据的生成

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

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

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

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

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

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

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

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

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

return true;
}


线框索引数据的生成

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

Yuint numVertices = (slices*2) * 2 + 2;
Yuint numLines    = (slices*2) * 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 < 2 * slices; i++)
{
nOffset = (i * 3) * indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + (i + 1)%(slices*2);

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

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

Yuint half = 6 * slices * indexStriding;
for (Yuint i = 0; i < slices; i++)
{
nOffset = half + (i * 2) * indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 1 + i*2 + 1;

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

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

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

Yuint half = 6 * slices * indexStriding;
for (Yuint i = 0; i < slices; i++)
{
nOffset = half + (i * 2) * indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 1 + i*2 + 1;

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

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