gpt4 book ai didi

algorithm - 限制拖动到对象的局部轴

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:27:28 25 4
gpt4 key购买 nike

当沿局部轴拖动对象时,我正在尝试实现与 3D 建模程序所做的非常相似的事情。主要区别在于,您不会在屏幕上移动光标,而是可以自由移动相机,并且光标始终位于屏幕中间。有点像第一人称游戏。

想象一下,将相机对准下面标有蓝色十字(光标)的立方体的表面。您按住鼠标以“抓取”立方体。立方体的拖动现在应该被限制在轴上,用大红色箭头表示。

enter image description here

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

enter image description here

我很难弄清楚这背后的数学原理。我知道立方体的起始位置和旋转。我随时都知道相机的位置和旋转。我可以确定被捕获的脸是正常的。

我想找到与抓取的面平行且与红色箭头和光标的交点最接近的平面,但这似乎不正确。

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

最佳答案

您可以使用 2 条线(准确地说是射线)将问题简化为二维问题。红色箭头转换到 xy 平面,与来自相机的光线相同(意味着您忽略两者的 z 轴),然后将其映射回 3D。

首先获取人脸中心点(faceStartPos)和相机中心。

按照 Blender 的方向(z 向上,y 向右,x 离开屏幕)使用相机的旋转确定从相机投影的线(我想你可以弄清楚,这类似于你从立方体中获得范数的方式,我假设),以及法线(及其起始位置)作为从中心的线脸。然后你有一个由 2 个线性方程组成的系统,有 2 个未知数,一点代数,你可以确定它们的值(对于 xy)。至于求解 2 方程组,我认为你应该采用矩阵方法(至少我发现它最容易用代码实现,特别是如果你知道它是一个 2 变量系统。

之后您可以确定 xy 的值,您可以得到等式 faceStartPos + t * normVec 其中 faceStartPos .x + t * normVec.x,求解t

t 是您移动立方体真正需要的神奇变量,您所做的就是 newCubeCenter = oldCubeCenter + t * normVec

注意事项:

  • (臭名昭著的) float 错误
  • 相机几乎(或完全)与法线对齐以使其平行的点

关于algorithm - 限制拖动到对象的局部轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22937929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com