Problem
我想问题源于这样一个事实:每当一个人指定一个观察方向人们通常认为该值是相机正在观察的空间中的一个点。错误的!例如,指定 LookPosition 等于 0,0,0 并不意味着相机正朝着原点看,正如一些早期评论所暗示的那样。
Solution
解决方案就在于“LookDirection”这个词本身:它提到了“方向”。现在,虽然人们指定的方式观察位置在 XAML 中与Position使用三个逗号分隔的有序数字指定相机的编号,这些数字在两种情况下表示不同的含义。 位置属于类型Point3D而 LookDirection 的类型为Vector3D。因此,当输入值时观察方向,实际上指定了一个向量。不是重点。
无需过多讨论矢量细节,有必要提及的是,我们在这里讨论的矢量是欧几里得矢量,其特征为幅度和方向。如果向量由三个逗号分隔的有序数字(三元组)定义,则该向量称为坐标向量。这样的坐标向量总是意味着存在一个基和一个origin正是这个原点对于找到相机观察的方向非常重要。
要了解相机的瞄准目标(以及为什么您可能看不到您想看到的东西),请遵循以下简单步骤:想象自己站在原点 (0,0,0),同时看向由观察方向。摄像机虽然位于另一个点,但也正在观察这个方向。
在下图中,一个对象(盒子)位于原点。这Position我们的相机设置为(-2,1,2)。问: 应该做什么观察方向设置为以便在我们的屏幕上看到该框?假设您站在 (0,0,0) 处,朝以下方向看: (-2,1,-1)。该框会在您的屏幕上可见吗?答案是否定的,因为通过设置观察方向(-2,1,-1) 你的相机指向点(-4,2,1)的方向。该点是通过将矢量的初始点滑动(平移)到相机所在的点,然后取矢量的终点来找到的。
那么,我们实际上应该设置什么点观察方向到?为了找到这一点,请再次将自己置于原点 (0,0,0),并朝红色箭头所指的方向看。想象一下你的身体站在那里。在这种情况下,您会感觉到红色箭头指向您的背部,而您的视线会以某种方式沿着红色箭头延伸的线移动。您可以看到的这个假想箭头延伸上的每个点(不是在您的背部)都可以作为方向向量,即有效的方向向量观察方向价值。例如,(2,-1,-2) 就是一个很好的选择。此外,该值的每个倍数都可以。因此,(4,-2,-4)也有效。 (1,-0.5,-1) 也是如此。不一定是倍数;也允许非倍数,例如 (2.1,-1,-2),但在这种情况下,您会注意到屏幕上的对象不再居中。请记住,该对象位于原点右侧。
让我们把它提升到一个新的水平:该对象不是位于原点,而是例如在 (-2,1,-1) 中,而相机仍处于 (-2,1,2) 中。应该是什么观察方向价值?再次想象您站在原点,朝着您希望相机指向的相同方向看,以便在屏幕上看到某些内容。与前面的示例有所不同,其中红色箭头指向您的背部。这实际上是一种特殊情况:除非该对象也位于原点,否则红色箭头不会指向您的背部,如第二个示例所示。再次,从您站立的原点开始并跟随您的视线画一条假想线。当您站在原点时,您能够看到的这条线上的所有点都是有效的观察方向价值观。例如点 (0,0,-3)。而且,正如前面的示例所示,所有倍数都可以。但要注意,(0,0,3)也是倍数,但站在原点时该点位于您的背部。因此,这不是一个好的观察方向 value.
最后,让我们提供一个寻找合适的通用规则观察方向价值。选取您希望相机聚焦的点并减去指示相机位置的点。你得到的值是一个合适的值观察方向价值。让我们将这条规则应用到这两个例子中。在第一个示例中,我们有 (0,0,0) - (-2,1,2),结果为 (2,-1,-2)。在第二个示例中,我们通过从 (-2,1,-1) 减去 (-2,1,2) 得到一个值。这等于 (0,0,-3)。