当前位置: 首页 > news >正文

[1] 平面(Plane)图形的生成算法

顶点数据的生成

 1 bool                        YfBuildPlaneVertices
 2 (
 3     Yreal                   width, 
 4     Yreal                   length, 
 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 (slices < 2 || stacks < 2 || !pVerticesBuffer)
15     {
16         return false;
17     }
18 
19     // 顶点赋值
20     char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
21     YsVector3* curVertexPtr = NULL;
22     Yuint nOffset = 0;
23   
24     Yreal xStep = width  / slices;
25     Yreal zStep = length / stacks;
26     YsVector3 vOrigin;
27     if (originPose == YE_ORIGIN_POSE_CENTER)
28     {
29         vOrigin.x = -width * 0.5f;
30         vOrigin.z = -length * 0.5f;
31     }
32 
33     for (Yuint j = 0; j < stacks; j++)             // Z方向
34     {
35         for (Yuint i = 0; i < slices; i++)         // X方向
36         {
37             nOffset =  (j*slices + i) * vertexStriding;
38             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
39             curVertexPtr->x = vOrigin.x + i*xStep;
40             curVertexPtr->y = height;
41             curVertexPtr->z = vOrigin.z + j*zStep;
42         }
43     }
44 
45     return true;
46 }

 

三角形索引数据的生成

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

 

线框索引数据的生成

 1 bool                        YfBuildPlaneWireIndices
 2 (
 3     Yuint                   slices,
 4     Yuint                   stacks, 
 5     YeIndexType             indexType,
 6     Yuint                   indexStriding,  
 7     Yuint                   indexPos,
 8     void*                   pWireIndicesBuffer
 9 )
10 {
11     if (slices < 2 || stacks < 2 || !pWireIndicesBuffer)
12     {
13         return false;
14     }
15 
16     Yuint numVertices  = slices * stacks;
17     if (indexType == YE_INDEX_16_BIT && 
18         numVertices > YD_MAX_UNSIGNED_INT16)
19     {
20         return false;
21     }
22 
23     Yuint numLines = slices * (stacks - 1) +(slices - 1) * stacks;
24 
25     char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
26     Yuint nOffset = 0;
27 
28     if (indexType == YE_INDEX_16_BIT)
29     {
30         YsLineIndex16* lineIndexPtr = NULL;
31 
32         //
33         for (Yuint j = 0; j < stacks; j++)                 
34         {
35             for (Yuint i = 0; i < slices - 1; i++)         
36             {
37                 nOffset = ((j*(slices - 1) + i)) * indexStriding;
38                 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
39                 lineIndexPtr->index0 = j*slices + i;
40                 lineIndexPtr->index1 = j*slices + i + 1;
41             }
42         }
43 
44         //
45         Yuint half = (slices - 1) * stacks;
46         for (Yuint i = 0; i < slices; i++)                 
47         {
48             for (Yuint j = 0; j < stacks - 1; j++)         
49             {
50                 nOffset = (half + (i*(stacks - 1) + j)) * indexStriding;
51                 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
52                 lineIndexPtr->index0 = j*slices + i;
53                 lineIndexPtr->index1 = (j + 1)*slices + i;
54             }
55         }
56     }
57     else
58     {
59         YsLineIndex32* lineIndexPtr = NULL;
60 
61         //
62         for (Yuint j = 0; j < stacks; j++)                 
63         {
64             for (Yuint i = 0; i < slices - 1; i++)         
65             {
66                 nOffset = ((j*(slices - 1) + i)) * indexStriding;
67                 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
68                 lineIndexPtr->index0 = j*slices + i;
69                 lineIndexPtr->index1 = j*slices + i + 1;
70             }
71         }
72 
73         //
74         Yuint half = (slices - 1) * stacks;
75         for (Yuint i = 0; i < slices; i++)                 
76         {
77             for (Yuint j = 0; j < stacks - 1; j++)         
78             {
79                 nOffset = (half + (i*(stacks - 1) + j)) * indexStriding;
80                 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
81                 lineIndexPtr->index0 = j*slices + i;
82                 lineIndexPtr->index1 = (j + 1)*slices + i;
83             }
84         }
85     }
86 
87     return true;
88 }

 

 

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

相关文章:

  • 参数传递可选参数
  • Boosting 和梯度Boosting
  • 简单的javascript实例二(随页面滚动广告效果)
  • Android Studio 导入外部lib文件
  • HashMap和HashSet的区别
  • EXT今日笔记-ext获取url参数值
  • [LeetCode]Pow(x,n)
  • mysql数据库不能远端访问
  • 敏捷开发流程
  • 自动备份SQL数据库到云存储Storage
  • 1956-计算机基础知识大赛 3
  • 如何把照片变成素描
  • struts2 iterator排序
  • git基本命令
  • Java语言基础(五) Java原始数据类型的分类以及数据范围
  • 2017-09-12 前端日报
  • flask接收请求并推入栈
  • Java编程基础24——递归练习
  • Laravel 中的一个后期静态绑定
  • MQ框架的比较
  • overflow: hidden IE7无效
  • Phpstorm怎样批量删除空行?
  • SpingCloudBus整合RabbitMQ
  • vue-cli3搭建项目
  • vue数据传递--我有特殊的实现技巧
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 力扣(LeetCode)56
  • 前端之Sass/Scss实战笔记
  • 如何用vue打造一个移动端音乐播放器
  • 微信小程序--------语音识别(前端自己也能玩)
  • 责任链模式的两种实现
  • 怎么把视频里的音乐提取出来
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)(2.10) LTM telemetry
  • (3)llvm ir转换过程
  • (6)STL算法之转换
  • (待修改)PyG安装步骤
  • (二)丶RabbitMQ的六大核心
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一) springboot详细介绍
  • (一)SpringBoot3---尚硅谷总结
  • (转)人的集合论——移山之道
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net mvc总结
  • .NET 回调、接口回调、 委托
  • ?
  • ??eclipse的安装配置问题!??