使用Mathematica中的图形功能,在三维空间中显示多个二维图。

7
考虑以下内容:
lalist = {{{{1, 1}, 1}, {{3, 3}, 1}, {{5, 5}, 1}},
          {{{1, 5}, 1}, {{3, 3}, 1}, {{5, 1}, 1}}}

enter image description here

Row[{
  Graphics[{
            Opacity[0.5],Red, 
            Disk @@@ lalist[[1]]}, 
            Frame -> True],
  Graphics[{
            Opacity[0.5],Blue, 
            Disk @@@ lalist[[2]]}, 
            Frame -> True]}
    ]

enter image description here

  • 我能否在3D图中将蓝色圆盘“放在”红色圆盘的后面呢?

以下内容不是我所需要的:

enter image description here

3个回答

10

像这样吗?

Graphics3D[{{Texture[
 Graphics[{Opacity[0.5], Blue, Disk @@@ lalist[[2]]}, 
  Frame -> True]], 
 Polygon[{{-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}, {Texture[
 Graphics[{Opacity[0.5], Red, Disk @@@ lalist[[1]]}, 
  Frame -> True]], 
Polygon[{{-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}}, Lighting \[Rule] "Neutral"]

在此输入图片描述

有很多带透明度为0.2的元素:

tab = Table[{Opacity \[Rule] .2, 
Texture[Graphics[{Opacity[0.5], Blue, Disk @@@ lalist[[2]]}, 
  Frame -> True]], 
Polygon[{{-1, -1, z}, {1, -1, z}, {1, 1, z}, {-1, 1, z}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}, {z, -2, 2, 1}];
plt = Graphics3D[{tab}, Lighting \[Rule] "Neutral"]

在此输入图片描述

而400和500似乎在速度方面不是什么问题(您可以轻松修改上面的代码进行查看)。

编辑:好吧,只为了搞笑,试试这个:

Dynamic[Graphics3D[{{Texture[#], 
  Polygon[{{-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}, 
   VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
      1}}]}, {Texture[Rotate[#, \[Pi]/2]], 
  Polygon[{{-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}, 
   VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
      1}}]}}, Lighting \[Rule] "Neutral"] &@Binarize[CurrentImage[]]]

这提供了(或类似于此)可旋转、实时更新等功能。

输入图像描述


@acl,抱歉,我有那个,但我真的想要一个3D图。我该如何更好地表达我的问题? - 500
@acl,你认为它能处理400个吗? :) - 500
@acli!谢谢!我该如何使它透明,以便我们只看到形状?但是如果你看一个,你就看不到它后面的另一个了? - 500
@acl,太棒了!给我很多可以尝试的东西! - 500
@acli 这可能是一个图形驱动程序问题,但我没有以同样的方式得到你最新的图像。我得到了一个有四个空层的塔。删除 Opacity \[Rule] .2 部分可以让我恢复四个层级,但它们不透明。我之前在 Texture 文档中的透明度示例中遇到过这个问题,但更新了驱动程序后它们就可以工作了。我一直在尝试它们,但现在它们不起作用了。就像我的驱动程序已经恢复到原始状态一样。奇怪... - Sjoerd C. de Vries
@acl,先生,我没有注意到您最新的代码,我只是以为它是一张图片。我刚刚花了30分钟来玩它。非常感谢您。 - 500

9

4
使用透明纹理来渲染这些圆形图层就像ACL所做的那样是一个不错的解决方案,除非想要与生成的3D对象进行交互。包含透明元素的3D对象的渲染是在软件中完成的,否则将在硬件中完成
引用:

3D渲染器使用两种不同的多边形排序方法。对于不包括透明度的图形场景,使用硬件加速深度缓冲区。否则,渲染器使用二进制空间分割树从任何视点拆分和排序多边形。BSP树创建速度较慢,不支持硬件加速,但它提供了最通用的支持多边形的能力。

在我的笔记本电脑上,只要出现透明物体,与3D图形的交互就会变得非常缓慢。

解决方案是使用3D磁盘而不是带有2D磁盘的半透明平面。由于MMA没有3D的“Disk”或“Circle”,如果您想要做这样的事情,您需要自己编写。一个基本版本可能是:
myDisk[{x_, y_, z_}, r_] := 
 Polygon@Table[
               {x, y, z} + r {Cos[\[Phi]], Sin[\[Phi]], 0} // N,
               {\[Phi], 0, 2 \[Pi], 2 \[Pi]/200}
              ]

然后,您的图层将生成如下:

Graphics3D[
 {
   EdgeForm[],
  {
   Red, 
   myDisk[{1, 1, 0.5}, 0.5],  
   myDisk[{0, 0, 0.5}, 0.5],   
   myDisk[{-1, -1, 0.5}, 0.5]
  },
  {
   Blue,  
   myDisk[{1, -1, -0.5}, 0.5],
   myDisk[{0, 0, -0.5}, -0.5], 
   myDisk[{-1, 1, -0.5}, 0.5]}
  }
 ]

enter image description here


啊,但是我的多边形上有我的脸! - acl
@ACL,是的,我也试过你的代码。它可以生成一些看起来像罪犯的、难以辨认的肖像。非常适合做头像。(顺便问一下,你穿高领毛衣和留胡子吗?) - Sjoerd C. de Vries
无论如何,你是正确的,“不透明度”即使在我的MacBook上,由于它那可怜的图形处理器也会减缓速度。 - acl
@acl 我在博士毕业前的那一年也有一个。这让人想知道其他人(没看到太多女生)都做了什么。 - Sjoerd C. de Vries
@sjoerd 当然,当你拿到博士学位时,我才刚开始上学 :) 顺便说一下,我在ITF乌得勒支待了两年(去年离开)。有趣,不是吗? - acl
显示剩余3条评论

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