我正在使用C ++中的简单网格查看器实现,具有基本功能,如平移,旋转,缩放。 我坚持使用鼠标沿z轴实现对象的旋转。我想要实现的是:
对于上面两个,我只使用atan2()来确定移动角度。但是我如何检测圆周运动?
答案 0 :(得分:0)
我认为它不会那样......
您可以将鼠标滚轮旋转转换为z轴,或使用四元数相机方向,它几乎可以直观地沿着每个轴旋转......
对于四分相相机来说恰恰相反:如果试图沿直线旋转网格,网格似乎围绕其他奇怪的轴稍微旋转 - 为了弥补这一点,人们直观地试图遵循一些略微弯曲的轨迹
答案 1 :(得分:0)
也许,你应该定义一个屏幕区域(例如在窗口边界处),当点击它时,它将启动弧线移动 - 或使用其他修改器,按钮或其他任何东西。
然后在鼠标单击时捕获2D屏幕空间中的坐标和旋转中心(网格轴)。这会给你一个矢量(网格中心,按下按钮)
在每次移动鼠标时,您都会计算一个新的矢量(网格中心,鼠标位置),两个矢量之间的角度就是旋转角度。
答案 2 :(得分:0)
解决这个问题的唯一方法是在用户开始制作动作和旋转物体之间有一个延迟:
当用户点击并开始移动鼠标时,您需要确定它是直线移动还是圆形移动。这需要在做出判断之前收集一定数量的数据。
最极端的情况是要求用户先制作一个完整的圆圈,然后轮换开始(实际上你可以做得比这更好)。你能够将这段时间减少到多少将取决于a)你决定用户行动的准确程度,以及b)你对模式识别算法有多好。
为了让你开始,这是一个非常差的算法的概述:
在用户点击存储x和y坐标。 每1/10秒存储新坐标和process_for_pattern。
在您正在寻找的process_for_pattern中:
x坐标和y坐标有规律地增加,减少,或者一个增加,一个减少的时期。随着时间的推移,如果这个模式发生变化,使得x或y开始反转而另一个继续原样,那么在那一刻你可以相当确定你有一个圆圈。
此算法要求用户在检测到之前绘制四分之一圆,并且不考虑大小,方向或大部分不规则运动。
如果您真的想继续使用此方法,可以获得更好的算法,但您可能需要重新考虑控制方法。
答案 3 :(得分:0)
这不完全是你想要的,但应该足够接近。
选择一个圆形区域,在该区域中,编号为1和2的运动按照所述方式工作(在图片中,这将是一些小于红色圆圈的区域。但是,当用户在圆形区域外单击时,您将保存初始区域单击位置(以绿色显示)。这定义了一个相对于屏幕的x轴具有一定角度的点(你可以通过一些触发轻松找到它),它还定义了用户所在圆的半径正在工作(红色)。鼠标的释放增加了第二个点(蓝色)。然后你找到了这个点相对于屏幕中心和x轴的角度(就像之前一样)。然后你投射通过第一次点击确定半径的圆角。暗红色圆弧定义模型的旋转量。
这应该足以让你入门。
答案 4 :(得分:0)
我认为这不是一个好的输入法。因为您总是需要一些行程距离来区分线和曲线,这意味着一些输入延迟。这是另一种选择:
只有垂直鼠标的线穿过屏幕中心才被认为是垂直的。水平相同。在其他情况下,它被视为旋转,并计算其幅度,计算最后一个鼠标位置与当前位置之间相对于屏幕中心的角度。
如果您的应用程序像这样工作,您可以使用所选网格的中心。
答案 5 :(得分:0)
你无法沿弧线检测"圆形"鼠标移动与3D模型查看所需的精度接近。你想要的是这样的:http://thetechartist.com/?p=80
使用您可以使用鼠标抓取的键盘快捷键或屏幕轴指示器指定轴(x,y或z)。
这比试图检测" arc更精确。手势。任何" arc"当您累积足够的鼠标样本以确定是否已开始弧形手势时,识别必然会涉及延迟。像这样的手势识别是非常重要的(我已经使用Wii-mote做了一些手势工作)。同样,即使你的简单"垂直"和"水平"由于同样的原因,鼠标移动检测将需要延迟。任何"简单的阈值来过滤轻微的偏差"会让它感到沮丧和怪异。
对于3D查看,您需要1:1鼠标响应,这意味着只需使用快捷键或UI等明确指定轴。对于x轴旋转,只需将其限制为鼠标x,y轴限制为鼠标y,如果你喜欢。对于z,您可以类似地限制为x或y鼠标输入,或者仅使用总行进的2d鼠标距离。这取决于你感觉最好。
作为替代方案,您可以尝试编写像3dConnexion SpaceExplorer这样的3D鼠标的编码。