我正在C++中开发一个简单的网格查看器实现,它具有诸如平移、旋转、缩放等基本功能。我一直在用鼠标实现物体沿z轴的旋转。我想实施以下几点:
对于上述两种情况,我只使用atan2()来确定运动的角度。但是如何检测循环运动呢?
发布于 2012-10-25 13:29:38
处理这一问题的唯一方法是在用户开始运动和物体旋转之间有一个延迟:
当用户点击并开始移动鼠标时,您需要确定它将变成直线运动,还是圆形移动。这将需要在作出判决之前收集一定数量的数据。
最极端的情况是要求用户先做一个完整的循环,然后开始旋转(在现实中,您可以做得更好)。你能把这段时间缩短到多小取决于a)你对用户操作的要求有多精确,以及( b)你对模式识别算法的运用有多好。
为了让您开始,这里有一个非常糟糕的算法的概要:
在用户上单击“存储x和y坐标”。每秒的1/10存储新的坐标和process_for_pattern。
在process_for_pattern中,您要查找:
一个周期,其中x坐标和y坐标都有规律地增加,两者都减少,或者一个增加,另一个减少。随着时间的推移,如果这种模式发生变化,x或y开始反转,而另一个则继续,那么在那一刻,你可以相当肯定你已经有了一个圆。
该算法将要求用户在被检测之前画一个四分之一圆,并且它不考虑大小、方向或大部分不规则的运动。
如果你真的想继续使用这个方法,你可以得到一个更好的算法,但是你可能需要重新考虑你的控制方法。
发布于 2012-10-25 13:11:25
我不认为它是那样的..。
您可以将鼠标轮旋转转换为z轴,或使用四元数相机的方向,它可以沿每个轴旋转几乎直观.
四分位相机的情况正好相反:如果一个人试图沿着一条直线旋转网格,这个网格似乎会稍微绕着其他一些奇怪的轴旋转--为了弥补这一点,一个人直觉地试图沿着一些稍微弯曲的轨迹旋转。
发布于 2012-10-25 13:16:31
也许,您应该定义一个屏幕区域(例如在窗口边界处),当单击该区域时,它将启动弧运动--或者使用其他修饰符、按钮或其他什么。
然后在鼠标点击你捕获坐标和旋转中心(网格轴)在2D屏幕空间。这会给你一个矢量(网格中心,按钮向下)
在每次鼠标移动时,计算一个新的矢量(网格中心,鼠标pos),两个矢量之间的角度是旋转的角度。
https://stackoverflow.com/questions/13069220
复制相似问题