2013-02-14 194 views
4

我想把图像放到/包装到3D物体上。为了保持简单和快速,而不是使用(和学习)3D库,我想使用映射图像。映射图像,以这样的方式使用:如何生成纹理贴图图像?

mapping usage

所以,你为每个对象生成的映射图像一次,并使用相同的映射要换行的所有图像。

我的问题是如何生成这样的映射图像(给定三维模型)?由于我不知道术语,我的搜索失败了。对不起,如果我使用了错误的行话。

您可以在下面看到工作流程的说明。
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的重映射()的映射功能。

+2

downvoter:谨慎解释downvote的原因? – nimcap 2013-02-14 16:11:16

+0

我仍然不明白你想要完成什么。 :( – karlphillip 2013-02-14 16:24:16

+0

@karlphillip:我添加了一个描述性的图,我希望我的目标现在更清晰 – nimcap 2013-02-14 20:46:19

回答

1

如果我明白你在这里,你想在2D中做到这一切?

调用warpPerspective()为每个立方体表面会更加成功,比使用重映射()

伪轮廓:

// 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的保持这是围绕p 170.

警告的最后一句话,因为你抱怨文物, - 是的,它会看起来很俗气,“真正的”3D引擎在这里做很多工作,子像素-UV映射,过滤, mipmappin g等,如果你想让它看起来不错,请考虑使用'真实'的东西。

顺便说一句,有内置的OpenCV

+0

事情是我会使用任意3D模型而不是立方体,立方体只是为了展示这个想法。 – nimcap 2013-02-18 11:55:40

+1

哦,这些东西是由maya/blender等艺术家完成的,你可以自动化(甚至滥用2d api)考虑使用模型,已经有适当的uv coords和3d api,如opengl 。将会少得多的工作,我保证! – berak 2013-02-18 13:12:36

1

要达到什么样的你正在尝试做的很好的OpenGL支持,需要渲染的3D模型的UV到纹理。学习渲染3D会比通过这种方式做事更容易。特别是因为你的问题有很多弱点。难以照明和问题直到深度缓冲区将是丰富的。

假设所有对象shul以往只能从一个角度看,你需要他们每个人渲染到3个纹理:

UV-地图
普通地图
深度图(纠正深度缓冲区)

为了将这些看起来像你的对象,你仍然需要做阴影处理,而且我甚至不知道如何做深度缓冲区事情,我只知道它可以完成。

因此,为了避免学习3D,您将不得不学习3D渲染的所有困难部分。似乎没有更容易的路线...