WPF3D如何在与摄影机平行的平面中操纵对象

Ped*_*sso 2 .net c# 3d wpf

我正在WPF中进行申请。我正在使用很多3DTools。我有一个四面体,里面有一个立方体。我想在3D方向上移动立方体。

我的四面体位于(0,0,0)的中心,使用轨迹球旋转(以编程方式,我在视口上方有一个透明的边框来捕获事件)。

该应用程序的用户认为,在其中移动多维数据集的更自然的方法是始终在2D平面(平行于屏幕)中移动它。因此,例如,如果要在屏幕中更深地移动它,只需旋转四面体并将其沿Y轴移动即可。我认为这可能是一个很好的解决方案。

我必须解决问题,然后需要帮助解决:首先,当我移动四面体(在轨迹球内部)时,轨迹球看起来就像在移动所有系统坐标。我之所以这样说是因为我出于调试目的绘制了轴,并且这些轴也在旋转。但这不是真的-它们之所以运动是因为轨迹球内有物体(对吗?)。编辑实际上,我认为轨迹球内部的坐标系确实正在发生变化。当我在YX轴上移动多维数据集时,我的行为正常。但是,如果我稍微转动一下,并尝试在Z轴上移动,我会发现它越来越大(更靠近相机)而更小(远离相机)。=(

所以我的问题是如何定义不会被轨迹球旋转的平面?对我来说,答案看起来像是“可以,只需在轨迹球外定义它”,但是,正如我所说的(和3DTools文档所说),我在视口上有一个边框...所以我不知道该如何处理。

一组ScreenSpaceLines3D中的四面体。我将不得不将多维数据集保留在其中。我的第二个问题是如何跟踪旋转的四面体的顶点的位置?当Position属性给我原始位置而没有其他东西时,我真的很失望。我是否应该保留矩阵变换,然后在需要时应用于点?

抱歉,我的文字太长了,但我真的很想念这个编程问题。我知道在WPF中,我仍然缺乏一些概念。

提前致谢,

佩德罗

Dr.*_*ABT 5

然后,我要做的就是尝试制作自己的操纵器(创建新类来替换3DTools中的TrackBall操纵器)。例如,过去我通过简单的矩阵/矢量操作来进行缩放/平移,围绕目标旋转,自由旋转,自由移动,旋转对象,翻译对象等。

对于您的示例,您需要做的是计算法线,该法线与Camera-> Target和world up向量之间的平面正交。这将为您提供一个与摄像头“平行”的矢量,例如,如果您看着屏幕,则像本地X轴。使用此向量可以约束立方体在该方向上的运动。

为此,计算从摄像机到目标的向量V。这是通过从摄像机位置减去对象位置来实现的。然后,计算要横向转换的向量,如下所示:

给定相机要瞄准的向量,v = xi,yj,zk
归一化向量,v'= xi,yj,zk / sqrt(xi ^ 2 + yj ^ 2 + zk ^ 2)
令U =全局世界上的向量u = 0、0、1

然后我们可以计算出R =水平向量,该向量与摄影机的观看方向平行

R = v' ^ U, where ^ is the cross product, given by   
 a ^ b = (a2b3 - a3b2)i + (a3b1 - a1b3)j + (a1b2 - a2b1)k 
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个看起来像这样的向量。

叉积以查找与相机方向平行的向量

现在您知道了这个向量R,当您左右移动鼠标时,可以使用它来平移对象。例如,用伪代码:

// Pseudocode
onMouseMove()
{
    // Using calculation for R vector above
    Vector r = calulateVector();

    // Assuming passed in the number of points to translate 
    // (or some derivative of mousemove)
    let int pts = mousePointsMovedLeftOrRight;

    // Perform a translate in direction of R
    Vector targetPosition = TargetObject.PositionVector;
    targetPosition.X += r.X * pts;
    targetPosition.Y += r.Y * pts;
    targetPosition.Z += r.Z * pts;
}
Run Code Online (Sandbox Code Playgroud)

我在家中的笔记本电脑上都有可以执行此操作的代码(这是OpenGL,但原理相同-在3D空间中提供对象和相机的各种操作)。如果您想了解更多,请随时与我联系/发表评论。

最好的祝福,