我偶然发现了PSTricks
位于
http://melusine.eu.org/syracuse/pstricks/pst-solides3d/animations/a43/ https://i.stack.imgur.com/NlqHZ.gif
并注意到它使用光源来为物体提供颜色/阴影。这可以从以下代码中看出:
http://melusine.eu.org/syracuse/pstricks/pst-solides3d/animations/a43/anim.tex
我的所有图片都是用 制作的,PGF
我希望以与上面动画中类似的方式使用光源PSTricks
。不幸的是,这在 中尚未实现PGF
。
是否可以对我的PGF
照片进行一些后期处理以获得光源效果?我正在考虑和PSTricks
,但似乎做不到。Asymptote
Adobe Illustrator
我认为如果我们能够利用光源来制作矢量图形图片那就太好PGF
了
答案1
唯一的障碍是 TeX。
Postscript 用于完成繁重的工作和线性代数,但我们无法依赖使用 PGF 的某个老大哥。最好的办法是找到一个能够理解 Z 缓冲区和固体反射的库,并在其他语言中调用它。
pgfplots
仅使用 TeX 还不知道这一点。即使这是可能的(我相信相反),编译最简单的情况也会花费大量时间,同样,即使忽略定点算法中的 TeX 不精确性。
关于原因的更全面的解释在这里根本区别:PSTricks、TikZ/PGF 等尤其是赫伯特的回答。
答案2
正如 @percusse 所回答的,TeX 是这里的障碍。我通过创建一个(粗略的)SAGE/python 脚本来避免使用 TeX,该脚本将拍摄已经三角化的 SAGE 3d 图片,并将其转换为 tikz 2d 多边形,并进行某种光/阴影计算。不过,您确实需要 SAGE 来创建 tikz 文件。
这是可在 github 上获取,以防您想尝试一下。
您只需编写几行 Python 脚本(从编辑器内部调用),该脚本采用如下 SAGE-python 代码片段(这是一个具有奇点的隐式曲面):
P=implicit_plot3d( x**3+y**2-z**2 ==0,(x,-2,2), (y,-2,2),(z,-2,2), plot_points=100)
P.triangulate()
Picture(P.face_list(), boxed=False, axes=True,
nodes=[{"Position": (0,0,0), "Text": "" ,
"Options": "circle, inner sep=4pt,black!80, pin={[pin edge={black!80, semithick}]-120:Singular point}, draw"}]
).render()
并生成如下独立文件:
\documentclass[border=1pt]{standalone}
....
\begin{document}
\begin{tikzpicture}[scale=25.361, line cap=round, line width=.1pt, line join=round, line cap=round]
\begin{pgfonlayer}{textLayer}
\node[circle, inner sep=4pt,black!80, pin={[pin edge={black!80, semithick}]-120:Singular point}, draw] at (0.000000,0.000000) {};
\end{pgfonlayer}
\filldraw[fColor=32] (-0.005352,-0.005537)--(-0.005287,-0.005489)--(-0.005163,-0.005353)--cycle;
\filldraw[fColor=32] (-0.004111,-0.004313)--(-0.005163,-0.005353)--(-0.005287,-0.005489)--cycle;
... lots more little polygons.
\end{tikzpicture}
\end{document}
当你用以下方式编译此文件时lualatex
(这很重要,大量的多边形需要大量的内存),你会得到类似
无论有哪些灯光/阴影,都内置于 Python 脚本中,所有与 3d、视图、投影、轴、坐标平移等相关的计算也都内置于其中。
优点:您会得到一张美丽的图像(这当然是一个品味问题)。
缺点:
您需要一些重型数学软件,在本例中是 SAGE。
您依赖外部脚本。您最好找一个具有外部脚本调用功能的优秀编辑器。
编译仍然很慢。你可能需要使用
tikz
的externalize
技巧。您依赖 lualatex 来编译大数字(外部化可以在一定程度上缓解这种情况)。
最后我只实现了一个白光源,一种前景色和一种背景色。
其他示例:
如果你对这个脚本感兴趣,你可以从 github 获取。