博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[4] 圆锥(Cone)图形的生成算法
阅读量:6833 次
发布时间:2019-06-26

本文共 5789 字,大约阅读时间需要 19 分钟。

顶点数据的生成

 

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

 

三角形索引数据的生成

1 bool                        YfBuildConeTriIndices 2 ( 3     Yuint                   slices, 4     YeIndexType             indexType, 5     Yuint                   indexStriding,   6     Yuint                   indexPos, 7     void*                   pTriIndicesBuffer 8 )                            9 {10     if (slices < 2 || !pTriIndicesBuffer)11     {12         return false;13     }14 15     Yuint numVertices  = slices + 2;16     Yuint numTriangles = slices * 2;17     if (indexType == YE_INDEX_16_BIT && 18         numVertices > YD_MAX_UNSIGNED_INT16)19     {20         return false;21     }22 23     // 索引赋值24     char* indexPtr = (char*)pTriIndicesBuffer + indexPos;25     Yuint nOffset = 0;26     if (indexType == YE_INDEX_16_BIT)27     {28         YsTriIndex16* triIndexPtr = NULL;29         for (Yuint i= 0; i < slices; i++)30         {31             nOffset = (i * 2) * indexStriding;32             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);33             triIndexPtr->index0 = 0;34             triIndexPtr->index1 = 1 + i;35             triIndexPtr->index2 = 1 + (i + 1)%slices;36 37             nOffset += indexStriding;38             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);39             triIndexPtr->index0 = numVertices - 1;40             triIndexPtr->index1 = 1 + (i + 1)%slices;41             triIndexPtr->index2 = 1 + i;42         }43     }44     else45     {46         YsTriIndex32* triIndexPtr = NULL;47         for (Yuint i= 0; i < slices; i++)48         {49             nOffset = (i * 2) * indexStriding;50             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);51             triIndexPtr->index0 = 0;52             triIndexPtr->index1 = 1 + i;53             triIndexPtr->index2 = 1 + (i + 1)%slices;54 55             nOffset += indexStriding;56             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);57             triIndexPtr->index0 = numVertices - 1;58             triIndexPtr->index1 = 1 + (i + 1)%slices;59             triIndexPtr->index2 = 1 + i;60         }61     }62 63     return true;64 }

线框索引数据的生成

1 bool                        YfBuildConeWireIndices 2 ( 3     Yuint                   slices, 4     YeIndexType             indexType, 5     Yuint                   indexStriding,   6     Yuint                   indexPos, 7     void*                   pWireIndicesBuffer 8 ) 9 {10     if (slices < 2 || !pWireIndicesBuffer)11     {12         return false;13     }14 15     Yuint numVertices = slices + 2;16     Yuint numLines    = slices * 2;17     if (indexType == YE_INDEX_16_BIT && 18         numVertices > YD_MAX_UNSIGNED_INT16)19     {20         return false;21     }22 23     // 索引赋值24     char* indexPtr = (char*)pWireIndicesBuffer + indexPos;25     Yuint nOffset = 0;26     if (indexType == YE_INDEX_16_BIT)27     {28         YsLineIndex16* lineIndexPtr = NULL;29         for (Yuint i= 0; i < slices; i++)30         {31             nOffset = (i * 2) * indexStriding;32             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);33             lineIndexPtr->index0 = 0;34             lineIndexPtr->index1 = 1 + i;35 36             nOffset += indexStriding;37             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);38             lineIndexPtr->index0 = 1 + i;39             lineIndexPtr->index1 = 1 + (i + 1)%slices;40         }41     }42     else43     {44         YsLineIndex32* lineIndexPtr = NULL;45         for (Yuint i= 0; i < slices; i++)46         {47             nOffset = (i * 2) * indexStriding;48             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);49             lineIndexPtr->index0 = 0;50             lineIndexPtr->index1 = 1 + i;51 52             nOffset += indexStriding;53             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);54             lineIndexPtr->index0 = 1 + i;55             lineIndexPtr->index1 = 1 + (i + 1)%slices;56         }57     }58 59     return true;60 }

 

 

转载地址:http://mytkl.baihongyu.com/

你可能感兴趣的文章
Visual Studio 2015 速递(4)——高级特性之移动开发
查看>>
第三章 Shell表达式与运算符
查看>>
葡萄城报表模板库更新:新增6个行业、50张经典报表模板
查看>>
在制作WORD小报时添加艺术横线或者艺术竖线
查看>>
值得一看:一个故事说清楚锐捷网络COffice的作用和优势
查看>>
Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱
查看>>
K8S网络NAT问题分析与处理
查看>>
XStream处理重复的或循环引用
查看>>
对某机构为“转移内部矛盾”而嫁祸于我们的事件之真相大起底
查看>>
Exchange管理控制台无法安装,要求重新启动
查看>>
【案例分享】电力设备生产数据的多层分组统计报表实现
查看>>
Windows 7下安装Cygwin亲历烦恼记录
查看>>
4G时代,语音社交APP或成智能手表的杀手级应用
查看>>
年入十万靠努力,年入百万靠能力,年入千万靠什么
查看>>
【免费下载】《这样理解知识管理》电子书,2016学会知识管理
查看>>
轻量级的Web服务器Nginx0.9.0 开发版发布
查看>>
听到两个程序员聊天——A:“借我1K块。”
查看>>
Oracle ROWID
查看>>
重构可让SQL提高可维护性,可读性以及效能性
查看>>
java多线程例子
查看>>