// 生成顶点法线
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. Jersey入门三:创建一个JavaEE的Web项目

    1.在终端中输入如下命令,创建一个名为的simple-service-webapp项目: mvn archetype:generate -DarchetypeArtifactId=jersey-qui ...

  2. STM32 串口通信

    1. 中断说明 TXE(Tansmit Data Register empty interrupt) - 发送数据寄存器空,产生中断.当使能TXE后,只要Tx DR空了,就会产生中断.---写寄存器D ...

  3. 前端安全系列之二:如何防止CSRF攻击?

    背景 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点.在移动互联网时代,前端人员除了传统的 XSS.CSRF 等安全问题之外,又时常遭遇网络劫持 ...

  4. 华为荣耀V8这个7.0的系统的root

    原文链接:http://m.shuaji.com/jiaocheng/5585.htm 已经有不少的机友的华为荣耀V8手机已经升级到EMUI5.0了,也就是现在的安卓7.0的系统,那这个时候该如何进行 ...

  5. Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...

  6. 选择排序之Java实现

    选择排序之Java实现 一.方法一 package cn.com.zfc.lesson21.sort; /** * * @title SelectSort * @describe 选择排序 * @au ...

  7. codevs 2292 图灵机游戏

    2292 图灵机游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 黄金 Gold   题目描述 Description [Shadow 1]第二题 Shadow最近知道了图灵 ...

  8. Mysql的学习随笔day1

    关于mysql的基本语句 ps:[]是缺省 创建:CREATE DATABASE  db.name CREATE TABLE name(列名,类型,[NULL])NOT NULL是不需要为空,NOT ...

  9. HDU 5683 zxa and xor 暴力模拟

    zxa and xor 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5683 Description zxa had a great interes ...

  10. Codeforces Round #254 (Div. 1) D. DZY Loves Strings hash 暴力

    D. DZY Loves Strings 题目连接: http://codeforces.com/contest/444/problem/D Description DZY loves strings ...