You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D中如何判断鼠标指针是顺时针还是逆时针移动

检测鼠标移动的顺时针/逆时针方向

核心原理:叉积的符号判断方向

无论是判断鼠标轨迹的转向,还是绕固定点的旋转方向,核心都是利用2D向量叉积的符号:
对于两个向量v1(x1,y1)和v2(x2,y2),叉积计算公式为:

cross = x1 * y2 - y1 * x2
  • cross > 0:逆时针方向/转向
  • cross < 0:顺时针方向/转向
  • cross = 0:向量共线(鼠标沿直线移动)

场景1:判断鼠标轨迹的转向(连续曲线方向)

需要跟踪连续三个鼠标位置点,通过相邻移动向量的叉积判断轨迹转向。

通用代码示例(Python + Pygame)

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# 存储连续三个鼠标位置:前前点、前点
prev_prev_pos = None
prev_pos = None

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    current_pos = pygame.mouse.get_pos()
    
    # 当有连续三个点时计算转向
    if prev_prev_pos and prev_pos:
        # 计算相邻移动向量
        v1_x = prev_pos[0] - prev_prev_pos[0]
        v1_y = prev_pos[1] - prev_prev_pos[1]
        v2_x = current_pos[0] - prev_pos[0]
        v2_y = current_pos[1] - prev_pos[1]
        
        # 计算叉积
        cross = v1_x * v2_y - v1_y * v2_x
        
        # 加阈值过滤微小抖动,可按需调整
        if cross > 10:
            print("逆时针转向")
        elif cross < -10:
            print("顺时针转向")
    
    # 更新位置记录
    prev_prev_pos = prev_pos
    prev_pos = current_pos
    
    screen.fill((255,255,255))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

场景2:判断鼠标绕固定点的旋转方向

如果需要判断鼠标绕某个固定点(如屏幕中心)的旋转方向,只需计算固定点到前后鼠标位置的向量叉积。

通用代码示例(Python + Pygame)

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
center_pos = (400, 300)  # 自定义固定参考点

prev_pos = None
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    current_pos = pygame.mouse.get_pos()
    
    if prev_pos:
        # 计算固定点到前后位置的向量
        v_prev_x = prev_pos[0] - center_pos[0]
        v_prev_y = prev_pos[1] - center_pos[1]
        v_curr_x = current_pos[0] - center_pos[0]
        v_curr_y = current_pos[1] - center_pos[1]
        
        cross = v_prev_x * v_curr_y - v_prev_y * v_curr_x
        
        if cross > 10:
            print("绕中心逆时针旋转")
        elif cross < -10:
            print("绕中心顺时针旋转")
    
    prev_pos = current_pos
    
    # 绘制参考点方便观察
    screen.fill((255,255,255))
    pygame.draw.circle(screen, (255,0,0), center_pos, 5)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

关于带符号角度的补充

带符号角度的正负本质上和叉积符号一致,计算方式为atan2(v2.y, v2.x) - atan2(v1.y, v1.x),结果正则逆时针、负则顺时针,但叉积计算更高效,优先推荐叉积方案。

内容的提问来源于stack exchange,提问作者Kevin99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:45:40