// 生成顶点法线
bool YfCalculateVertexNormal
(
void* pNormalsBuffer,
Yuint normalStriding,
Yuint normalPos,
const void* pVerticesBuffer,
Yuint vertexNum,
Yuint vertexStriding,
Yuint vertexPos,
void* pIndicesBuffer,
Yuint trianglesNum,
YeIndexType indexType,
Yuint indexStriding,
Yuint indexPos
)
{
if (!pNormalsBuffer || !pVerticesBuffer || !pIndicesBuffer ||
vertexNum < || trianglesNum < )
{
return false;
} char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
char* normalPtr = (char*)pNormalsBuffer + normalPos;
char* indexPtr = (char*)pIndicesBuffer + indexPos; const YsVector* curVertexPtr[];
YsVector* curNormalPtr[];
Yuint nOffset = ;
YsVector vSub_1;
YsVector vSub_2;
YsVector vCross; for (Yuint i = ; i < vertexNum; i++)
{
curNormalPtr[] = (YsVector*)(normalPtr + i * normalStriding);
curNormalPtr[]->SetZero();
} if (indexType == YE_INDEX_16_BIT)
{
YsTriIndex16* triIndexPtr = NULL;
for (Yuint i = ; i < trianglesNum; i++)
{
triIndexPtr = (YsTriIndex16*)(indexPtr + i * indexStriding);
curVertexPtr[] = (YsVector*)(vertexPtr + triIndexPtr->index0 * vertexStriding);
curVertexPtr[] = (YsVector*)(vertexPtr + triIndexPtr->index1 * vertexStriding);
curVertexPtr[] = (YsVector*)(vertexPtr + triIndexPtr->index2 * vertexStriding);
curNormalPtr[] = (YsVector*)(normalPtr + triIndexPtr->index0 * normalStriding);
curNormalPtr[] = (YsVector*)(normalPtr + triIndexPtr->index1 * normalStriding);
curNormalPtr[] = (YsVector*)(normalPtr + triIndexPtr->index2 * normalStriding); vSub_1 = *curVertexPtr[] - *curVertexPtr[];
vSub_2 = *curVertexPtr[] - *curVertexPtr[];
YfVector3Cross(vCross, vSub_1, vSub_2); for (Yuint j = ; j < ; j++)
{
curNormalPtr[j]->x += vCross.x;
curNormalPtr[j]->y += vCross.y;
curNormalPtr[j]->z += vCross.z;
}
}
}
else
{
YsTriIndex32* triIndexPtr = NULL;
for (Yuint i = ; i < trianglesNum; i++)
{
triIndexPtr = (YsTriIndex32*)(indexPtr + i * indexStriding);
curVertexPtr[] = (YsVector*)(vertexPtr + triIndexPtr->index0 * vertexStriding);
curVertexPtr[] = (YsVector*)(vertexPtr + triIndexPtr->index1 * vertexStriding);
curVertexPtr[] = (YsVector*)(vertexPtr + triIndexPtr->index2 * vertexStriding);
curNormalPtr[] = (YsVector*)(normalPtr + triIndexPtr->index0 * normalStriding);
curNormalPtr[] = (YsVector*)(normalPtr + triIndexPtr->index1 * normalStriding);
curNormalPtr[] = (YsVector*)(normalPtr + triIndexPtr->index2 * normalStriding); vSub_1 = *curVertexPtr[] - *curVertexPtr[];
vSub_2 = *curVertexPtr[] - *curVertexPtr[];
YfVector3Cross(vCross, vSub_1, vSub_2); for (Yuint j = ; j < ; j++)
{
curNormalPtr[j]->x += vCross.x;
curNormalPtr[j]->y += vCross.y;
curNormalPtr[j]->z += vCross.z;
}
}
} for (Yuint i = ; i < vertexNum; i++)
{
curNormalPtr[] = (YsVector*)(normalPtr + i * normalStriding);
curNormalPtr[]->Normalize();
} return true;
}

[21] Mesh法线的生成算法的更多相关文章

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

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

  2. 转:体积阴影(Shadow Volumes)生成算法

    下面以最快的速度简单谈谈阴影生成技术,目前普遍采用的一般有三种:Planar Shadow.Shadow Mapping和Shadow Volume,前者类似投影,计算最简单,缺点只能绘制抛射在平面上 ...

  3. STL_算法_04_算术和生成算法

    ◆ 常用的算术和生成算法: 1.1.求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值.) T accumulate(iteratorBegi ...

  4. 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传

    一个简单的QQ隐藏图生成算法   隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...

  5. 理解分布式id生成算法SnowFlake

    理解分布式id生成算法SnowFlake https://segmentfault.com/a/1190000011282426#articleHeader2 分布式id生成算法的有很多种,Twitt ...

  6. 一个UUID生成算法的C语言实现 --- WIN32版本 .

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

  7. 分布式全局不重复ID生成算法

    分布式全局不重复ID生成算法 算法全局id唯一id  在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...

  8. C++ 基于凸包的Delaunay三角网生成算法

    Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...

  9. C++ 凸包生成算法

    由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...

随机推荐

  1. Dijkstra算法---HDU 2544 水题(模板)

    /* 对于只会弗洛伊德的我,迪杰斯特拉有点不是很理解,后来发现这主要用于单源最短路,稍稍明白了点,不过还是很菜,这里只是用了邻接矩阵 套模板,对于邻接表暂时还,,,没做题,后续再更新.现将这题贴上,应 ...

  2. 300万大奖:欢迎参加美团联合主办的全球AI挑战赛

    2018年8月29日,由美团.创新工场.搜狗.美图联合主办的“AI Challenger 2018全球AI挑战赛”正式启动.美团CTO罗道峰.创新工场CEO李开复.搜狗CEO王小川和美图CEO吴欣鸿共 ...

  3. 传递 hdu 5961 拓扑排序有无环~

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分 ...

  4. Java还是程序员的金饭碗

    可能会存在一种更快,更简单的编程语言,但就目前来说,根据Stack Overflow的最新统计,“传统”的编程语言依然在赚着大把的钱.在2013年,招聘程序员时,搜索最多的技能关键字是Java,几乎有 ...

  5. SERVLET API中forward()与redirect()的区别?

    前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址:后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接.这样,从浏览器的地址栏中可以看到跳转后的链接地址.所以,前者 ...

  6. Framework类库(FCL)简介

    Framework类库(Framework Class Library,FCL)是一组DLL程序集的统称,其中含有数千个类型定义,每个类型都公开了一些功能 部分常规的FCL命名空间 命名空间 内容说明 ...

  7. 整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件

    整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的 ...

  8. MongoDB 进阶

    一.MongoDB 复制(副本集) MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允 ...

  9. luogu4407 [JSOI2009]电子字典 字符串hash + hash表

    暴力枚举,然后\(hash\)表判断 复杂度\(O(26 * 20 * n)\) 具体而言 对于操作1:暴力枚举删除 对于操作2:暴力添加,注意添加不要重复 对于操作3:暴力替换,同样的注意不要重复 ...

  10. [WC2018]州区划分(状压DP+FWT/FMT)

    很裸的子集反演模板题,套上一些莫名其妙的外衣. 先预处理每个集合是否合法,再作显然的状压DP.然后发现可以写成子集反演的形式,直接套模板即可. 子集反演可以看这里. 子集反演的过程就是多设一维代表集合 ...