为了跟进我的上一个问题,我现在在使用 tikz-3dplot 库时遇到以下问题。每次我使用“let”运算符时,变换矩阵似乎都会再次作用于坐标系,同时计算 \x1,\y1:
编辑代码
\documentclass[convert,border=.3cm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{positioning,calc}
\begin{document}
\tdplotsetmaincoords{0}{10}
\begin{tikzpicture}[tdplot_main_coords]
\foreach\x in {0,1,2}
\draw[gray,thin] (\x,-.3,0) -- ++(0,2.6,0);
\foreach\y in {0,1,2}
\draw[gray,thin] (-.3,\y,0) -- ++(2.6,0,0);
\coordinate (A) at (1,1);
\draw (0,0,0)--(1,1);
\path let \p1=(A) in coordinate (B) at (\x1*1pt/1cm,\y1*1pt/1cm,0);
\draw[red] (0,0,0)--(B);
\path let \p1=(A) in coordinate (C) at (\x1,\y1);
\draw[green] (2,0,0)--(C);
\foreach\x in {0,1,2}
\draw[gray,thin] (\x,-.3,0) -- ++(0,2.6,0);
\foreach\y in {0,1,2}
\draw[gray,thin] (-.3,\y,0) -- ++(2.6,0,0);
\end{tikzpicture}
\end{document}
在上面的例子中,\tdplotsetmaincoords{0}{10} 应该(并且确实)将坐标系绕 z 轴(原本垂直于屏幕)旋转 10 度
这种累积似乎不会影响 tikzpicture 中的任何其他元素,除了“let”中涉及的坐标。人们可以看到这一点,因为开始和结束处的两个“测试网格”完全对齐。
请注意,当我仅尝试 \tdplotsetmaincoords 的第一个输入(绕 x 轴旋转)或两者时,也会发生同样的效果。
答案1
在您的代码中,您计算屏幕上 3d 坐标的投影。也就是说,calc 语法返回二维的 x 和 y 分量屏幕坐标,不要将其与 3d 或主要的坐标,即通过调用 定义的坐标\tdplotsetmaincoords{...}{...}
。您可以利用这些 3d 坐标的投影来形成新的 3d 坐标的新 x 和 y 分量。
为了说明这一点,请考虑
\documentclass[convert,border=.3cm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{positioning,calc}
\begin{document}
\tdplotsetmaincoords{0}{10}
\begin{tikzpicture}[tdplot_main_coords]
\coordinate (A) at (1,1);
\path let \p1=(A),\n1={\x1*1pt/1cm},\n2={\y1*1pt/1cm} in (\n1,\n2,0) coordinate
(B);
\coordinate (C) at (1,1,0);
\begin{scope}[tdplot_screen_coords]
\coordinate (D) at (1,1);
\coordinate (E) at (1.16,0.81);
\end{scope}
\draw let \p1=(A),\n1={\x1*1pt/1cm},\n2={\y1*1pt/1cm} in (0,0,0)--
node[pos=0.95,above left,sloped] {\pgfmathsetmacro{\myx}{\n1}
\pgfmathsetmacro{\myy}{\n2}$A=(\pgfmathprintnumber{\myx},\pgfmathprintnumber{\myy})$}(A);
\draw[red] let \p1=(B),\n1={\x1*1pt/1cm},\n2={\y1*1pt/1cm} in
(0,0,0)-- node[pos=0.95,below left,sloped] {\pgfmathsetmacro{\myx}{\n1}
\pgfmathsetmacro{\myy}{\n2}$B=(\pgfmathprintnumber{\myx},\pgfmathprintnumber{\myy})$}(B);
\draw[blue] let \p1=(C),\n1={\x1*1pt/1cm},\n2={\y1*1pt/1cm} in (2,0,0)
-- node[pos=0.95,above right,sloped] {\pgfmathsetmacro{\myx}{\n1}
\pgfmathsetmacro{\myy}{\n2}$C=(\pgfmathprintnumber{\myx},\pgfmathprintnumber{\myy})$}(C);
\draw[green] let \p1=(D),\n1={\x1*1pt/1cm},\n2={\y1*1pt/1cm} in (2,2,0)
-- node[midway,above,sloped] {\pgfmathsetmacro{\myx}{\n1}
\pgfmathsetmacro{\myy}{\n2}$D=(\pgfmathprintnumber{\myx},\pgfmathprintnumber{\myy})$}(D);
\draw[orange] let \p1=(E),\n1={\x1*1pt/1cm},\n2={\y1*1pt/1cm} in (-2,2,0)
-- node[midway,above,sloped] {\pgfmathsetmacro{\myx}{\n1}
\pgfmathsetmacro{\myy}{\n2}$E=(\pgfmathprintnumber{\myx},\pgfmathprintnumber{\myy})$}(E);
\foreach\x in {0,1,2}
\draw[gray,thin] (\x,-.3,0) -- ++(0,2.6,0);
\foreach\y in {0,1,2}
\draw[gray,thin] (-.3,\y,0) -- ++(2.6,0,0);
\end{tikzpicture}
\end{document}
这里,
A
被定义为位于(1,1)
主坐标系中。它们对应于(1.16,0.81)
屏幕坐标系中。- 现在
(1.16,0.81)
用于定义B
,其中坐标在主坐标中具有其含义。所以你告诉 Ti钾主坐标中的B
Z位置。(1.16,0.81,0)
C
(1,1,0)
在主坐标中定义为。它与 重合A
。D
被定义为位于(1,1)
屏幕坐标中的 。它与之前的任何点都不重合,但角度DOA
和AOB
重合。这就是主动变换和被动变换之间的区别。E
被定义为位于(1.16,0.81)
屏幕坐标中,因此与A
和重合C
。
总的来说,重点是存在两个坐标系。主坐标系用于定义点,源自 3d 坐标的正交投影。然后是屏幕坐标系,即作品所用的坐标系calc
。
实际上,在您的 MWE 中还有一件事需要考虑。
\documentclass[convert,border=.3cm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{positioning,calc}
\begin{document}
\tdplotsetmaincoords{0}{10}
\begin{tikzpicture}[tdplot_main_coords]
\foreach\x in {0,1,2}
\draw[gray,thin] (\x,-.3,0) -- ++(0,2.6,0);
\foreach\y in {0,1,2}
\draw[gray,thin] (-.3,\y,0) -- ++(2.6,0,0);
\coordinate (A) at (1,1);
\draw (0,0,0)--(1,1);
\path let \p1=(A) in coordinate (B) at (\x1*1pt/1cm,\y1*1pt/1cm,0);
\draw[red] (0,0,0)--(B);
\path let \p1=(A) in coordinate (C) at (\x1,\y1);
\draw[green] (2,0,0)--(C);
\foreach\x in {0,1,2}
\draw[gray,thin] (\x,-.3,0) -- ++(0,2.6,0);
\foreach\y in {0,1,2}
\draw[gray,thin] (-.3,\y,0) -- ++(2.6,0,0);
\end{tikzpicture}
\end{document}
当您定义 时C
,您使用两个都有单位的组件来定义它。Ti钾Z 认为这些是屏幕坐标。为什么?因为这些只是一些维度坐标,而解析器就是这样处理的。另一方面,是的,这确实令人困惑,如果 Ti钾Z 看到一个有维度的 3d 坐标,它会剥离维度并将结果坐标置于主坐标系中。是的,这确实令人困惑。这种行为确实有点奇怪。这里尝试总结一下。
\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{|r|>{\centering\arraybackslash}p{5cm}|>{\centering\arraybackslash}p{5cm}|}
\hline
& dimensionful & dimensionless \\
\hline
2D & screen & main \\
3D & convert dimension to points, strip units off, and interpret the result in
main coordinate system & main\\
\hline
\end{tabular}
\end{document}
Ti 的维护者钾Z 实际上意识到了这一点,这次提交,它处理的是投影就是投影,并且意味着信息丢失的事实。
看这里寻找一种在 pgfkeys 中存储 3d 坐标的方法。