【问题标题】:Make mouse coordinates relative to <canvas> coordinates使鼠标坐标相对于 <canvas> 坐标
【发布时间】:2016-10-07 06:44:04
【问题描述】:

我试图在保持可调整大小的同时找到鼠标在画布“网格”上的位置。我目前有鼠标在屏幕上的坐标(x 和 y)。

问题是,WebGL(我用来在画布上绘制)和鼠标坐标之间的“缩放”是不同的。 WebGL 认为从原点向右 10 个单位实际上被认为是从原点开始的 x 个单位(不同的屏幕分辨率会改变这一点)。这意味着当我的鼠标在 WebGL 认为的 (10, 10) 上时,我的鼠标坐标是 (100, 100)。

如何将屏幕上的鼠标坐标转换为用于定义点的“WebGL 坐标”?

这类似于this question,但我想不使用 Fabric.js。

【问题讨论】:

  • 添加了 webgl 标签参考。厘米
  • 默认的 NDC 空间(没有任何变换)是屏幕左侧的 x=-1,右侧的 x=+1; y=-1 在底部,y=+1 在屏幕顶部。
  • 我的问题是如何将视口中的光标坐标转换为它在 NDC 空间中覆盖的坐标
  • this
  • 或者只使用基本数学:mx = (mouseEvent.offsetX / canvas.clientWidth)*2-1 与 y 相同,使用 offsetYclientHeight

标签: javascript html canvas webgl


【解决方案1】:

要将画布鼠标坐标转换为-1+1范围内的相对坐标,首先需要使用offsetX/offsetY provided by the mouse event获取画布内的相对像素坐标。

然后将其除以画布的实际宽度和高度 clientWidth/clientHeight.

有了从01 范围内的相对坐标,我们现在可以通过乘以2 并减去1 将它们移动到正确的范围内。

请注意,在 WebGL 中,上轴为正 1,因此需要反转 Y 坐标。

全部放在一起:

var ndcX = (mouseEvent.offsetX / canvas.clientWidth) * 2 - 1;
var ndcY = (1 - (mouseEvent.offsetY / canvas.clientHeight)) * 2 - 1;

【讨论】:

  • The full answer 比看起来更难,但在正常情况下,您的解决方案有效
  • ndcY 计算中的小错字。您应该使用canvas.clientHeight 而不是canvas.clientWidth
【解决方案2】:

如果您的事件监听器在 canvas 元素上,那么坐标应该已经在 canvas 上。这意味着 mouse.x = 0 mouse.y = 0 将位于画布的左上角。

【讨论】:

  • 看起来这可能有效。让我做更多的测试,但看起来不错。
  • 这不起作用。即使在画布元素上,onmousmove 事件侦听器也会报告 10 个单位宽的画布超过 20 个单位。
  • 因为 mouse.x/y 返回与 event.clientX/Y 相同的值,这意味着坐标将相对于视口而不是元素。并非所有浏览器都支持 x/y。参考:drafts.csswg.org/cssom-view/#dom-mouseevent-x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多