【问题标题】:Rotating part of an image in 3D space在 3D 空间中旋转图像的一部分
【发布时间】:2010-12-14 04:03:03
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    在使用 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?

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

        我对这类东西没有任何经验。但是当我看到这个问题时,我首先想到的是有趣的Unicornify for SO。

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 这听起来像是在重新发明轮子。我确信有一些 API 可以让我在 3D 中旋转图像,尤其是使用 WPF....
          猜你喜欢
          • 2020-11-06
          • 1970-01-01
          • 1970-01-01
          • 2018-03-30
          • 1970-01-01
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多