您的位置:首页 > 大数据 > 人工智能

[18] 螺旋楼梯(Spiral Stairs)图形的生成算法

2016-07-29 00:00 435 查看




顶点数据的生成

1 bool YfBuildSpiralStairsVertices  2 (  3  Yreal radius,  4  Yreal assistRadius,  5  Yreal height,  6  Yuint slices,  7  Yuint stacks,  8  YeOriginPose originPose,  9  Yuint vertexStriding, 10  Yuint vertexPos, 11     void* pVerticesBuffer 12 ) 13 { 14     if (stacks < 1 || slices < 3 || !pVerticesBuffer) 15  { 16         return false; 17  } 18     Yuint numVertices  = 2 + stacks * 4; 19     //Yuint numTriangles = stacks * 8;
20
21     char* vertexPtr = (char*)pVerticesBuffer + vertexPos; 22     YsVector3* curVertexPtr = NULL; 23     Yuint nOffset = 0; 24
25     Yreal originOffsetY = 0.0f; 26     if (originPose == YE_ORIGIN_POSE_TOP) 27  { 28         originOffsetY = -height; 29  } 30     else if (originPose == YE_ORIGIN_POSE_CENTER) 31  { 32         originOffsetY = -height * 0.5f; 33  } 34
35     Yreal fStepTexcoord = 1.0f / (stacks - 1); 36     Yreal fStepHeight = height / stacks; 37     Yreal fStepAngle = YD_REAL_TWAIN_PI / slices; 38
39  Yreal angleXZ; 40  Yreal posX, posZ; 41     for (Yuint i = 0; i <= stacks; i++) 42  { 43         angleXZ = i * fStepAngle; 44         posX = yf_sin(angleXZ); 45         posZ = yf_cos(angleXZ); 46
47         nOffset = i * 4 * vertexStriding; 48         curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 49         curVertexPtr->x = radius * posX; 50         curVertexPtr->y = i * fStepHeight + originOffsetY; 51         curVertexPtr->z = radius * posZ; 52
53         nOffset += vertexStriding; 54         curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 55         curVertexPtr->x = assistRadius * posX; 56         curVertexPtr->y = i * fStepHeight + originOffsetY; 57         curVertexPtr->z = assistRadius * posZ; 58
59         if (i == stacks) 60  { 61             continue; 62  } 63
64         nOffset += vertexStriding; 65         curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 66         curVertexPtr->x = radius * posX; 67         curVertexPtr->y = (i+1) * fStepHeight + originOffsetY; 68         curVertexPtr->z = radius * posZ; 69
70         nOffset += vertexStriding; 71         curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 72         curVertexPtr->x = assistRadius * posX; 73         curVertexPtr->y = (i+1) * fStepHeight + originOffsetY; 74         curVertexPtr->z = assistRadius * posZ; 75  } 76
77     return true; 78 }


三角形索引数据的生成和线框索引数据的生成与楼梯的生成方式一样

1 bool YfBuildSpiralStairsTriIndices  2 (  3  Yuint stacks,  4  YeIndexType indexType,  5  Yuint indexStriding,  6  Yuint indexPos,  7     void* pTriIndicesBuffer  8 )  9 { 10     return YfBuildStairsTriIndices( 11  stacks, 12  indexType, 13  indexStriding, 14  indexPos, 15  pTriIndicesBuffer 16  ); 17 } 18
19 bool YfBuildSpiralStairsWireIndices 20 ( 21  Yuint stacks, 22  YeIndexType indexType, 23  Yuint indexStriding, 24  Yuint indexPos, 25     void* pWireIndicesBuffer 26 ) 27 { 28     return YfBuildStairsWireIndices( 29  stacks, 30  indexType, 31  indexStriding, 32  indexPos, 33  pWireIndicesBuffer 34  ); 35 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: