[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; }
相关文章推荐
- [14] 齿轮(Gear Wheel)图形的生成算法
- [13] 弧面(Arc)图形的生成算法
- 渣渣用JavaScript开发的消消乐,由于没有按照正规消消乐形式生成,是随机产生图形,所以存在一个算法bug,具体看下面,高手想到可以告诉我
- [18] 螺旋楼梯(Spiral Stairs)图形的生成算法
- [20] 鼓状物(Drum)图形的生成算法
- 【OpenCV】图形生成算法:多边形的扫描转换
- 计算机图形学基础 : 基本图形生成算法之直线的扫描转换
- [15] 星星(Star)图形的生成算法
- [2] 立方体(Box)图形的生成算法
- [12] 扇形体(Fan)图形的生成算法
- 算法分析与设计-14-最小生成树的Prim算法
- [16] 螺旋面(Spire)图形的生成算法
- [17] 楼梯(Stairs)图形的生成算法
- [16] 螺旋面(Spire)图形的生成算法
- [1] 平面(Plane)图形的生成算法
- [18] 螺旋楼梯(Spiral Stairs)图形的生成算法
- [19] 半球形(Hemisphere)图形的生成算法
- [2] 立方体(Box)图形的生成算法
- [19] 半球形(Hemisphere)图形的生成算法
- [19] 半球形(Hemisphere)图形的生成算法