5

我想将图像放置/包装到 3D 对象。为了让事情变得简单和快速,我不想使用(和学习)3D 库,而是使用映射图像。映射图像的使用方式如下:

映射使用

因此,您为每个对象生成一次映射图像,并为要包装的所有图像使用相同的映射。

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

您可以在下面看到工作流程的描述。
在此处输入图像描述
我有对象和输入图像的 3D 模型,我想生成可用于生成纹理图像的映射图像。

我什至不知道从哪里开始,任何指针表示赞赏。

更多信息

我最初的想法是使用外部程序以某种方式包装身份映射(见下文)。我在 Photoshop 中生成了水平和垂直渐变图像,只是为了查看映射是否使用 Photoshop 生成的图像。结果看起来不太好。我不抱希望,但值得一试。

输入
在此处输入图像描述

映射(x 和 y),他们只是调整图像的大小,他们没有做任何花哨的事情。
在此处输入图像描述 在此处输入图像描述

结果
在此处输入图像描述
如您所见,有很多工件。我通过扭曲渐变生成的自定义映射图像看起来更糟。

以下是有关映射的更多信息:http ://www.imagemagick.org/Usage/mapping/#distortion_maps

我正在使用 OpenCV remap() 函数进行映射。

4

2 回答 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());

如果你能拿到“Learning Opencv”这本书,它在第 170 页左右被描述。

最后的警告,因为你在抱怨人工制品, - 是的,这一切看起来都很俗气,“真正的” 3d 引擎在这里做了很多工作,亚像素 - uv 映射、过滤、mipmapping 等,如果你想要的话看起来不错,考虑使用“真实”的东西。

顺便说一句,opencv 内置了很好的 opengl 支持

于 2013-02-18T10:11:17.763 回答
1

为了实现您想要做的事情,您需要将 3D 模型 UV 渲染为纹理。学习渲染 3D 比用这种方法更容易。特别是因为你的方法有很多弱点。在深度缓冲区充足之前难以照明和问题。

假设您的所有对象都只能从一个角度查看,您需要将它们中的每一个渲染为 3 个纹理:

UV-map
Normal-map
Depth-map(校正深度缓冲)

您仍然需要进行着色才能将它们绘制成看起来像您的对象,而且我什至不知道如何做深度缓冲区的事情,我只知道可以做到。

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

于 2013-02-25T08:47:03.183 回答