在3D空间中旋转图像的一部分

时间:2010-12-14 04:03:03

标签: c# .net wpf gdi+ image-manipulation

这是设置:这是一个电子商务艺术网站,其中一些画作是画布转移。画作环绕画布的两侧和顶部和底部。我们有整个绘画的高分辨率图像,但我们想要显示的是图像的准3D表示,您可以在其中看到绘画的两侧如何围绕画布。这是我正在谈论的内容的粗略草图:

alt text

我的问题是,如何在3D空间中旋转图像?我认为我想采取的方法是切掉图像的顶部和侧面的一部分,然后在3D中旋转然后将其重新固定在顶部和侧面以使其具有3D外观。我该怎么做呢?它可以使用任何.Net技术(GDI +,WPF等)来完成。

4 个答案:

答案 0 :(得分:3)

在使用ViewPort3D类的WPF中,您可以创建一个8x5x1单位的长方体。将图像创建为纹理,然后使用纹理坐标将纹理应用于正面(8x5)和侧面(5x1)以及顶面和底面(8x1)。正面坐标应为:(1 / 9,1 / 6),(8 / 9,1 / 6),(1 / 9,5 / 6)和(8 / 9,5 / 6)正面,从最近的边到那些边的坐标,例如对于左侧:左侧是(0,1 / 6),(1 / 9,1 / 6),(0,5 / 6)和(1 / 9,5 / 6)。

编辑: 如果您希望能够在3D画布模型上执行旋转,可以按照以下建议操作: How can I do 3D transformation in WPF?

答案 1 :(得分:2)

看起来你不需要做真正的3D,但只需要假装它。

沿着图像的顶部,底部,左侧和右侧切掉四个条带。抛出底部和右边(按照问题中的草图)。缩放和剪切条带(我在.net / wpf上不够专业,知道如何,但它可以做到)。顶部将垂直缩放0.5倍(猜测 - 选择适合所需的最终3D外观图像)并水平剪切。结果作为画布的顶部合成到输出图像上。左侧条带将水平缩放并垂直剪切。

如果最终用户要以交互方式从不同角度查看3D画布,这种方法可能比渲染一个诚实的3D模型更快,这种模型必须进行纹理映射并将模型光栅化为最终图像,这相当于同样的数学。有趣的部分是弄清楚如何调整缩放和剪切参数。

此页面可能具有教育意义:http://www.idomaths.com/linear_transformation.php
这可能是有用的参考http://en.csharp-online.net/GDIplus_Graphics_Transformation%E2%80%94Image_Transformation

答案 2 :(得分:0)

我对这种东西没有任何经验。但是当我看到这个问题时,我想到的第一件事就是SO的有趣Unicornify

making ofbalpha文章中,他解释了如何在3d空间中旋转2d独角兽球体。

code是用python编写的。如果您有兴趣,可以查看一下。但我不确定这会对你有所帮助。

答案 3 :(得分:0)

蛮力方法(可能是最简单的方法)是将三个面中的每个面的u,v纹理坐标映射到表示画布三面的三个广告牌上(广告牌只是两个三角形一个矩形)。然后,使用矩阵变换旋转整个画布(所有三个广告牌)。多田!

或者,您可以使用变换而不是画布移动3空间相机位置。正如他们所说的那样,六分之一,另一半 -