[21] Mesh法线的生成算法
// 生成顶点法线
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法线的生成算法的更多相关文章
- 3D几何图形的生成算法
在之前的博客上,发布了一个我写的3D几何图形生成的DEMO: http://www.cnblogs.com/WhyEngine/p/3415040.html DEMO下载地址: http://file ...
- 转:体积阴影(Shadow Volumes)生成算法
下面以最快的速度简单谈谈阴影生成技术,目前普遍采用的一般有三种:Planar Shadow.Shadow Mapping和Shadow Volume,前者类似投影,计算最简单,缺点只能绘制抛射在平面上 ...
- STL_算法_04_算术和生成算法
◆ 常用的算术和生成算法: 1.1.求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值.) T accumulate(iteratorBegi ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
- 理解分布式id生成算法SnowFlake
理解分布式id生成算法SnowFlake https://segmentfault.com/a/1190000011282426#articleHeader2 分布式id生成算法的有很多种,Twitt ...
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
- 分布式全局不重复ID生成算法
分布式全局不重复ID生成算法 算法全局id唯一id 在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...
- C++ 基于凸包的Delaunay三角网生成算法
Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...
- C++ 凸包生成算法
由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...
随机推荐
- 黑马程序员_java基础笔记(06)...集合
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— JavaApi(其实就是java给我们提供的已经定义好的对象.工具对象:集合框架) ...
- 8-13 Just Finish it up uva11093
题意:环形跑道上有n n<=100000 个加油站 编号为1-n 第i个加油站可以加油pi加仑 从加油站i开到下一站需要qi加仑 你可以选择一个加油站作为起点 初始油箱为空 如果 ...
- 003 Scipy库简介
参考文档补充原本的文档: https://www.cnblogs.com/mrchige/p/6504324.html 一:原本的简单介绍 1.Scipy库 Scipy库是基于python生态的一款开 ...
- Ionic Js十八:滑动框
ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换: 效果图如下:   用法 <ion-slide-box on-slide-changed="slid ...
- ecshop,大商创后台设置增加字段方法
使用场景:在开发过程中有时是需要在后台增加一个参数 例如: 必须要改数据库和源码的 1,在数据库中增加一条数据 数据库名称:shop_config 2:后台语言包
- Oracle数据库的基本查询
本文用的是Oracle 10g数据库,利用PL/SQL Developer的集成开发环境(安装可以自行百度) Oracle数据库 ---> 数据库实例 ---> 表空间(逻辑单位)( ...
- 使用easypoi导出excel
EasyPOI是在jeecg的poi模块基础上,继续开发独立出来的,可以说是2.0版本,EasyPoi封装的目的和jeecg一致,争取让大家write less do more ,在这个思路上easy ...
- [leetcode tree]101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- 【SQL】185. Department Top Three Salaries
The Employee table holds all employees. Every employee has an Id, and there is also a column for the ...
- Django基础-Lesson1
web框架概念 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统. 对于所有的Web应用,本质上其实就是一个socket服务端, ...