答案1
我想说,这在某种程度上是可能的,但与专业的 3D 绘图套件相比,它需要手动完成很多工作,而 3D 软件会自动处理这些工作。
以我的论文中完全绘制的以下图片为例TikZ
:tikz-3dplot
为了说明您必须考虑的事情,让我们看一下您在问题中发布的示例图像以及面临的挑战:
TikZ
没有本机机制来存储是(图像深度)对象的位置,即确定一个对象是在另一个对象的前面还是后面。基本上,它只是将源代码中后面的内容绘制在先前绘制的内容之上。但是,它确实知道图层的概念。您可以定义多个图层及其是顺序,如果你将元素分配给某个层,即使它位于源代码的后面,也可以在其他东西后面绘制。这在只有基本元素的情况下就足够了是需要复杂性(如您的示例图所示)。- 虽然无法全局引入光照条件,但您可以在一定程度上模拟此类条件,方法是为图形元素赋予某种样式,以模拟特定照明角度下的 3D 对象。不过,您大多必须自己设计该样式(包括 3D 外观),并为正确的对象设计正确的样式,例如,为应该在另一个对象的阴影中的对象设计较暗的样式。
- 即使您对绘画的空间方向和关系有非常好的想象力,您仍然需要进行大量的反复试验,直到将所有东西放到正确的位置、图层和样式。
- 后一点的结果是,通过这种方式创建的图像相当静态。3D 绘图软件中已知的选项是自由旋转对象或视口,以便从不同角度和/或在不同照明条件下查看它,但实际上并没有提供。如果您从上面获取我的示例图像,我可以在任何方向上将投影改变不到 5 度左右,而不会破坏 3D 外观。如果我想进一步旋转它,整个图形排列就会崩溃,需要进行一些重大的代码更改才能让它在新的视角下再次工作。
因此可以得出结论:对于具有有限是复杂性,但它需要手工完成很多事情,你必须进行大量的反复试验才能把所有事情都做对。结果看起来差不多,但它不会提供相同的选项和舒适度来快速修改它并加入新元素或更改绘图视角。
答案2
为了跟进我的评论,POV-射线(与 LaTeX 无关)是一款出色的免费光线追踪器,可用于创建照片级逼真的图像。除了阴影,它还可以处理透明度和反射。输出为光栅,但您可以选择分辨率。
#include "colors.inc"
#include "textures.inc"
camera
{
location <17,17,-30>
look_at <0,1,1>
up x
sky <1,0,0>
angle 6
}
light_source { <30,50,-30> color White }
background { color Black }
#declare sphereRad = 0.5;
#declare cylinderRad = 0.1;
sphere { < 0,0,2>, sphereRad texture { Ruby_Glass } }
sphere { < 0,2,2>, sphereRad texture { Bright_Bronze } }
sphere { < 0,0,0>, sphereRad texture { Yellow_Pine scale <5,5,5> } }
sphere { < 0,2,0>, sphereRad pigment { Red } }
cylinder { <0,0,0>, <0,2,0>, cylinderRad pigment { White } }
cylinder { <0,2,0>, <0,2,2>, cylinderRad pigment { White } }
cylinder { <0,2,2>, <0,0,2>, cylinderRad pigment { White } }
cylinder { <0,0,2>, <0,0,0>, cylinderRad pigment { White } }
答案3
一种不是纯 TikZ 但可以与它和 LaTeX 很好地集成的解决方案是使用 Sketch for Latex (http://www.frontiernet.net/~eugene.ressler/)。下面的图片是从手册中复制的。
工作流程如下:
- 使用 Sketch for LaTeX 场景描述语言创建文本文件。
- 使用提供的解释器将文本文件编译成带有 TikZ 图片的 tex 文件(不要忘记包含指令
global { language tikz }
)。 - 将 tex 文件包含到您的 LaTeX 文档中。
这种方法的优点:
- 网格定位非常精确
- 定义几何图形后,只需对代码进行很少的修改,就可以从任何方向进行渲染。
- 扫描曲面和层次结构相对容易定义。
- 支持透视投影。
- 您可以包含文件,以便您可以创建自己的形状库并重复使用它们。
与 TikZ 完美集成:
- 您可以使用和重新使用 TikZ 样式(例如,与文档中的其他图形保持一致)。
- 您可以根据 3-D 几何定义 TikZ 坐标(这很有用,例如,包含指向图形特定部分的箭头)。
- 您可以包括半透明的表面。
- 完全矢量输出(因为它编译为 TikZ),所以没有分辨率问题。
这种方法的缺点:
- 当你想改变一个图形时,你需要编译两个文件(Skecth 文件和 LaTeX 文件)。这使得重复的小调整变成了一件苦差事(尤其是调整最终的视角)。
- 没有灯光、阴影、纹理或任何光线追踪效果(如果需要,则需要 POV-Ray 或其他“真实” 3-D 建模软件)。
- 语言中不直接支持“函数”(即,可以使用不同参数包含的网格)。这可以通过包含文件、常量定义和范围规则的使用来实现。
- 学习曲线陡峭(在复杂性方面与 TikZ 有些相似,尽管 Sketch 语言比 TikZ 小得多)。
- 复杂、自由形式的网格非常棘手;从技术上讲这是可行的,但您需要手动逐个多边形地定义它们,或者使用插件blend2sketch从 Blender 导出(仅限 2.4 版,不是最新版本)。精细细节也可能会在最终 LaTeX 输出中产生瑕疵。