tikz-3dplot 每次使用 let 运算符时都会累积变换

tikz-3dplot 每次使用 let 运算符时都会累积变换

为了跟进我的上一个问题,我现在在使用 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}

在此处输入图片描述

这里,

  1. A被定义为位于(1,1)主坐标系中。它们对应于(1.16,0.81)屏幕坐标系中。
  2. 现在(1.16,0.81)用于定义B,其中坐标在主坐标中具有其含义。所以你告诉 Ti主坐标中的BZ位置。(1.16,0.81,0)
  3. C(1,1,0)在主坐标中定义为。它与 重合A
  4. D被定义为位于(1,1)屏幕坐标中的 。它与之前的任何点都不重合,但角度DOAAOB重合。这就是主动变换和被动变换之间的区别。
  5. 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,您使用两个都有单位的组件来定义它。TiZ 认为这些是屏幕坐标。为什么?因为这些只是一些维度坐标,而解析器就是这样处理的。另一方面,是的,这确实令人困惑,如果 TiZ 看到一个有维度的 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 坐标的方法。

相关内容