[3D基础]切空间推导原理(3)

本篇为3D基础的第3部分,主要讲述顶点切向量的计算原理,相信很多人都对Shader里的Tangent分量没有深入了解,希望我的这篇文章能对各位理解切空间有所帮助。我们以凹凸映射为例子来解释今天的原理。

实际上凹凸贴图中存储的发现扰动值实际上是以图中X Y为基的(对凹凸映射不太熟悉的请先参考其他相关文章)。所以需要一个转换将纹理坐标系转换到世界坐标系中,这个转换其实是一个基变换过程(参见3D基础2),说白了就是要找到纹理在世界空间中是如何摆的,纹理在方向的变化率如何。而要得到这点,需要计算得到U V轴分别对应到世界坐标系中的向量。如果纹理映射到三角形不时均匀的,Tangent向量和Binormal向量肯定不是正交的。已知:空间三角形3个顶点坐标分别为(Xa, Ya, Za)(Xb, Yb, Zb)(Xc, Yc, Zc),纹理坐标分别为(Sa, Ta)(Sb, Tb)(Sc, Tc),因此得:

条件:

纹理向量 ( (Sb - Sa), (Tb - Ta) ) => 世界向量 ( (Xb - Xa), (Yb - Ya), (Zb - Za) )

纹理向量 ( (Sc - Sa), (Tc - Ta) ) => 世界向量 ( (Xc - Xa), (Yc - Ya), (Zc - Za) )

需要求:

( 1, 0 ) => Tangent
( 0, 1 ) => Binormal

D表示三角形内任意一点: D - A = ( S - Sa ) * T + ( T - Ta ) * B,设

P = B - A
Q = C - A

( S1, T1 ) = ( (Sb - Sa), (Tb - Ta) )
( S2, T2 ) = ( (Sc - Sa), (Tc - Ta) )

| Px Py Pz |  | S1 T1 |  | Tx Ty Tz |
         =      *
| Qx Qy Qz |  | S2 T2 |  | Bx By Bz |

最后我们计算得到的T B N之间很有可能并不正交,这样严格意义上他们并不能直接用来进行基转换,但只要T B N之间夹角接近垂直就OK,在最终视觉上不会有太多影响,特别是在 T B 与N垂直的情况,毕竟只相当于将扰动NORMAL绕N小转个角度,一般先用Gram-Schmidt算法让TBN正交后再作处理:

T' = T - (N*T)N
B' = B - (N*B)N - (T'*B)T'
N' = N

提示:当基轴互相不正交的时候,Vx*x + Vy*y + Vz*z是不正确的切空间到世界空间表示,当为夹角为锐角时结果模会偏大,而且方向也是错误的,钝角结果模会偏小,方向也不对。

时间: 2024-09-22 03:41:30

[3D基础]切空间推导原理(3)的相关文章

[3D基础]3D游戏中的各种旋转与基变换(2)

终于开始着手写[3D基础]系列的第二篇文章了,这篇文章所将的内容相信对于很多人而言都是相当重要的,因为涉及到相机坐标系变换,BILLBOARD实现原理,凹凸映射切空间变换等课题.按以前的习惯,重要内容用红色字体标出,对于最基本的线性代数理论不作证明,使用DX左手坐标系. 第一个问题:UVN相机坐标变换形式与原理. 我们知道3D世界空间到相机空间坐标的转换是通过UVN矩阵来实现,运算格式如下: | Ux, Vx, Nx | | x, y, z | * | Uy, Vy, Ny | | Uz, Vz

搜索引擎工作的基础流程与原理

搜索引擎最重要的是什么?有人会说是查询结果的准确性,有人会说是查询结果的丰富性,但其实这些都不是搜索引擎最最致命的地方.对于搜索引擎来说,最最致命的是查询时间.试想一下,如果你在百度界面上查询一个关键词,结果需要5分钟才能将你的查询结果反馈给你,那结果必然是你很快的舍弃掉百度. 搜索引擎为了满足对速度苛刻的要求(现在商业的搜索引擎的查询时间单位都是微秒数量级的),所以采用缓存支持查询需求的方式,也就是说我们在查询搜索时所得到的结果并不是及时的,而是在其服务器已经缓存好了的结果.那么搜索引擎工作的

白帽SEO之搜索引擎工作的基础流程与原理

搜索引擎最重要的是什么?有人会说是查询结果的准确性有人会说是查询结果的丰富性但其实这些都不是搜索引擎最最致命的地方.对于搜索引擎来说最最致命的是查询时间.试想一下如果你在百度界面上查询一个关键词结果需要5分钟才能将你的查询结果反馈给你那结果必然是你很快的舍弃掉百度. 搜索引擎为了满足对速度苛刻的要求(现在商业的搜索引擎的查询时间单位都是微秒数量级的)所以采用缓存支持查询需求的方式也就是说我们在查询搜索时所得到的结果并不是及时的而是在其服务器已经缓存好了的结果.那么搜索引擎工作的大体流程是什么样子

《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

1.1 Unity 3D基础知识概览 Unity 3D 游戏开发技术详解与典型案例 本节主要向读者介绍Unity 3D的相关知识,主要内容包括Unity 3D的简介.Unity 3D的发展和Unity 3D的特点等.通过本节的学习,读者将对Unity 3D有一个基本的认识. 1.1.1 初识Unity 3D Unity 3D是由Unity Technologies开发的一个轻松创建三维视频游戏.建筑可视化.实时三维动画等互动内容的.多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎. Un

[3D基础]投影矩阵的推导(1)

转眼我做游戏行业已经八个月了,游戏行业入门门槛低,所以还算学习得比较轻松,总结了当初自己迷惑的几个知识点,本来想写出来给初学者解惑,无赖我是一个懒散的人,一直拖到现在,终于决心白纸黑字的搬到Blog上来,希望大家喜欢. 投影变换:我觉得这个是3D到2D变换中最让初学者头晕的问题,但又是最重要的. 请看上面这张我用爪子抓出来的图.这个坐标系是DX的左手坐标系,Y向上,X向右,Z向内,几何坐标已经经过了相机坐标系的变换,相机位置为(0,0,0),假设远裁减面距离为f,近裁减面距离为n,近裁减面左边为

Flash基础理论课 第十五章 3D基础 Ⅲ

返回"Flash基础理论课 - 目录" 缓动与弹性运动 在3D中的缓动与弹性运动不会比2D中的难多少(第八章的课题).我们只需要为z轴再加入一至两个变量. 缓动 对于缓动的介绍不算很多.在2D中,我们用tx和ty最为目标点.现在只需要再在z轴上加入tz.每帧计算物体每个轴到目标点的距离,并移动一段距离. 让我们来看一个简单的例子,让物体缓动运动到随机的目标点,到达该点后,再选出另一个目标并让物体移动过去.注意后面两个例子,我们又回到了 Ball3D 这个类上.以下是代码(可以在Easi

Flash基础理论课 第十五章 3D基础Ⅱ

返回"Flash基础理论课 - 目录" Z排序 在添加了多个物体后代码中显现出了一个新问题--称为z排序.Z排序就像它的名字一样:物体如何在z轴上进行排序,或者说哪个物体在前面.由于物体都使用纯色,所以看起来不是很明显.为了让效果更加明显,请将 Ball3D的 init方法改为以下代码,并运行刚才那个程序: public function init():void { graphics.lineStyle(0); graphics.beginFill(color); graphics.d

Flash基础理论课 第十五章 3D基础Ⅰ

返回"Flash基础理论课 - 目录" 前面我们做的一切都是二维的(有时只有一维),但是已经可以做出非常酷的东东了.现在,将它们带入到下一个等级. 创建 3D 图形总是那么另人兴奋.新加入的这个维度似乎将物体真正地带入到了生活中.如何在Flash 中实现 3D 在无数的书籍和教学软件中都有介绍.但是我不打算跳过这些内容,我们会很快地将所有基础的知识讲完.随后,将前面章节中讨论的运动效果放到三维空间中.说得详细些,将给大家介绍速度,加速度,摩擦力,反弹,屏幕环绕,缓动,弹性运动,坐标旋转

Flash/Flex学习笔记(49):3D基础

之前我们所做的动画都是基于x,y二维坐标轴的,在三维动画中我们还需要增加一个垂直于屏幕"向里"或"向外"的Z轴,那么z轴到底是应该向外,还是向里呢?这个其实无所谓,不过为了统一,习惯上通常把z轴约定为向里,即所谓的"右手坐标系" 右手坐标系的得名:伸出右手,让食指.中指.大拇指相互垂直:然后 食指指向x轴正向,中指指向y轴正向,则大拇指所指方向即为z轴正向.(事实上这个姿势酷似周杰伦周董的招牌动作) 三维透视的基本规则: 物体在Z轴上的坐标越大(