[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 ...
随机推荐
- thinkphp和ueditor自定义后台处理方法整合
先了解一下ueditor后台请求参数与返回参数格式规范: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- 【知了堂学习笔记】java 编写几种常见排序算法2
排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...
- Java_常用API
1.基本类型包装类 1.1 概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型 ...
- Elasticsearch源码分析 | 单节点的启动和关闭
本文主要简要介绍Elasticsearch单节点的启动和关闭流程.Elasticsearch版本:6.3.2 相关文章 1.Google Guice 快速入门 2.Elasticsearch 中的 G ...
- 面向对象设计原则 迪米特法则(Law of Demeter)
迪米特法则(Law of Demeter) 又叫作最少知识原则(Least Knowledge Principle 简写LKP),英文简写为: LoD. 这是一种面向对象程序设计的指导原则,它描述了一 ...
- NEUQ OJ 2004:追梦之人 (计数数位dp)
2004: 追梦之人 描述 题目描述: 为了纪念追梦人,粉丝们创造了一种新的数——“追梦数”.追梦数要满足以下两个条件:1.数字中不能出现“7”2.不能被7整除.比如:777和4396就不是追梦数,而 ...
- 方程式0day图形化利用工具
最近方程式的漏洞着实活了一把,分析了下githup上面的文件目录,找到了利用文件,主要是针对windows主机的SMB.RDP协议进行攻击,因为我主要根据他们提供的payload的程序,利用这两个模块 ...
- [JOISC2014]歴史の研究/[BZOJ4241]历史研究
[JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的 ...
- 重庆市队选拔 CQOI2015 解题报告
文章链接:http://www.cnblogs.com/Asm-Definer/p/4434601.html 题目链接:http://pan.baidu.com/s/1mgxIKli 官方数据:htt ...
- Atlas 安装运行随笔
Atlas 是一个用于数据库负载均衡 ,读写分离的中间件,他实现了mysql 的语法,对于普通调用DAL 层来说的话,和mysql 是一样的. 一,安装1,从源码安装 , 可以参考 http://bl ...