顶点数据的生成

 1 bool                        YfBuildSpireVertices
 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
19     Yuint numVertices  = 2 + stacks * 2;
20     //Yuint numTriangles = stacks * 2;
21
22     char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
23     YsVector3* curVertexPtr = NULL;
24     Yuint nOffset = 0;
25
26     Yreal originOffsetY = 0.0f;
27     if (originPose == YE_ORIGIN_POSE_TOP)
28     {
29         originOffsetY = -height;
30     }
31     else if (originPose == YE_ORIGIN_POSE_CENTER)
32     {
33         originOffsetY = -height * 0.5f;
34     }
35
36     Yreal fAngle = YD_REAL_TWAIN_PI / slices;
37
38     Yreal angleXZ;
39     Yreal posX, posZ;
40     for (Yuint i = 0; i <= stacks; i++)
41     {
42         angleXZ = i * fAngle;
43         posX = yf_sin(angleXZ);
44         posZ = yf_cos(angleXZ);
45         nOffset = i * 2 * vertexStriding;
46
47         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
48         curVertexPtr->x = assistRadius * posX;
49         curVertexPtr->y = height * i * 1.0f / stacks + originOffsetY;
50         curVertexPtr->z = assistRadius * posZ;
51
52         nOffset += vertexStriding;
53
54         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
55         curVertexPtr->x = radius * posX;
56         curVertexPtr->y = height * i * 1.0f / stacks + originOffsetY;
57         curVertexPtr->z = radius * posZ;
58     }
59
60     return true;
61 }

三角形索引数据的生成

 1 bool                        YfBuildSpireTriIndices
 2 (
 3     Yuint                   stacks,
 4     YeIndexType             indexType,
 5     Yuint                   indexStriding,
 6     Yuint                   indexPos,
 7     void*                   pTriIndicesBuffer
 8 )
 9 {
10     if (stacks < 3 || !pTriIndicesBuffer)
11     {
12         return false;
13     }
14
15     Yuint numVertices  = 2 + stacks * 2;
16     Yuint numTriangles = stacks * 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 < stacks; i++)
30         {
31             nOffset = 2 * i * indexStriding;
32             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
33             triIndexPtr->index0 = i*2;
34             triIndexPtr->index1 = i*2 + 1;
35             triIndexPtr->index2 = i*2 + 3;
36
37             nOffset += indexStriding;
38             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
39             triIndexPtr->index0 = i*2;
40             triIndexPtr->index1 = i*2 + 3;
41             triIndexPtr->index2 = i*2 + 2;
42         }
43     }
44     else
45     {
46         YsTriIndex32* triIndexPtr = NULL;
47         for (Yuint i = 0; i < stacks; i++)
48         {
49             nOffset = 2 * i * indexStriding;
50             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
51             triIndexPtr->index0 = i*2;
52             triIndexPtr->index1 = i*2 + 1;
53             triIndexPtr->index2 = i*2 + 3;
54
55             nOffset += indexStriding;
56             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
57             triIndexPtr->index0 = i*2;
58             triIndexPtr->index1 = i*2 + 3;
59             triIndexPtr->index2 = i*2 + 2;
60         }
61     }
62
63     return true;
64 } 

线框索引数据的生成

 1 bool                        YfBuildSpireWireIndices
 2 (
 3     Yuint                   stacks,
 4     YeIndexType             indexType,
 5     Yuint                   indexStriding,
 6     Yuint                   indexPos,
 7     void*                   pWireIndicesBuffer
 8 )
 9 {
10     if (stacks < 3 || !pWireIndicesBuffer)
11     {
12         return false;
13     }
14
15     Yuint numVertices = 2 + stacks * 2;
16     Yuint numLines    = 1 + stacks * 3;
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 < stacks; i++)
30         {
31             nOffset = (i * 3) * indexStriding;
32             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
33             lineIndexPtr->index0 = i * 2;
34             lineIndexPtr->index1 = i * 2 + 1;
35
36             nOffset += indexStriding;
37             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
38             lineIndexPtr->index0 = i * 2 + 2;
39             lineIndexPtr->index1 = i * 2;
40
41             nOffset += indexStriding;
42             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
43             lineIndexPtr->index0 = i * 2 + 3;
44             lineIndexPtr->index1 = i * 2 + 1;
45         }
46
47         nOffset = (stacks * 3) * indexStriding;
48         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
49         lineIndexPtr->index0 = stacks * 2;
50         lineIndexPtr->index1 = stacks * 2 + 1;
51     }
52     else
53     {
54         YsLineIndex32* lineIndexPtr = NULL;
55         for (Yuint i = 0; i < stacks; i++)
56         {
57             nOffset = (i * 3) * indexStriding;
58             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
59             lineIndexPtr->index0 = i * 2;
60             lineIndexPtr->index1 = i * 2 + 1;
61
62             nOffset += indexStriding;
63             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
64             lineIndexPtr->index0 = i * 2 + 2;
65             lineIndexPtr->index1 = i * 2;
66
67             nOffset += indexStriding;
68             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
69             lineIndexPtr->index0 = i * 2 + 3;
70             lineIndexPtr->index1 = i * 2 + 1;
71         }
72
73         nOffset = (stacks * 3) * indexStriding;
74         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
75         lineIndexPtr->index0 = stacks * 2;
76         lineIndexPtr->index1 = stacks * 2 + 1;
77     }
78
79     return true;
80 } 

转载于:https://www.cnblogs.com/WhyEngine/p/3415258.html

[16] 螺旋面(Spire)图形的生成算法相关推荐

  1. [20] 鼓状物(Drum)图形的生成算法

    顶点数据的生成 1 bool YfBuildDrumVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yuint slices, 6 Yuint ...

  2. [17] 楼梯(Stairs)图形的生成算法

    感觉这图形怎么看怎么像搓衣板. 顶点数据的生成 bool YfBuildStairsVertices (Yreal width, Yreal length, Yreal height, Yuint s ...

  3. [15] 星星(Star)图形的生成算法

    顶点数据的生成 1 bool YfBuildStarVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, 6 Yuint ...

  4. [13] 弧面(Arc)图形的生成算法

    顶点数据的生成 1 bool YfBuildArcVertices 2 ( 3 Yreal radius, 4 Yreal degree, 5 Yreal height, 6 Yuint slices ...

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

    顶点数据的生成 1 bool YfBuildSpiralStairsVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, ...

  6. 3D几何图形的生成算法

    在之前的博客上,发布了一个我写的3D几何图形生成的DEMO: http://www.cnblogs.com/WhyEngine/p/3415040.html DEMO下载地址: http://file ...

  7. 计算机地图制图原理与算法,计算机地图制图原理与方法-基本图形生成算法.ppt...

    <计算机地图制图原理与方法-基本图形生成算法.ppt>由会员分享,可在线阅读,更多相关<计算机地图制图原理与方法-基本图形生成算法.ppt(35页珍藏版)>请在人人文库网上搜索 ...

  8. 图形算法:圆形生成算法

    图形算法:圆形生成算法 标签(空格分隔): 算法 版本:2 作者:陈小默 声明:禁止商用,禁止转载 发布于:作业部落.CSDN博客 圆的定义为所有距离中心位置 (xc,yc) 为定值 r 的点的集合1 ...

  9. 计算机图形生成的基本单位是,第五章 基本图形生成算法

    如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点.直线.圆.椭圆.多边形域.字符串及其相关属性等). 图形生成的概念 图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形. 图形的 ...

最新文章

  1. chrome dev debug network 的timeline说明
  2. 使用 openssl反弹加密 shell
  3. Spring使用Quartz配置调度事务
  4. ubuntu: Authentication failure的解决办法
  5. 【笔记】 感受野与权值共享 摄像头标定 相机坐标与世界坐标
  6. mysql innodb_undo_directory默认_MySQL innodb_undo_tablespaces相关参数
  7. Linq表达式、Lambda表达式你更喜欢哪个?
  8. 使用OpenSSL加密,使用Java解密,使​​用OpenSSL RSA公钥
  9. 图像处理之积分图应用三(基于NCC快速相似度匹配算法)
  10. 数据结构与算法-黑盒与白盒测试法
  11. python sql注入脚本_python辅助sql手工注入猜解数据库案例分析
  12. Java教程:Java String字符串和整型int的相互转换
  13. Ice-E(Embedded Internet Communications Engine)移植到s3c2440A(arm9)linux(2.6.12)上的 -转
  14. 10 个最佳地理空间数据分析 GIS 软件
  15. 使用js打印网页局部图片(内容)
  16. 抖音小程序开发所遇到的问题
  17. 拯救者15isk加装固态硬盘
  18. 怎么去除WORD的背景颜色
  19. Java:BigDecimal的学习与使用
  20. 解决eclipse: Resource is out of sync with the file system 报错问题

热门文章

  1. 数字货币EOS半年时间暴跌90%多,还可追捧吗?
  2. javascript晚绑定_JavaScript的应用,调用和绑定通过托管野餐来解释
  3. 数据结构中等号表示什么_通过分析2016年最重要的252个中等故事我学到了什么...
  4. python描述器做权限控制_Python装饰器14-描述器
  5. 泛型java博客园,Java深度历险之Java泛型
  6. powerdesigner类图在子类中显示从父类继承来的方法
  7. TCP/IP:IP选项处理
  8. C++ Primer(第4版)(评注版)
  9. 【踩坑记录】记一次MySQL主从复制延迟的坑
  10. 在 Android 应用程序中使用 SQLite 数据库以及怎么用