【问题标题】:CameraPosition and Lookdirection in WPFWPF 中的 CameraPosition 和 Lookdirection
【发布时间】:2015-04-23 18:04:22
【问题描述】:

我希望你们都做得很好。

我目前正在开发 wpf 应用程序。我是wpf的新手。我正在创建一个代表 wpf 实验室的场景。我很难设置相机。我不知道相机的原点从哪里开始,即 (0,0,0) 或默认位置。我在玩位置值,但我无法确定相机的位置。我必须缩小并将光标放在 <ModelVisual3D> 查看摄像机的位置。而且我不知道这些行显示什么

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

当我使用 position= 0,0,1 它停留在窗口内但是当我使用 1,0,2 它消失并且必须重新定位它。 stackoverflow 上有类似的代码,上面写着:

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

我的问题是如何理解这个位置属性和看方向(完全不知道,已经搜索过但正在寻找简单的解释)。类似的代码运行良好,但是当我尝试编写自己的代码时,我卡在了相机的位置。

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

【问题讨论】:

  • 意味着,首先我要创建 然后放相机?如果是这样,那么我怎么知道对象的创建是正确的?请指导!
  • 这取决于您的 3D 场景和放置对象的位置。相机位置和方向没有通用规则。 Position 是相机的位置,LookDirection 是相机所看的点。很简单。所以,想象一下你的 3D 场景,想想你想把相机放在哪里,你想看到什么物体。
  • @AlexFarber 需要更多解释,请是可能的!你能告诉我这些绿蓝红线代表什么吗?像 x 轴或 y 轴
  • 是的,我愿意。如果你有什么,请分享。
  • 兄弟你找到解决方案了吗?

标签: wpf perspectivecamera


【解决方案1】:

问题

我猜这个问题源于这样一个事实,即每当指定一个 LookDirection 时,人们通常会认为这个值是相机正在查看的空间点。错误的!例如,指定 LookPosition 等于 0,0,0 并不意味着相机正朝着原点看,正如一些早期的 cmets 所建议的那样。


解决方案

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

无需过多讨论向量细节,有必要提一下,我们这里所说的向量是一个欧几里得向量,其特征是 magnitudedirection。如果向量由三个逗号分隔的有序数字(三元组)定义,则该向量称为坐标向量。这样的坐标向量总是意味着存在一个基点和一个 origin,而正是这个原点对于找到相机正在寻找的方向很重要。

要找出你的相机瞄准的是什么(以及为什么你可能看不到你想看到的东西),请按照这个简单的过程:想象你站在原点 (0,0,0),同时看着由看向。相机虽然位于另一个点,但也正是这个方向。

在下图中,一个对象(框)位于原点。我们相机的 Position 设置为 (-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) 是一个好方法。此外,这个值的每个 multiple 都可以。因此,(4,-2,-4) 也将起作用。 (1,-0.5,-1) 也是如此。不一定是倍数;也允许使用诸如 (2.1,-1,-2) 之类的非倍数,但在这种情况下,您会注意到屏幕上的对象不再居中。请记住,对象正好位于原点。



让我们把它带到下一个层次:对象不位于原点,而是例如在 (-2,1,-1) 中,而相机仍在 (-2,1,2) 中。 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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多