WebGL屏幕坐标系、canvas坐标系和WebGL坐标系转换——学习笔记

在这里插入图片描述

canvas坐标系转为webgl坐标系,webgl的坐标是x[-1, 1],y[-1, 1]。

①获取canvas在浏览器客户区中的坐标
var x = ev.clientX;
var y = ev.client.Y;
var rect = ev.target.getBoundingClientRect();

图中的P点(x,y)为该点在屏幕坐标系下的坐标值;
图中
canvas原点
在屏幕坐标系下的坐标值为(a,b),即canvas在屏幕上左上角的位置坐标;
其中(a,b)坐标中:

  a = rect.left;
  b = rect.top;

此时求P点在canvas坐标系下的坐标,即将屏幕上的点P转换到cavans坐标系下:

  x' = x-a = x - rect.left;
  y' = y-b = y - rect.top;

(x - rect.left,y - rect.top)坐标为P点在canvas坐标系下的坐标值;

②将canvas坐标转换到webgl坐标系下

1.首先我们通过图片可知,canvas坐标系的Y轴和webgl的坐标系的Y轴方向是相反的,即在后面的转换过程中,y坐标值要进行取反操作。
2.通过代码我们可以获取canvas画布的宽和高:
width = canvas.width;
height = canvas.height;
则webgl原点在canvas坐标系中的位置(即canvas的中心点位置)坐标我们可以直接获得为(width/2,height/2);

现在我们所得到的数据有:

  1. P点在canvas坐标系下的坐标值:(x’,y’)->(x - rect.left,y - rect.top)
  2. canvas的中心点在canvas坐标系下的坐标值:(width/2,height/2)

下一步,我们将canvas的原点平移到中心点WebGL坐标系统的原点位于此处
此时将canvas原点平移到中心点时,P点的坐标应该变为:

x'' = x'-width/2
y'' = y'-height/2

为了使得canvas平移后坐标系与WebGL坐标系完全一致,还需要对平移后的Y轴进行取反操作,即

y'' = -1(y'-height/2)

此时的
(x'',y'')= (x'-width/2,height/2-y')) = ((x - rect.left)-width/2,height/2-(y - rect.top))
在对canvas坐标系进行平移、Y轴取反的操作后(此时的canvas坐标系与webgl坐标系原点位置和xy轴方向完全一致)。由于webgl坐标系的坐标区间为-1.0到1.0,所以最后一步我们将x’‘坐标除以width/2,将y’‘坐标除以height/2,将canvas坐标映射到webgl坐标。
即P点坐标(x,y)最终转换后的坐标为(x’’/(width/2),y’’/(height/2)) =( ((x - rect.left)-width/2)/(width/2),(height/2-(y - rect.top))/(height/2))
对应结果:

x'' = ((x - rect.left)-width/2)/(width/2) = ((x - rect.left)-canvas.width/2)/(canvas.width/2)
y'' = (height/2-(y - rect.top))/(height/2) = (canvas.height/2-(y - rect.top))/(canvas.height/2)
  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ponGISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值