[3] 球(Sphere)图形的生成算法
顶点数据的生成
- bool YfBuildSphereVertices
- (
- Yreal radius,
- Yuint slices,
- Yuint stacks,
- YeOriginPose originPose,
- Yuint vertexStriding,
- Yuint vertexPos,
- void* pVerticesBuffer
- )
- {
- if (slices < || stacks < || !pVerticesBuffer)
- {
- return false;
- }
- Yuint numVertices = slices * (stacks - ) + ;
- // 顶点赋值
- char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
- YsVector3* curVertexPtr = NULL;
- Yuint nOffset = ;
- Yreal originOffsetY = 0.0f;
- if (originPose == YE_ORIGIN_POSE_TOP)
- {
- originOffsetY = -radius;
- }
- else if (originPose == YE_ORIGIN_POSE_BOTTOM)
- {
- originOffsetY = radius;
- }
- Yreal* pSinList = YD_NEW_ARRAY(Yreal, slices);
- Yreal* pCosList = YD_NEW_ARRAY(Yreal, slices);
- Yreal angleXZ;
- for (Yuint j = ; j < slices; j++)
- {
- angleXZ = YD_REAL_TWAIN_PI * j / slices;
- pSinList[j] = yf_sin(angleXZ);
- pCosList[j] = yf_cos(angleXZ);
- }
- // 赋值
- {
- for (Yuint i = ; i < stacks; i++)
- {
- if (i == ) // 第一个顶点
- {
- nOffset = ;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = 0.0f;
- curVertexPtr->y = radius + originOffsetY;
- curVertexPtr->z = 0.0f;
- continue;
- }
- else if (i == stacks - ) // 最后一个顶点
- {
- nOffset = (numVertices - ) * vertexStriding;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = 0.0f;
- curVertexPtr->y = -radius + originOffsetY;
- curVertexPtr->z = 0.0f;
- continue;
- }
- Yreal angleY = YD_REAL_PI * i / (stacks - );
- Yreal posY = radius * yf_cos(angleY);
- Yreal radiusXZ = radius * yf_sin(angleY);
- Yreal posX, posZ;
- for (Yuint j = ; j < slices; j++)
- {
- posX = radiusXZ * pSinList[j];
- posZ = radiusXZ * pCosList[j];
- nOffset = ((i - ) * slices + j + ) * vertexStriding;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = posX;
- curVertexPtr->y = posY + originOffsetY;
- curVertexPtr->z = posZ;
- }
- }
- }
- YD_SAFE_DELETE_ARRAY(pSinList);
- YD_SAFE_DELETE_ARRAY(pCosList);
- return true;
- }
三角形索引数据的生成
- bool YfBuildSphereTriIndices
- (
- Yuint slices,
- Yuint stacks,
- YeIndexType indexType,
- Yuint indexStriding,
- Yuint indexPos,
- void* pTriIndicesBuffer
- )
- {
- if (slices < || stacks < || !pTriIndicesBuffer)
- {
- return false;
- }
- Yuint numVertices = slices * (stacks - ) + ;
- Yuint numTriangles = slices * (stacks - ) * ;
- if (indexType == YE_INDEX_16_BIT &&
- numVertices > YD_MAX_UNSIGNED_INT16)
- {
- return false;
- }
- // 索引赋值
- char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
- Yuint nOffset = ;
- if (indexType == YE_INDEX_16_BIT)
- {
- YsTriIndex16* triIndexPtr = NULL;
- for (Yuint i = ; i < stacks - ; i++)
- {
- if (i == ) // 第一层
- {
- for (Yuint j = ; j < slices; j++)
- {
- nOffset = j * indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = ;
- triIndexPtr->index1 = + j;
- triIndexPtr->index2 = + (j + )%slices;
- }
- }
- else if (i == stacks - ) // 最后一层
- {
- for (Yuint j = ; j < slices; j++)
- {
- nOffset = (numTriangles - slices + j) * indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = numVertices - ;
- triIndexPtr->index1 = numVertices - - slices + (j + )%slices;
- triIndexPtr->index2 = numVertices - - slices + j;
- }
- }
- else
- {
- for (Yuint j = ; j < slices; j++)
- {
- nOffset = ((i - )*slices * + slices + j * ) * indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = + slices * (i - ) + j;
- triIndexPtr->index1 = + slices * i + j;
- triIndexPtr->index2 = + slices * (i - ) + (j + )%slices;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = + slices * (i - ) + (j + )%slices;
- triIndexPtr->index1 = + slices * i + j;
- triIndexPtr->index2 = + slices * i + (j + )%slices;
- }
- }
- }
- }
- else
- {
- YsTriIndex32* triIndexPtr = NULL;
- // 赋值
- for (Yuint i = ; i < stacks - ; i++)
- {
- if (i == ) // 第一层
- {
- for (Yuint j = ; j < slices; j++)
- {
- nOffset = j * indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = ;
- triIndexPtr->index1 = + j;
- triIndexPtr->index2 = + (j + )%slices;
- }
- }
- else if (i == stacks - ) // 最后一层
- {
- for (Yuint j = ; j < slices; j++)
- {
- nOffset = (numTriangles - slices + j) * indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = numVertices - ;
- triIndexPtr->index1 = numVertices - - slices + (j + )%slices;
- triIndexPtr->index2 = numVertices - - slices + j;
- }
- }
- else
- {
- for (Yuint j = ; j < slices; j++)
- {
- nOffset = ((i - )*slices * + slices + j * ) * indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = + slices * (i - ) + j;
- triIndexPtr->index1 = + slices * i + j;
- triIndexPtr->index2 = + slices * (i - ) + (j + )%slices;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = + slices * (i - ) + (j + )%slices;
- triIndexPtr->index1 = + slices * i + j;
- triIndexPtr->index2 = + slices * i + (j + )%slices;
- }
- }
- }
- }
- return true;
- }
线框索引数据的生成
- bool YfBuildSphereWireIndices
- (
- Yuint slices,
- Yuint stacks,
- YeIndexType indexType,
- Yuint indexStriding,
- Yuint indexPos,
- void* pWireIndicesBuffer
- )
- {
- if (slices < || stacks < || !pWireIndicesBuffer)
- {
- return false;
- }
- Yuint numVertices = slices * (stacks - ) + ;
- if (indexType == YE_INDEX_16_BIT &&
- numVertices > YD_MAX_UNSIGNED_INT16)
- {
- return false;
- }
- Yuint numLines = slices * (stacks - ) + slices * (stacks - );
- char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
- Yuint nOffset = ;
- if (indexType == YE_INDEX_16_BIT)
- {
- YsLineIndex16* lineIndexPtr = NULL;
- // 行
- for (Yuint j = ; j < stacks - ; j++)
- {
- for (Yuint i = ; i < slices; i++)
- {
- nOffset = ((j - )*slices + i) * indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = + (j - )*slices + i;
- lineIndexPtr->index1 = + (j - )*slices + (i + )%slices;
- }
- }
- // 列
- Yuint half = slices * (stacks - );
- for (Yuint i = ; i < slices; i++)
- {
- for (Yuint j = ; j < stacks - ; j++)
- {
- nOffset = (half + (i*(stacks - ) + j)) * indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- if (j == )
- {
- lineIndexPtr->index0 = ;
- }
- else
- {
- lineIndexPtr->index0 = + (j - )*slices + i;
- }
- if (j == stacks - )
- {
- lineIndexPtr->index1 = numVertices - ;
- }
- else
- {
- lineIndexPtr->index1 = + j*slices + i;
- }
- }
- }
- }
- else
- {
- YsLineIndex32* lineIndexPtr = NULL;
- // 行
- for (Yuint j = ; j < stacks - ; j++)
- {
- for (Yuint i = ; i < slices; i++)
- {
- nOffset = ((j - )*slices + i) * indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = + j*slices + i;
- lineIndexPtr->index1 = + j*slices + (i + )%slices;
- }
- }
- // 列
- Yuint half = slices * (stacks - );
- for (Yuint i = ; i < slices; i++)
- {
- for (Yuint j = ; j < stacks - ; j++)
- {
- nOffset = (half + (i*(stacks - ) + j)) * indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- if (j == )
- {
- lineIndexPtr->index0 = ;
- }
- else
- {
- lineIndexPtr->index0 = + (j - )*slices + i;
- }
- if (j == stacks - )
- {
- lineIndexPtr->index1 = numVertices - ;
- }
- else
- {
- lineIndexPtr->index1 = + j*slices + i;
- }
- }
- }
- }
- return true;
- }
[3] 球(Sphere)图形的生成算法的更多相关文章
- [20] 鼓状物(Drum)图形的生成算法
顶点数据的生成 bool YfBuildDrumVertices ( Yreal radius, Yreal assistRadius, Yuint slices, Yuint stacks, YeO ...
- [17] 楼梯(Stairs)图形的生成算法
感觉这图形怎么看怎么像搓衣板. 顶点数据的生成 bool YfBuildStairsVertices ( Yreal width, Yreal length, Yreal height, Yuint ...
- [19] 半球形(Hemisphere)图形的生成算法
顶点数据的生成 bool YfBuildHemisphereVertices ( Yreal radius, Yuint slices, Yuint stacks, YeOriginPose orig ...
- [18] 螺旋楼梯(Spiral Stairs)图形的生成算法
顶点数据的生成 bool YfBuildSpiralStairsVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint sli ...
- [16] 螺旋面(Spire)图形的生成算法
顶点数据的生成 bool YfBuildSpireVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, Yu ...
- [15] 星星(Star)图形的生成算法
顶点数据的生成 bool YfBuildStarVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, YeO ...
- [14] 齿轮(Gear Wheel)图形的生成算法
顶点数据的生成 bool YfBuildGearwheelVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices ...
- [13] 弧面(Arc)图形的生成算法
顶点数据的生成 bool YfBuildArcVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, Yuint stac ...
- [12] 扇形体(Fan)图形的生成算法
顶点数据的生成 bool YfBuildFunVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, YeOriginPo ...
随机推荐
- poj1611 The Suspects(并查集)
题目链接 http://poj.org/problem?id=1611 题意 有n个学生,编号0~n-1,m个社团,每个社团有k个学生,如果社团里有1个学生是SARS的疑似患者,则该社团所有人都要被隔 ...
- Bootstrap入门六:表单
表单主要包含表单域.输入框.下拉框.单选框.多选框和按钮等控件. 1.基本实例 单独的表单控件会被自动赋予一些全局样式.所有设置了 .form-control 类的 <input>.< ...
- 《Android源码设计模式》--工厂方法模式
No1: 对于一个应用程序来说,其真正的入口是在ActivityThread类中,ActivityThread中含有我们熟悉的main方法.ActivityThread是一个final类,不能被继承. ...
- 前端-JS-BOM和DOM
前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- My blog in AI -- 梯度下降算法
人工神经网络是对生物神经网络的模仿,神经网络对一个问题的学习,需要经历数据输入.网络参数的训练.超参数的调节等部分. 这次我们来详细讨论一下神经网络的学习过程. 假设我们要训练一个神经网络去识别一张图 ...
- MySQL服务器 IO 100%的案例分析
[问题] 有台MySQL 5.6.21的数据库实例以写入为主,IO %util接近100% 写入IOPS很高 [分析过程] 1.通过iotop工具可以看到当前IO消耗最高的mysql线程 2.查看线程 ...
- 深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现
在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...
- Python 递归删除非空目录(包括子目录以及文件)
Python的OS模块自带rmdir和removedirs函数用于删除目录,但是两者都不能删除非空目录,以下代码定义了一个函数 remove_dir 用于删除非空目录. #作者官网 http://ww ...
- iOS 9应用开发教程之编辑界面与编写代码
iOS 9应用开发教程之编辑界面与编写代码 编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main.storyboard文件就 ...
- android 单位 什么是屏幕密度?
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha sp dp px in in 表示英寸, 是屏幕的物理尺寸.1英寸是2.54厘米. dp ...