`
absolute
  • 浏览: 190565 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

计算三角形网格的tangent space

    博客分类:
  • CG
阅读更多

 

     又一篇学习笔记,参考Mathematics for 3D Game Programming and Computer Graphics和ShaderX4上一篇关于tangent space计算的文章写的东西。对于计算时需要分裂顶点的内容看的还不是太清楚-_-b。另外,目前的算法还不能完美处理镜像或者在纹理不连续处可能出现的问题,就算在Farcry中,很多问题也是通过美工来“隐藏”的,再一次应证了之前对美工重要性的结论^^。

 

 

 

 

 算法:

      Tangent spaceBump Map中有着重要作用,通常需要把灯光转换到tangent space进行计算。对由参数方程计算出的规则曲面(比如,球体,圆环)来说,很容易通过方程计算出tangent space,但对任意的三角形网格来说,则没有那么简单。

Tangent space是一个三维空间。对3D空间中的一个顶点来说,切空间的三条座标轴分别对应该点的法线N,切线T,和副法线(binormalB,显然,对不同的顶点来说,切空间是不同的。那么在已知三角形三个顶点及其纹理坐标的时候,如何计算出NTB呢?

目前已知的数据有三角形的三个顶点在世界坐标中的位置: P0, P1,P2, 以及相应的纹理坐标在纹理空间中的位置C0 (U0,V0)C1C2,则有:

 

P10 = P1 – P0

P­20 = P2 - P1 ,

C10 = C1 – C0 = (U1-U0, V1-V0) = ( U10 ,V10)

C20 = C2 – C0.= (U2-U0, V2-V0) = ( U20 ,V20)

 

注意,P10在世界坐标中的方向和C10在纹理空间中的方向是一致的(这一点确实比较抽象,偶画图研究了好久才弄明白-_-),同样,20C20也是如此,发现这一点很重要,可以说是整个计算的基石。进一步来说,TB分别和纹理坐标轴UV是平行的。因此我们有:

 

P10 = U10T + V10B

P­20 = U20T + V20B

把矢量展开得到:

 

两边乘以[C10 C20]的逆矩阵,最后得到

 

法线N = T x B

这样我们就得到了坐标从切空间转变到世界坐标下的变换矩阵M = [ T B N ],当然,更加常用的是M的逆矩阵。注意,这里计算得出的只是面法线,如果需要计算每个顶点的法线,则应该对共享该顶点的多个面的法线取均值,求出结果。

 

实现:

 

 

 

 

 

 

 ogre calculate tangent:

Vector3 Math::calculateTangentSpaceVector(
 const Vector3& position1, const Vector3& position2, const Vector3& position3,
 Real u1, Real v1, Real u2, Real v2, Real u3, Real v3)
 {
   //side0 is the vector along one side of the triangle of vertices passed in,
   //and side1 is the vector along another side. Taking the cross product of these returns the normal.
   Vector3 side0 = position1 - position2;
   Vector3 side1 = position3 - position1;
   //Calculate face normal
   Vector3 normal = side1.crossProduct(side0);
   normal.normalise();
   //Now we use a formula to calculate the tangent.
   Real deltaV0 = v1 - v2;
   Real deltaV1 = v3 - v1;
   Vector3 tangent = deltaV1 * side0 - deltaV0 * side1;
   tangent.normalise();
   //Calculate binormal
   Real deltaU0 = u1 - u2;
   Real deltaU1 = u3 - u1;
   Vector3 binormal = deltaU1 * side0 - deltaU0 * side1;
   binormal.normalise();
   //Now, we take the cross product of the tangents to get a vector which
   //should point in the same direction as our normal calculated above.
   //If it points in the opposite direction (the dot product between the normals is less than zero),
   //then we need to reverse the s and t tangents.
   //This is because the triangle has been mirrored when going from tangent space to object space.
   //reverse tangents if necessary
   Vector3 tangentCross = tangent.crossProduct(binormal);
   if (tangentCross.dotProduct(normal) < 0.0f)
   {
     tangent = -tangent;
     binormal = -binormal;
   }

 return tangent;

 }

分享到:
评论
1 楼 AdrainZhao 2011-07-04  
normal map应用。

相关推荐

    Tangent免费.rar

    Tangent插件是专门为OriginLab设计的一款扩展工具,其主要功能是帮助用户进行数据的斜率计算和分析。在科学研究中,数据的斜率往往代表了变化趋势或反应速率,因此,该插件对于理解和解释实验结果至关重要。通过...

    ltsa.rar_K-manifold_Local Tangent Space_The First_ltsa_manifold

    It computes the tangent space at every point by computing the d-first principal components in each local neighborhood. It then optimizes to find an embedding that aligns the tangent spaces.

    Tangent压缩包.rar

    手动选择时,只需在图上单击曲线上的目标点,系统将自动计算并显示该点的切线。 5. 插件会显示出切线的斜率(即导数值),以及可能的y轴截距。这些信息可以进一步用于数据分析,例如确定反应速率、求解方程等。 6. ...

    Tangent.rar

    在IT领域,"Tangent"一词经常与数学、图形计算和编程相关联。在这个上下文中,"Tangent.rar"可能是指一个包含有关切线计算或相关软件开发资源的压缩文件。"Tangent"通常指的是几何学中的切线,它是与曲线在某一点...

    Tangent.opx

    tangent,用于origin中做某一点切线,非常使用的一个小插件,1M不到。为大家助力科研,只需要2积分就可以下载啦,感恩!!!!

    Multi-View Azimuth Stereo via Tangent Space Consistency.pdf

    多视图立体三维重建MVS论文

    TTM方法生成翼型网格MATLAB程序.rar_MATLAB ttm_TTM 网格_matlab 机翼_机翼网格_翼型

    TTM(Tangential Tangent Mapping)方法是一种用于生成复杂几何形状,如机翼翼型的网格划分技术。在计算流体力学(CFD)中,高质量的网格是确保数值模拟精度的关键因素。TTM方法因其高效性和灵活性,被广泛应用于...

    qiexian.zip_lisp_tangent line_切线

    本文将深入探讨"qiexian.zip_lisp_tangent line_切线"这个主题,重点在于如何使用LISP语言来实现两个圆的共切线计算。 首先,我们需要理解"切线"的基本概念。在几何学中,切线是指与曲线在某一点相切的直线,这个点...

    网格搜索法--求公切线算法

    算法的核心可能是通过遍历每个参数网格点,计算每条可能的切线,并检查这些切线是否同时满足两条曲线的切线条件。 "a common tangent .nb"则可能是一个Mathematica笔记本文件,其中包含了解释、示例、图形以及实际...

    tangent origin插件

    origin插件,辅助曲线画切线工具 双击线上点即可

    初中数学解直角三角形测试题(卷).doc

    14. 等腰三角形的高和余弦值的计算,体现了等腰三角形的性质。 15. 通过面积计算,结合梯形的面积公式,来解决实际问题。 解答题部分: 16. 和17. 可能涉及到特殊角度的三角函数值或通过作图和三角形相似来求解。 ...

    Origin斜率计算插件

    【Origin斜率计算插件】是专为Origin 8.0设计的一款实用工具,它能够帮助用户快速、准确地计算数据曲线的斜率。Origin是一款强大的科学数据分析和图形绘制软件,广泛应用于科研和工程领域。斜率计算在科学研究中至关...

    2018年秋九年级数学上册第23章解直角三角形23.2解直角三角形及其应用第3课时方向角问题同步练习新版沪科版201808111

    在直角三角形的方向角问题中,一个典型的例子是使用余弦定理计算海轮的航行距离。比如,海轮从北偏东55度航行至正南方向,我们可以通过余弦公式AB = AP * cosA来计算航行距离。这里,AP是已知的航行前距离,A是航向...

    chengxu_道路曲线要素计算_中线_

    - **直线段(Tangent)**: 直线段连接曲线,提供稳定行驶的路径。直线段的长度需满足视距、行车速度等因素的要求。 **2. 中线计算** 道路中线是道路设计的基础,它定义了道路的几何中心线。中线计算包括: - **...

    THUSC2017-Tangent.pdf

    THUSC2017-Tangent

    tangent circles draw.py

    tangent circles draw.py

    修正的经纬度球面面积计算

    3. **面积计算**:对于每个三角形片段,根据球面角计算出其对应的球面面积,并累加得到整个多边形的面积。 #### 五、代码实现细节 在提供的代码片段中,作者通过具体的数学公式实现了上述算法流程。值得注意的是,...

    (完整版)人教版九年级数学下册28.2.1解直角三角形教案.pdf

    本文件是一份关于九年级数学下册解直角三角形的教案,根据人教版的教材进行编写,课程内容涉及直角三角形的性质以及解三角形的基本方法。 知识点一:直角三角形的性质 直角三角形是具有一个90度角的三角形,其在...

    Design of Tangent Vector Fields

    内含Design of Tangent Vector Fields论文 自己实现的代码, 对论文的解释PPT 代码介绍: VS2005 写的,用IBFV显示,可以读入三维Obj模型。 需要安装taucs库,及openGL. 三个月前写的,现在忙,没时间详细描述。 ...

Global site tag (gtag.js) - Google Analytics