如何生成纹理映射图像?

5
我希望将图片放置/包裹在3D物体上。为了保持简单和快速,而不是使用(并学习)3D库,我想使用映射图像。映射图像的使用方式如下:

mapping usage

每个对象只需生成一次映射图像,然后将相同的映射用于您想要包装的所有图像。
我的问题是如何生成这些映射图像(给定3D模型)?由于我不了解术语,我的搜索没有成功。如果我使用了错误的行话,很抱歉。
下面是工作流程的描述。
enter image description here
我有对象的3D模型和输入图像,我想生成映射图像,以便我可以生成纹理图像。
我甚至不知道从哪里开始,非常感谢任何提示。
更多信息
我的最初想法是使用外部程序来包裹身份映射(见下文)。我在Photoshop中生成了水平和垂直梯度图像,只是为了看看是否可以使用使用Photoshop生成的图像进行映射。结果看起来并不好。我并不抱希望,但还是值得一试的。
输入
enter image description here 映射(x和y),它们只是调整图像大小,没有任何花哨的东西。
enter image description here enter image description here 结果
enter image description here
正如您所看到的,有很多伪影。我通过扭曲梯度生成的自定义映射图像看起来更糟。
这里有关于映射的更多信息: http://www.imagemagick.org/Usage/mapping/#distortion_maps 我正在使用OpenCV remap()函数进行映射。

2
给给我点踩的人:能解释一下为什么要踩吗? - nimcap
@karlphillip:我添加了一个描述性的图像,希望现在我的目标更加清晰。 - nimcap
1
@nimcap,你要找的术语是UV映射。 - mmgp
1
@mmgp:是的,我知道。我想要实现的是一步完成2D到2D的映射,而不是2D->3D->2D。UV映射是我正在寻找的一半术语。 - nimcap
1
我曾经遇到过类似的问题(至少在某种程度上是相似的)。我需要编写一个应用程序,通过在图像和模型中选择相同的点来将图像投影到模型上,并创建其uvmap模型。最终我的解决方案基本上是一个被摧残的方案。我选择使用obj格式,所以我随机地(实际上是按面积排序)在图像文件上绘制所有三角形轮廓,通过obj格式进行映射,然后使用类似的映射技术在所需的图像上绘制。我不得不完全不使用自定义库。祝你好运 :) - elasticrash
显示剩余5条评论
2个回答

1
如果我理解你的意思正确,你希望所有内容都是2D的?
对于每个立方体表面调用warpPerspective()要比使用remap()更成功。
伪代码概述:
// for each surface:
//  get the desired src and dst polygon
//  the src one is your texture-image, so that's:
     vector<Point> p_src(4), p_dst(4); 
     p_src[0] = Point(0,0); 
     p_src[1] = Point(0,src.rows-1); 
     p_src[2] = Point(src.cols-1,0);
     p_src[3] = Point(src.cols-1,src.rows-1);
// the dst poly is the one you want textured, a 3d->2d projection of the cube surface.
// sorry, you've got to do that on your own ;(
// let's say, you've come up with this for the cube - top:
     p_dst[0] = Point(15,15); 
     p_dst[1] = Point(44,19); 
     p_dst[2] = Point(56,30);
     p_dst[3] = Point(33,44);

// now you need the projection matrix to transform from one to another:
Mat proj = getPerspectiveTransform( p_src, p_dst );

// finally, you can warp your texture to the dst-polygon:
warpPerspective(src, dst, proj, dst.size());

如果你能得到《学习OpenCV》这本书,它在第170页左右有描述。
最后警告一句,因为你抱怨了伪影,是的,它看起来会很俗气,“真正”的3D引擎在这里做了很多工作,亚像素UV映射、滤波、mipmapping等。如果你想让它看起来漂亮,考虑使用“真正”的东西。
顺便说一下,OpenCV内置了不错的OpenGL支持。

事实上,我将使用任意的3D模型而不是立方体,立方体只是为了演示这个想法。 - nimcap
1
哦,那些东西都是由Maya/Blender等艺术家完成的,很不可能自动化(甚至滥用2D API)。考虑使用已经带有正确UV坐标和3D API(例如OpenGL)的模型,这将会更少的工作量,我保证! - berak

1
为了实现你想做的事情,你需要将3D模型UV渲染到纹理上。学习渲染3D比这种方法更容易,特别是因为您的方法存在许多弱点,如光照困难和深度缓冲区问题会很多。
假设您的所有对象都只能从一个角度查看,您需要将每个对象渲染到3个纹理中:
UV映射 法线贴图 深度图(用于修正深度缓冲区)
您仍然需要进行着色以使它们看起来像您的对象,我甚至不知道如何处理深度缓冲区,我只知道它可以完成。
因此,为了避免学习3D,您将不得不学习3D渲染的所有困难部分。这似乎不是更容易的路线...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接