WPF中的CameraPosition和Lookdirection

时间:2015-02-22 09:41:21

标签: wpf perspectivecamera

我希望你们都做得很好。

我目前正在研究wpf应用程序。我是wpf的新手。我正在创建一个代表wpf实验室的场景。我在设置相机时非常困难。我不知道相机的起源在哪里,即(0,0,0)或默认位置。我正在玩位置值,但我不能指出相机的位置。我要缩小并将光标放到 <ModelVisual3D> 查看相机的位置。而且我也不知道这些线条显示了什么

<PerspectiveCamera Position="-40,40,40"/> //a little modification via mouse to show these three lines appropriate 

These red, green and blue lines 当我使用position = 0,0,1时它停留在窗口内但是当我使用1,0,2时它消失了并且必须重新定位它。 stackoverflow上有类似的代码,它说:

Position="12.5,50,20" LookDirection="0,-.7,-0.35" //it works perfectly :(

我的问题是如何理解这个位置属性并查看方向(完全不知道,已经搜索过但只是寻找简单的解释)。类似的代码可以很好地工作,但是当我尝试自己编写代码时,我会陷入相机的位置。

请帮帮我。欢迎所有建议。我正在使用VS2012和.Net 4.5

1 个答案:

答案 0 :(得分:1)

问题

我猜这个问题源于这样一个事实:只要有人指定 LookDirection ,就会经常认为此值是相机正在观察的空间点。错误!例如,指定LookPosition等于0,0,0并不意味着照相机正朝着原点方向看,就像前面的一些注释所暗示的那样。


解决方案

解决方案在于单词“ LookDirection”本身:它提到了“方向”。现在,尽管在XAML中指定 LookPosition 的方式与指定相机的 Position 的方式相同,但使用三个逗号分隔且有序的数字,这些数字意味着不同的东西在两种情况下。 位置的类型为 Point3D ,而 LookDirection 的类型为 Vector3D 。因此,当输入 LookDirection 的值时,实际上是一个向量。没有重点。

在不过多介绍矢量细节的情况下,有必要提到我们在这里谈论的矢量是欧几里得矢量,其特征是幅值方向。如果矢量由三个逗号分隔的有序数字(一个三元组)定义,则该矢量称为坐标矢量。这样的坐标矢量总是暗示着一个基点和一个原点的存在,而这个原点对于找到相机注视的方向很重要。

要找出相机的目标(以及为什么看不到想要看到的东西),请遵循以下简单步骤:想象自己站在原点(0,0,0)的同时,看着由 LookDirection 。相机虽然位于另一个点,也正朝这个方向移动。

在下面的图片中,对象(框)位于原点中。我们相机的位置设置为(-2,1,2)。问题: LookDirection 应该设置为什么才能在屏幕上看到该框?假设站在(0,0,0)时,您的方向是(-2,1,-1)。该框在屏幕上可见吗?答案是否定的,因为将 LookDirection 设置为(-2,1,-1),您的相机便指向了点(-4,2,1)的方向。通过将向量的初始点滑动(平移)到摄像机所在的点,然后获取向量的终点,可以找到该点。

那么,实际上我们应该将 LookDirection 设置为哪一点呢?要找出答案,请再次将自己置于原点(0,0,0)中,并朝红色箭头所指的方向看。想象一下,您身体站在那里。在这种情况下,您会感觉到红色箭头指向您的后方,而您的视线会以某种方式跟随红色箭头的延伸线。您可以看到的该假想箭头扩展上的每个点(不是在您的背后)都可以用作方向矢量,即有效的 LookDirection 值。例如,(2,-1,-2)是一个很好的例子。而且,此值的每个倍数都可以。因此,(4,-2,-4)也将起作用。 (1,-0.5,-1)也是如此。不一定是倍数;也可以使用(2.1,-1,-2)等非整数,但是在这种情况下,您会注意到屏幕上的对象不再居中。请记住,对象位于原点正中。


enter image description here


让我们将其带入一个新的层次:对象不在原点中,例如相机仍处于(-2,1,2)时处于(-2,1,-1)中。 LookDirection 值应该是什么?再次,想象一下自己站在原点并朝着希望指向相机的方向看,以便在屏幕上看到某些东西。与前面的示例的不同之处在于,红色箭头指向您的背部。实际上,这是一个特例:除非对象也位于原点,否则第二个示例所示,红色箭头不会指向您的后背。同样,画一条假想的线,从您站立的原点开始并跟随您的视线。站在原点上时,您能看到的这条线上的所有点都是有效的 LookDirection 值。例如点(0,0,-3)。而且,与前面的示例一样,所有倍数都可以。但是请注意,(0,0,3)也是倍数,但此点位于原点时位于您的背部。因此,这不是一个很好的 LookDirection 值。

最后,我们提供一个通用规则以找到正确的 LookDirection 值。取您想要照相机聚焦的点,然后减去指示照相机位置的点。您获得的值是正确的 LookDirection 值。让我们将此规则应用于两个示例。在第一个示例中,我们得到(0,0,0)-(-2,1,2),结果为(2,-1,-2)。在第二个示例中,我们通过从(-2,1,-1)中减去(-2,1,2)来获得一个值。等于(0,0,-3)。

enter image description here