我正在用WPF提出申请。我使用了很多3 3DTools。我有一个四面体,里面有一个立方体。我想把立方体朝三维方向移动。
以(0,0,0)为中心的我的四面体使用Trackball旋转(通过编程,我在我的视口上有一个透明的边框来捕获事件)。
应用程序的用户认为移动立方体更自然的方法是始终在2D平面(与屏幕平行)移动立方体。所以,如果我想把它移到屏幕更深的地方,我只需要旋转四面体,然后在Y轴上移动。我认为这是一个很好的解决办法。
我必须解决问题,然后我想帮助解决:首先,当我移动我的四面体(在轨迹球内)时,轨迹球看起来就像移动所有的系统坐标。我这么说是因为我绘制轴是为了调试,而这些轴也是旋转的。但这不是真的-他们移动仅仅是因为跟踪球内的物体(对吗?)编辑实际上,我认为轨迹球内的坐标系正在发生真正的变化。当我在Y-X轴上移动立方体时,我的行为正常。但是如果我稍微转动一下,试着在Z轴上移动,我就会看到它变大了(靠近相机),变小了(远离相机)。=(
所以我的问题是如何定义一架不会被轨迹球旋转的飞机?对我来说,答案看起来像是"ok,只需在轨道球之外定义它“,但是,正如我所说(和3 3DTools文档说的)我在我的视口上有一个边框.所以我不知道该怎么处理。
我的四边形在一组ScreenSpaceLines3D中。我得把立方体放在里面。我的第二个问题是,如何跟踪四面体顶点的位置,旋转?当仓位属性给了我原来的位置而没有其他任何东西时,我真的很失望。我应该保留矩阵变换,然后在需要的时候应用到我的点上吗?
很抱歉写了很长的课文,但是我真的陷入了这个问题,不是太多的编程问题。我知道在WPF,我仍然有一些缺乏概念。
提前谢谢你,
佩德罗
发布于 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=水平向量,它与摄像机的视点方向平行。
R = v' ^ U, where ^ is the cross product, given by
a ^ b = (a2b3 - a3b2)i + (a3b1 - a1b3)j + (a1b2 - a2b1)k 这会给你一个像这样的向量。

现在你知道了这个向量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;
}我在家里的笔记本电脑上有代码,可以做到这一点(这是OpenGL,但原理相同--在3D空间中提供对物体和相机的各种操作)。如果您想了解更多信息,请随时与我联系/发表意见。
诚挚的问候,
发布于 2012-01-05 14:10:15
我也做过类似的事,没有轨迹球。我只是使用MouseMove事件移动和定向相机,但它将同样适用于移动一个物体。如果你想要的话我还有密码。
https://stackoverflow.com/questions/8323161
复制相似问题