限制射线不越过平面:鼠标命中点不超原点位置方案求助
鼠标命中点不越过原点的解决方案
核心逻辑
先判断鼠标命中点是否跑到原点的另一侧,越界了就把它拉回原点或限制在原点边界;没越界就正常使用。
具体操作步骤
- 计算鼠标命中点(记为P)到原点(记为O)的向量:
vec = P - O - 选一个代表「允许区域方向」的向量(比如你希望只能在原点右上侧,就选(1,1),按需调整),记为
dir - 计算
vec和dir的点积:dot = vec.x * dir.x + vec.y * dir.y - 若
dot < 0,说明命中点已越过原点进入禁止区域,直接把命中点改成原点即可;想要平滑效果的话,也可以设为极靠近原点的同方向点 - 若
dot >= 0,说明命中点在允许范围内,无需改动
伪代码示例
// 假设原点坐标是(0,0),鼠标当前命中点为mousePos vec_x = mousePos.x - 0 vec_y = mousePos.y - 0 // 这里假设允许区域是原点右侧(x正方向),可按需替换dir dir_x = 1 dir_y = 0 dot_product = vec_x * dir_x + vec_y * dir_y if dot_product < 0: // 越界后修正为原点 mousePos = (0, 0) // 若要保留方向: // length = sqrt(vec_x*vec_x + vec_y*vec_y) // if length > 0: // mousePos = (vec_x/length * 0.001, vec_y/length * 0.001)
对你原有思路的问题分析
你之前的计算逻辑是P - (单位向量 * 模长),结果直接等于原点,但没有提前判断是否越界,等于不管情况如何都把点拉到原点,自然达不到预期。得先判断点是否越界,再决定要不要执行修正。
内容的提问来源于stack exchange,提问作者anata0
相关产品推荐
相关产品推荐

