Muli3D 4 Calculate vertex tangent
记录一下:
// Calculate triangle normal ...vector3 v01 = pDest[1].vPosition - pDest[0].vPosition;vector3 v02 = pDest[2].vPosition - pDest[0].vPosition;vector3 vNormal; vVector3Cross( vNormal, v01, v02 );// all vertex normal is samepDest[0].vNormal = pDest[1].vNormal = pDest[2].vNormal = vNormal;// Calculate triangle tangent ...float32 fDeltaV[2] = {pDest[1].vTexCoord0.y - pDest[0].vTexCoord0.y,pDest[2].vTexCoord0.y - pDest[0].vTexCoord0.y };vector3 vTangent = (v01 * fDeltaV[1]) - (v02 * fDeltaV[0]);pDest[0].vTangent = pDest[1].vTangent = pDest[2].vTangent = vTangent.normalize();
以上的代码是主要的目的就是计算 顶点的法线与切线,法线就比较好理解,切线就需要点数学基础了。下面就记录一下切线的数学基础。
******************************************************************************
转载:
http://blog.csdn.net/bonchoix/article/details/8619624
参考:
Mathematics for 3D Game Programming and Computer Graphics-3rd edition
P180
已知该三角形三个顶点的位置坐标:P0, P1,P2, 以及对应的纹理坐标:(u0,v0,), (u1, v1), (u2, v2)。 定义三角形的两条边为E0 = P1 –P0,E1= P2 –P0,对应的纹理坐标差值:(t1, b1) = (u1 – u0, v1– v0), (t2, b2) = (u2 – u0, v2– v0)。 我们有如下关系式:
E0 =t1T+ b1B
E1 = t2T+ b2B
有了以上纹理坐标与位置坐标的关系,我们便可以根据已知的信息,自己来求得任一三角形的切线坐标系了。在3D模型文件中,所有顶点的位置坐标、纹理坐标、法线等信息一般都会提供的,但却缺少切线坐标系相关信息。而在应用Normal Mapping等技术时,切线空间又是必不可少的,因此就需要我们自己手动来获取切线坐标系了。很多读取模型的库都提供了生成切线空间的功能,不过了解一下其是如何生成还是很有必要的。下面我们就来一步步地推导下切线空间的求法:
继续从上面的纹理坐标与位置坐标的关系公式出发,把它表示成矩阵形式为:
把E0,E1,T,B拆成分量形式,即:
把移到另一边,有:
根据矩阵知识,对于矩阵, 其逆矩阵为:
因此以上公式可以进一步表示为:
******************************************************************************
对比代码与公式:
公式:
Tx = b2 * E0x - b1 * E1x
= ( (v2– v0) * (p1 - p0) - (v1 - v0) * (p2 - p0) ) * 1 / (t1b2 - b1t2)
代码:
vector3 vTangent = (v01 * fDeltaV[1]) - (v02 * fDeltaV[0]);
= (p1 - p0) * (v2 - v0) - (p2 - p0) * (v1 - v0)
对比之后,发现公式多了 1 / (t1b2 - b1t2),而代码是没有的,
个人理解,由于之后要正规化 vTangent (vTangent.normalize();) ,那么 1 / (t1b2 - b1t2) 乘不乘已经没有所谓了,代码就可以直接使用 (p1 - p0) * (v2 - v0) - (p2 - p0) * (v1 - v0)。
Muli3D 4 Calculate vertex tangent相关推荐
- Vertex and FragmentShader顶点与片段着色器
一.顶点与片段着色器简介 Vertex and FragmentShader:最强大的Shader类型,也是本系列的重点,下文中简称V&FShader,属于可编程渲染管线.使用的是CG/HLS ...
- chap6_2 Parallax mapping in OGRE
Parallax mapping(视差映射)是凹凸映射的一种,同样,这里只是在OGRE里面实现,不讲原理.我会写个DX版本的parallax mappiing,到时候再讲原理,敬请期待! /*---- ...
- VS2012下基于Glut 矩阵变换示例程序:
也可以使用我们自己的矩阵运算来实现OpenGL下的glTranslatef相应的旋转变换.需要注意的是OpenGL下的矩阵是列优先存储的. 示例通过矩阵运算使得圆柱或者甜圈自动绕Y轴旋转,可以单击鼠标 ...
- 用Assimp模型加载库加载一个Crytek的游戏孤岛危机(Crysis)中的原版纳米装(Nanosuit)
用这个例子来对GitHub上的LearnOpenGL教程前四个单元用到的所有自定义或者引入的各种头文件和资源进行一个总结,不得不说这个教程简直太美妙了. 这个模型是来自对GitHub上的LearnOp ...
- D3D11 骨骼动画(基于MD5格式)
MD5格式利用了骨骼系统(也称为关节系统)来做动画效果,因此在本章节会介绍如何遍历存储在md5anim文件中的动画以及如何将动画应用在模型上.骨骼系统(也称为关节系统)优点在于比直接存储关键帧动画要占 ...
- shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成
shader graph A recent Unity Labs paper introduces a new framework for blending normal maps that is e ...
- LearnOpenGL笔记——五、高级光照:“法线贴图”和”视差贴图“
五.高级光照:"法线贴图"和"视差贴图" 5.4 法线贴图 以光照算法的视角考虑的话,只有一件事决定物体的形状,这就是垂直于它的法线向量 砖块表面只有一个法线向 ...
- SwiftUI之深入解析高级动画的路径Paths
一.前言 本文将深入探讨一些创建 SwiftUI 动画的高级技术,讨论 Animatable 的协议,它可靠的伙伴 AnimatableData,强大但经常被忽略的 GeometryEffect 以及 ...
- animation动画不生效_SwiftUI动画(1)之Animatable
相信大家都已经对SwiftUI有了基本的了解,在SwiftUI写动画,相对来说变得更加简单了,接下来,会用3篇文章,带领大家一览SwiftUI动画的魅力. 1. 显式和隐式动画 在SwiftUI中有两 ...
最新文章
- python 参数个数 同名函数_如何在python中编写不同参数的同名方法
- 【转】 使用 AppFuse 快速构建 J2EE 应用
- 结构化异常捕获空指针异常
- cas 注销不关闭浏览器异常_上海公司经营异常注销麻烦吗
- java short 后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
- Linux sudoers文件的写法
- CABAC熵编码代码实现(H264)-FFMPEG
- supervisor、pm2、forever坐下来聊聊
- [转载] Python3入门精通基础教程(合集)
- 视频质量评价PSNR
- select样式调整
- paip.环境配置整合 ibatis mybatis proxool
- 更新sdk_即构ZegoLiveRoom SDK版本更新,新增多项功能及自定义设置
- 使用mono构建c#脚本运行环境
- torch/utils/cpp_extension.py raise RuntimeError(message) from e
- EMI测试——CE(传导干扰)测试
- python-qbittorrent库下载电影学习记录(含基本使用和常用函数)
- nginx反向代理到第三方服务商的服务器
- 我们的竞争对手在看向哪里---对勺海公众号的挖掘与细分
- 苹果 APNs 介绍