手动使用圆柱体中间表面进行纹理映射
Posted
技术标签:
【中文标题】手动使用圆柱体中间表面进行纹理映射【英文标题】:Texture mapping with cylinder intermediate surface manually 【发布时间】:2013-04-14 17:20:25 【问题描述】:我正在为一个班级项目进行扫描线渲染。渲染器到目前为止工作,它读取模型(主要使用 utah 茶壶),计算顶点/表面法线,并且可以进行平面和 phong 着色。我现在正在添加纹理映射,这是我遇到问题的地方(除了在屏幕上实际绘制点之外,我不能使用任何 OpenGL 方法)。
因此,我将纹理读入我的应用程序并拥有一个 RGB 值的二维数组。我知道这个概念是将纹理从 2D 纹理空间映射到一个简单的 3D 对象(在我的例子中是一个圆柱体)。然后我现在您将中间表面映射到对象表面上。
但是,我实际上并不知道如何做这些事情 :)。我找到了一些将纹理映射到圆柱体的公式,但它们似乎总是遗漏了诸如要使用的值之类的细节。然后我也不知道如何获取对象的顶点坐标并获取该点的圆柱值。还有其他一些关于映射到圆柱体的 *** 帖子,但它们 1)使用着色器等处理较新的 OpenGL,以及 2)不处理中间表面,所以我不确定如何从它们中翻译知识。
因此,对于使用圆柱体作为中间表面将纹理映射到 3D 对象的伪代码的任何帮助将不胜感激。
【问题讨论】:
纹理映射不适用于“中间表面”。从技术上讲,纹理定义了插值函数的采样点,并且根据纹理坐标沿原始光栅化器对插值函数进行采样。纹理坐标是明确给出的,或者是从顶点位置计算出来的。我知道这不是一个非常令人满意的答案,因此我将其写为评论。 【参考方案1】:你一直在使用“中间表面”这个词,它没有正确描述这个过程,但却暗示了你的想法。
基本上,您需要一种将茶壶表面上的每个点映射到圆柱体上的方法(假设纹理将“包裹”在圆柱体上)。
只需将您的表面点转换为圆柱坐标(r、theta、height),然后使用 theta作为 u
和 height 作为 v
(texcoords)。
这是您想要实现的目标:
【讨论】:
我以为我已经解决了这个问题,但继续绕圈子(坏笑话)。那么我如何将表面点实际转换为圆柱坐标呢?不确定x,y,z
点如何转换为r, theta, and height
。
我无法在此评论中格式化和排版该数学。对于converting from Cartesian to Cylindrical coordinates 的实际数学,我必须将您推荐给***。查看“坐标系转换”部分。具体来说,使用 arcsin 的公式(在 math.h 中是 asin)。以上是关于手动使用圆柱体中间表面进行纹理映射的主要内容,如果未能解决你的问题,请参考以下文章