首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拖动三维杠杆(基于方向和视角)

拖动三维杠杆(基于方向和视角)
EN

Stack Overflow用户
提问于 2016-06-28 04:54:30
回答 2查看 405关注 0票数 1

在我的项目(C++/UE4)中,我有一个杠杆网格伸出地板。按住这个杠杆上的鼠标左键并移动鼠标,启动一个拖动操作。这种拖动操作负责计算2D增量鼠标的移动,并利用这些数据在局部空间*中旋转杠杆*,后者只能在单个轴上旋转(负或正,但仍然只有一个轴)。

但如果,我不是在操纵杆前面,而是我在后面呢?如果我站在它的一边呢?如果杠杆实际上是从墙上伸出而不是地面呢?我如何使它,使鼠标的移动实际上旋转杠杆适合的角度,从它是从,无论杠杆的方向?

为了进一步解释自己..。

下面是一个场景列表,以及我希望鼠标控制它们的方式:

当操纵杆在地板上,而你在它前面时,

  • 如果你移动鼠标向上(-Y),它应该旋转远离相机。
  • 如果你把鼠标向下移动(+Y),它应该向摄像机旋转。

当操纵杆在地板上而你在它后面时,

  • 如果你移动鼠标向上(-Y),它应该旋转远离相机。 (当你在它前面的时候,它是相反的世界空间方向)
  • 如果你把鼠标向下移动(+Y),它应该向摄像机旋转。 (当你在它前面的时候,它是相反的世界空间方向)

当操纵杆在地板上而你在它旁边时,

  • 如果你向左移动鼠标(-X),它应该旋转到相机的左边。 (当你在它的另一边时,方向正好相反)
  • 如果你向右移动鼠标(+X),它应该旋转到相机的右边。 (这是相反的方向,当你在它的另一边)

当操纵杆在墙上而你在它前面时:

  • 如果你把鼠标向上移动,它应该向上旋转(朝向天空)。
  • 如果你把鼠标向下移动,它应该向下旋转(朝向地板)。

当杠杆在墙上,而你在它旁边:

  • 就像它在墙上,你就在它前面

如果有帮助的话,请注意,UE4确实有内置的2D/3D向量数学函数,以及在3D世界或2D屏幕上投影和解构坐标的简单方法。因此,我总是知道鼠标位置的精确的世界空间和屏幕空间坐标,杠杆的枢轴(底部)位置,杠杆的手柄(顶部)位置,以及鼠标移动每个帧的数量(增量)。

EN

回答 2

Stack Overflow用户

发布于 2016-06-28 08:38:00

获取杠杆的枢轴(围绕杠杆旋转的点),并将其投影到屏幕坐标。然后,当您第一次单击时,存储单击的坐标。

现在,当您需要知道以哪种方式旋转时,您需要计算向量枢轴到第一单击和向量枢轴到当前位置之间的点积(您应该在点积之前对矢量进行规范化)。这给你的cos(角度),鼠标移动,你可以使用它(取arccos(值)获得的角度),以移动杠杆在3d。因为屏幕上的角度与投影的角度不一样,所以它会有点不稳定,但是这样更容易控制(如果你移动鼠标90度,杠杆就会移动90度,即使它们不对齐)。播放设置,看看什么最适合您的项目。

另一种方法是这样做:当你第一次点击你存储的点,杠杆的末端(甚至更好的点,你点击杠杆)在3d空间。你可以使用摄像机投影平面来移动3d中的点(你可以使用相机向上矢量,在你使它与摄像机的视图方向正交之后,然后取视图方向的交叉向量来得到正确的方向)。将鼠标增量运动应用于点,然后将其投影到旋转平面中,并移动杠杆将点与投影点对齐(数学与上面的类似,只需使用3d点而不是屏幕投影)。

警告:如果相机离旋转平面很近,这并不是很好,因为它并不总是清楚的杠杆应该向前或向后移动。

我不是虚幻工程4方面的专家(只是自学),但所有这些都是基本的向量数学,应该得到很好的支持。查看维基百科上的点产品和交叉产品,因为它们对这类技巧非常有用。

票数 1
EN

Stack Overflow用户

发布于 2019-06-11 22:25:21

这里有一个方法:

  1. 当用户单击杠杆时,假设有一个平面通过杠杆的枢轴,其正常方向与从摄像机到枢轴的方向相同。光标的光线和那个平面的Calculate the intersection point。 (leverPivotPosition-cameraPosition).GetSafeNormal(0.0001f);FVector rayOrigin;FVector rayDirection;FVector cameraPosition;FVector leverPivotPosition;FVector planeNormal =cameraPosition t= ((leverPivotPosition - rayOrigin) \ planeNormal) / (planeNormal _ rayDirection);FVector planeNormal= rayOrigin +* t;
  2. 将其标量投影到杠杆的局部上/下轴上。让我们假设它是本地的上下轴: 浮子( FVector LeverLocalUpDirectionNormalized);浮子( scalarPosition )= planeHitPosition = leverLocalUpDirectionNormalized;
  3. 然后,在另一个框架中,将杠杆按下,为该框架计算新的scalarPosition。当scalarPosition在框架之间增加时,杠杆应该旋转,使其向杠杆的上部移动。当它在框架之间减小时,杠杆应该向杠杆的下边旋转。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38067313

复制
相关文章

相似问题

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