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


顶点数据的生成

 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 }


 

原文地址:https://www.cnblogs.com/WhyEngine/p/3415263.html