[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; }
相关文章推荐
- [5] 柱台(Cylinder)图形的生成算法
- [14] 齿轮(Gear Wheel)图形的生成算法
- [16] 螺旋面(Spire)图形的生成算法
- [8] 圆面(Round)图形的生成算法
- 基本图形生成算法注记
- [9] 圆环(Ring)图形的生成算法
- 基本图形生成算法注记
- [1] 平面(Plane)图形的生成算法
- [17] 楼梯(Stairs)图形的生成算法
- [10] 圆管(Pipe)图形的生成算法
- 计算机图形学基础 : 基本图形生成算法之直线的扫描转换
- [11] 楔形体(Wedge)图形的生成算法
- [2] 立方体(Box)图形的生成算法
- [12] 扇形体(Fan)图形的生成算法
- [12] 扇形体(Fan)图形的生成算法
- 【计算机图形学】基本图形元素:直线的生成算法
- 【计算机图形学】基本图形元素:圆的生成算法
- 常用直线图形生成算法(一)
- 【OpenCV】图形生成算法:多边形的扫描转换
- [13] 弧面(Arc)图形的生成算法