首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL中跟踪循环鼠标运动

在OpenGL中跟踪循环鼠标运动
EN

Stack Overflow用户
提问于 2012-10-25 13:02:20
回答 6查看 1.8K关注 0票数 3

我正在C++中开发一个简单的网格查看器实现,它具有诸如平移、旋转、缩放等基本功能。我一直在用鼠标实现物体沿z轴的旋转。我想实施以下几点:

  1. 点击并拖动鼠标垂直(几乎是垂直的,因为我使用一个简单的阈值来过滤沿水平轴的微小偏差),使物体沿着y轴旋转(这部分完成了)。
  2. 点击并拖动鼠标水平,就像上面描述的那样,使物体沿x轴旋转(这部分也是完成的)。
  3. 对于z轴旋转,我想检测一个圆形(或沿弧线)鼠标运动.我被困在这部分,不知道如何实现。

对于上述两种情况,我只使用atan2()来确定运动的角度。但是如何检测循环运动呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-25 13:29:38

处理这一问题的唯一方法是在用户开始运动和物体旋转之间有一个延迟:

当用户点击并开始移动鼠标时,您需要确定它将变成直线运动,还是圆形移动。这将需要在作出判决之前收集一定数量的数据。

最极端的情况是要求用户先做一个完整的循环,然后开始旋转(在现实中,您可以做得更好)。你能把这段时间缩短到多小取决于a)你对用户操作的要求有多精确,以及( b)你对模式识别算法的运用有多好。

为了让您开始,这里有一个非常糟糕的算法的概要:

在用户上单击“存储x和y坐标”。每秒的1/10存储新的坐标和process_for_pattern。

在process_for_pattern中,您要查找:

一个周期,其中x坐标和y坐标都有规律地增加,两者都减少,或者一个增加,另一个减少。随着时间的推移,如果这种模式发生变化,x或y开始反转,而另一个则继续,那么在那一刻,你可以相当肯定你已经有了一个圆。

该算法将要求用户在被检测之前画一个四分之一圆,并且它不考虑大小、方向或大部分不规则的运动。

如果你真的想继续使用这个方法,你可以得到一个更好的算法,但是你可能需要重新考虑你的控制方法。

票数 0
EN

Stack Overflow用户

发布于 2012-10-25 13:11:25

我不认为它是那样的..。

您可以将鼠标轮旋转转换为z轴,或使用四元数相机的方向,它可以沿每个轴旋转几乎直观.

四分位相机的情况正好相反:如果一个人试图沿着一条直线旋转网格,这个网格似乎会稍微绕着其他一些奇怪的轴旋转--为了弥补这一点,一个人直觉地试图沿着一些稍微弯曲的轨迹旋转。

票数 0
EN

Stack Overflow用户

发布于 2012-10-25 13:16:31

也许,您应该定义一个屏幕区域(例如在窗口边界处),当单击该区域时,它将启动弧运动--或者使用其他修饰符、按钮或其他什么。

然后在鼠标点击你捕获坐标和旋转中心(网格轴)在2D屏幕空间。这会给你一个矢量(网格中心,按钮向下)

在每次鼠标移动时,计算一个新的矢量(网格中心,鼠标pos),两个矢量之间的角度是旋转的角度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13069220

复制
相关文章

相似问题

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