获取对象空间到纹理空间的切线
Getting the Tangent for a Object Space to Texture Space
大学作业要求我使用顶点坐标,我必须根据法线值计算法线和切线,以便我可以创建对象空间到纹理空间矩阵。
我有制作矩阵和双法线所需的代码,但我没有计算切线的代码。我试图在网上查找,但答案通常会让我感到困惑。你能清楚地向我解释它是如何工作的吗?
编辑:我已经纠正了我之前写的内容,因为显然我误解了作业。谢谢大家帮助我看到这一点。
数学意义上的切线是几何对象的属性,而不是法线贴图的属性。在法线映射的情况下,我们还要寻找一个非常具体的切线(每个点都有无限多个切线,基本上法线定义的平面中的每个向量都是切线)。
但是让我们退后一步:我们想要一个空间,其中纹理的 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/)
相关文章:
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- C 对象和名称空间
- 如何将图像的字节数组(取自 s3)转换为 C++ 或 C 中的图像/图像对象
- 当对象在屏幕空间中较小时,OpenGL 更新缓慢
- 由另一个对象重用对象的空间
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 加载地址 X 时,对于 Y 类型的对象没有足够的空间
- 将每个对象渲染到空间中,并在3D场景上渲染2D场景
- 声明方法时没有名称空间,也没有对C 作用的方法的对象
- 命名空间:不能在没有对象的情况下调用成员函数
- 命名空间、标头和对象的层次结构
- 由于命名空间而导致的对象实例化错误
- ITK中是否有表面构建函数,该函数返回一个容器管空间对象
- C++将类添加到命名空间以创建新的类对象
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 我的3D OpenGL对象围绕世界来源,而不是本地空间来源.我在做什么错或误会
- 不确定如何使用我的类和命名空间创建对象?c++
- 从命名空间返回对象是否安全
- 从堆空间删除对象
- 如何在 c++ 中返回一个本身在堆上分配了空间的对象