【问题标题】:Getting the Tangent for a Object Space to Texture Space获取对象空间到纹理空间的切线
【发布时间】:2016-03-01 12:45:20
【问题描述】:

大学作业要求我使用顶点坐标,我必须根据法线值计算法线和切线,以便创建对象空间到纹理空间矩阵。

我有制作矩阵和副法线所需的代码,但我没有计算正切的代码。我试图在网上查找,但答案通常让我感到困惑。你能向我解释清楚它是如何工作的吗?

编辑:我已经更正了我之前写的内容,因为我清楚地误解了作业。谢谢大家帮助我看到这一点。

【问题讨论】:

  • “切线”是什么意思?一条线,还是一架飞机?你想如何表示切线?
  • 切线空间的切线不是你可以单独从法线贴图计算出来的。它是一个几何属性,取决于顶点位置和 uv 布局。
  • 我发现自己非常关心你的大学作业,因为正如你所说,这既是不可能的,也暴露了对切线空间法线映射如何工作的明显错误的理解。也许你误解了它的要求?
  • 我已经更正了我的问题,因为很明显我确实误解了作业。谢谢你指出来。
  • 表面是如何给出的?它是解析曲面,还是只是某种点网格?

标签: c++ opengl bump-mapping


【解决方案1】:

数学意义上的切线是几何对象的属性,而不是法线贴图的属性。在法线贴图的情况下,我们另外寻找一个非常具体的切线(每个点有无限多个,基本上由法线定义的平面中的每个向量都是一个切线)。

但是让我们退后一步:我们想要一个空间,其中纹理的 u 方向映射到切线方向,v 方向映射到双切线/副法线,法线贴图的上向量映射到物体。因此,具有 uv 坐标 (uv1, uv2, uv3) 的三角形 (v0, v1, v2) 的切线可以计算为:

dv1 = v1-v0
dv2 = v2-v0

duv1 = uv1-uv0
duv2 = uv2-uv0

r = 1.0f / (duv1.x * duv2.y - duv1.y * duv2.x);
tangent = (dv1 * duv2.y   - dv2 * duv1.y) * r;
bitangent = (dv2 * duv1.x   - dv1 * duv2.x) * r;

为所有三角形完成此操作后,我们必须平滑共享顶点处的切线(与法线的情况非常相似)。有几种算法可以做到这一点,具体取决于您的需要。例如,可以通过相邻三角形的表面积或它们的入射角来加权切线。

可以在 [此处] 找到整个计算的实现以及更详细的说明:(http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/)

【讨论】:

  • 我认为这里要指出的关键是切线/副切线是 mesh 的属性,而不是纹理的属性。这就是让大学作业变得奇怪的原因。
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2011-10-02
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多