鼠标绘点
ClickedPoints
ClickedPoints Code
1 |
|
1 | // 顶点着色器 |
响应鼠标点击事件
下面是onmousedown触发的后续操作
第一步
获取鼠标点击的位置,存储于一个数组中。
1 | var x = ev.clientX; |
第二步
清空canvas
1 | gl.clear(gl.COLOR_BUFFER_BIT); |
第三步
在相应的位置绘制点
1 | var len = gl_points.length; |
设置坐标的2个注意点
- ev.client[X|Y] 是相对 浏览器客户区(client area) 的坐标。
- canvas坐标系和WebGL坐标系的 原点 和 Y轴正方向 都不同。
坐标映射步骤分解
第一步
将鼠标点击位置的坐标从 客户区坐标系 转换到 canvas坐标系 上:
( x, y) → ( x - rect.left, y - rect.top)
第二步
计算 WebGL中心点 相对 canvas坐标系 的坐标位置:
( canvas.width/2, canvas.height/2)
第三步
计算 鼠标点 相对 *WebGL中心点 的坐标位置:
( x - rect.left - canvas.width/2 , canvas.height/2 - y + rect.top)
第四步
将坐标进行 归一化处理:
( ( x - rect.left - canvas.width )/( canvas.width/2 ), ( canvas.height/2 - y + rect.top )/(canvas.height/2) )
颜色缓冲区的重置
为什么要把每一次点击的点位都记录下来?
因为WebGL使用的是颜色缓冲区。
绘制操作实际上是在颜色缓冲区中进行绘制的,
一旦绘制结束,颜色缓冲区就会被 重置,内容就会丢失。
因此如果你希望保留已经绘制的内容,
就需要保留涉及到绘制的变量所占用的内存地址。