// 生成顶点法线
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. thinkphp3.2自动生成模块BIND_MODULE

    thinphp3.2中提供了自定义生成模块与控制器的常量,分别是BIND_MODULE,BUILD_CONTROLLER_LIST 在 index.php 文件中定义 BIND_MODULE,BUIL ...

  2. TradingView 初识

    如引用 TradingView 库,需引入库中 3 个文件(所需库为 github 私有库,需申请) <script type="text/javascript" src=& ...

  3. DNS 设置

    用上 ip 靓号1.1.1.1,Cloudflare 花了多少钱? ipv4: 1.1.1.1 和 1.0.0.1 是目前最快的 DNS. 通过ipv6***之二--使用IPv6 DNS服务器

  4. Picasso:开启大前端的未来

    “道生一,一生二,二生三,三生万物.” —— <道德经> Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应 ...

  5. liniux Crontab 的重启和设置

    重启crontab,service cron restart 05 01 * * * /usr/local/php/bin/php FILE 10,30,50 * * * * /usr/local/p ...

  6. 在python中独立运行orm

  7. [BZOJ4668]冷战(并查集)

    比较自然的思路是,由于需要记录连通块合并时的信息,所以需要建出Kruskal重构树. 需要用LCT维护,支持加点和在线LCA操作. 不妨考虑在并查集合并的同时记录信息,pre[x]表示x与它的父亲相连 ...

  8. Trie树之C-实现

    title: Trie树之C++实现 comments: true date: 2016-10-02 16:59:54 categories: 算法 tags: Trie树 前言 之前写了一篇偏向于理 ...

  9. hdoj 5198 Strange Class 水题

    Strange Class Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...

  10. .NET面试宝典-基础

    经典.net面试题目 建议使用朗读女软件下载,边读边记. 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private :   私有 ...