首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF3D如何操纵与摄像机平行的平面上的物体

WPF3D如何操纵与摄像机平行的平面上的物体
EN

Stack Overflow用户
提问于 2011-11-30 08:45:16
回答 2查看 1.8K关注 0票数 2

我正在用WPF提出申请。我使用了很多3 3DTools。我有一个四面体,里面有一个立方体。我想把立方体朝三维方向移动。

以(0,0,0)为中心的我的四面体使用Trackball旋转(通过编程,我在我的视口上有一个透明的边框来捕获事件)。

应用程序的用户认为移动立方体更自然的方法是始终在2D平面(与屏幕平行)移动立方体。所以,如果我想把它移到屏幕更深的地方,我只需要旋转四面体,然后在Y轴上移动。我认为这是一个很好的解决办法。

我必须解决问题,然后我想帮助解决:首先,当我移动我的四面体(在轨迹球内)时,轨迹球看起来就像移动所有的系统坐标。我这么说是因为我绘制轴是为了调试,而这些轴也是旋转的。但这不是真的-他们移动仅仅是因为跟踪球内的物体(对吗?)编辑实际上,我认为轨迹球内的坐标系正在发生真正的变化。当我在Y-X轴上移动立方体时,我的行为正常。但是如果我稍微转动一下,试着在Z轴上移动,我就会看到它变大了(靠近相机),变小了(远离相机)。=(

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

我的四边形在一组ScreenSpaceLines3D中。我得把立方体放在里面。我的第二个问题是,如何跟踪四面体顶点的位置,旋转?当仓位属性给了我原来的位置而没有其他任何东西时,我真的很失望。我应该保留矩阵变换,然后在需要的时候应用到我的点上吗?

很抱歉写了很长的课文,但是我真的陷入了这个问题,不是太多的编程问题。我知道在WPF,我仍然有一些缺乏概念。

提前谢谢你,

佩德罗

EN

回答 2

Stack Overflow用户

发布于 2012-01-05 14:26:31

然后我要做的是尝试自己的操作器(创建新的类来取代3DTools中的TrackBall机械手)来完成这些操作。例如,我过去做过缩放/平移,围绕目标旋转,自由旋转,自由移动,旋转物体,平移物体等等。所有这些操作都是通过简单的矩阵/矢量操作。

对于你的例子,你需要做的是计算法线,这是正交的平面之间的相机->目标和世界上的向量。这将给你一个向量,它是“平行的”在相机上方,就像一个本地的X轴,如果你在看屏幕。使用这个向量,你可以约束立方体在这个方向的运动。

要做到这一点,计算矢量V从相机到目标。这是通过从摄像机位置减去目标位置来实现的。然后,按以下方式计算要横向转换的向量:

给出相机的目标向量,v= xi,yj,zk 规范向量,v‘= xi,yj,zk / sqrt(xi^2 + yj^2 + zk^2) 设U=全局向上向量u= 0,0,1

然后,我们可以计算出R=水平向量,它与摄像机的视点方向平行。

代码语言:javascript
复制
R = v' ^ U, where ^ is the cross product, given by   
 a ^ b = (a2b3 - a3b2)i + (a3b1 - a1b3)j + (a1b2 - a2b1)k 

这会给你一个像这样的向量。

现在你知道了这个向量R,当你向左/向右移动鼠标时,你可以用它来转换对象。例如,在伪码中:

代码语言:javascript
复制
// 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;
}

我在家里的笔记本电脑上有代码,可以做到这一点(这是OpenGL,但原理相同--在3D空间中提供对物体和相机的各种操作)。如果您想了解更多信息,请随时与我联系/发表意见。

诚挚的问候,

票数 5
EN

Stack Overflow用户

发布于 2012-01-05 14:10:15

我也做过类似的事,没有轨迹球。我只是使用MouseMove事件移动和定向相机,但它将同样适用于移动一个物体。如果你想要的话我还有密码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8323161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档