限制拖动到对象的局部轴

时间:2014-04-08 13:02:23

标签: algorithm math 3d drag-and-drop draggable

当我沿着局部轴拖动一个物体时,我试图实现与3D建模程序非常相似的东西。主要区别在于,您不要在屏幕上移动光标,而是自由移动相机,光标始终位于屏幕中间。有点像第一人称游戏。

想象一下,将相机对准下面的立方体,标有蓝色十字(光标)。你按住鼠标到"抓住"立方体。现在应该将立方体的拖动约束到轴,用大红色箭头表示。

enter image description here

例如,您可以将相机向左移动并向右转动,如第二张图片所示。在这种情况下,应将立方体移动到线框立方体的位置。该立方体的单个实体面与您最初抓取的面相同。在这里,向上/向下移动相机(沿蓝线移动光标)应该对立方体的新位置没有影响。

enter image description here

我很难搞清楚这背后的数学问题。我知道立方体的起始位置和旋转。我一直都知道相机的位置和旋转。我可以确定被抓住的脸和它的正常。

我正在考虑找到与抓住的脸平行的平面及其与红色箭头的交点,并且光标彼此最接近,但这似乎并不正确。

我还试图以某种方式将光标投射到红色箭头上,基本上消除了沿蓝线的任何移动,但我不确定如何。

1 个答案:

答案 0 :(得分:1)

您可以使用2行(精确的光线)将问题减少为2D问题。红色箭头投射到xy平面,与来自摄像机的光线相同(意味着您忽略了两者的z轴),然后将其映射回3D。

首先获取面部中心(faceStartPos)和相机中心。

通过Blender的方向(z向上,y向右,x从屏幕出来)你使用相机的旋转来确定从相机投射的线(I我认为你可以弄清楚这一点,就像你从立方体那样得到规范,我假设)和正常(以它的起始位置)作为从脸部中心的线。然后你有一个2线性方程组,有2个未知数,一个小代数,你可以确定它们的值(xy)。至于求解2方程的系统,我认为你应该采用矩阵方法(至少我觉得在代码中实现起来最简单,特别是如果你知道它是一个2变量的系统。

之后,您可以确定xy的值,您可以使用faceStartPos + t * normVec等式faceStartPos.x + t * normVec.x,求解t

t是您真正需要移动多维数据集的神奇变量,您所做的只是newCubeCenter = oldCubeCenter + t * normVec

需要考虑的事项:

  • (臭名昭着)浮点错误
  • 相机几乎(或完全)与法线对齐的点,使它们平行