WebGL坐标系、Canvas坐标系和浏览器客户区坐标转化

本文详细介绍了Canvas坐标系、WebGL坐标系及浏览器客户区坐标之间的转换方法。通过具体公式展示了如何将鼠标点击位置从浏览器客户区坐标转换到Canvas坐标,再进一步转换到WebGL坐标,特别强调了Y轴方向的差异。

WebGL坐标系、Canvas坐标系和浏览器客户区坐标转化

1.Canvas坐标系

Canvas坐标系的原点在左上角,X轴向右为正,y轴向下为正

2.WebGL坐标系

WebGL坐标系的原点在绘图区域的中心点。X轴向右为正,Y轴向上为正,Z轴向外为正。

3.浏览器客户区坐标与Canvas坐标和WebGL坐标的转换

鼠标在浏览器客户区点击的位置为:(event.clientX,event.clientY)

那么在canvas中的坐标(x,y)就是:

var rect = ev.target.getBoundingClientRect();
x = event.clientX-rect.left;
y = -(event.clientY-rect.top);
y = event.clientY-rect.top;

其中rect.left是canvas左边界距离浏览器客户区左边界的位置rect.top是canvas上边界距离浏览器客户区上边界的位置

在webgl中的坐标位置(x,y)则为:

x = ( (event.clientX-rect.left) -canvas.width/2 )/(canvas.width/2);
y = -((event.clientY-rect.top)-canvas.height/2)/(canvas.height/2);(因为WebGL坐标系,Y轴向上为正,而Canvas坐标系向下为正。在转化的时候,坐标相减后,前面加一个负号)
也就是y = (canvas.height/2 - (event.clientY-rect.top))/(canvas.height/2);

利用上一步从canvas坐标系转换到webgl坐标系,主要的工作就是需要将坐标范围映射到(-1,1)的范围,其次是注意webgl中Y轴向上是正方向因为WebGL坐标系,Y轴向上为正,而Canvas坐标系向下为正。在Y坐标转化的时候,坐标相减后,前面加一个负号。

在三维图形渲染中,基于多个 XYZ 坐标系创建立体画面涉及多个关键步骤,包括坐标系定义、模型构建、视图变换、投影变换最终的渲染过程。以下是一个详细的说明: ### 三维坐标系的定义模型构建 三维空间中的每个物体都可以通过一组点(顶点)来表示,每个点由 (X, Y, Z) 坐标确定[^1]。为了在多个坐标系中创建三维立体画面,需要为每个物体定义局部坐标系,并将其全局坐标系关联。局部坐标系允许每个物体独立地进行变换,例如平移、旋转缩放。 例如,一个立方体可以由八个顶点组成,每个顶点在局部坐标系中的坐标是固定的,而在全局坐标系中,这些顶点可以通过变换矩阵进行移动旋转。 ```javascript // 示例:定义立方体的局部坐标系顶点 const localVertices = [ [-1, -1, -1], [1, -1, -1], [1, 1, -1], [-1, 1, -1], // 底面 [-1, -1, 1], [1, -1, 1], [1, 1, 1], [-1, 1, 1] // 顶面 ]; ``` ### 变换矩阵的应用 为了将局部坐标系中的点转换到全局坐标系中,需要使用变换矩阵。变换矩阵包括平移、旋转缩放矩阵。这些矩阵可以通过矩阵乘法组合在一起,形成一个最终的模型变换矩阵。 ```javascript // 示例:创建平移旋转矩阵 function createTranslationMatrix(x, y, z) { return [ [1, 0, 0, x], [0, 1, 0, y], [0, 0, 1, z], [0, 0, 0, 1] ]; } function createRotationMatrixX(angle) { const rad = angle * Math.PI / 180; return [ [1, 0, 0, 0], [0, Math.cos(rad), -Math.sin(rad), 0], [0, Math.sin(rad), Math.cos(rad), 0], [0, 0, 0, 1] ]; } function multiplyMatrices(a, b) { // 矩阵乘法实现 } ``` ### 视图变换投影变换 在三维图形渲染中,视图变换(View Transformation)将场景中的物体从全局坐标系转换到相机坐标系。投影变换(Projection Transformation)则将三维坐标映射到二维屏幕坐标。常用的投影方式包括正交投影透视投影。 ```javascript // 示例:创建透视投影矩阵 function createPerspectiveMatrix(fov, aspect, near, far) { const f = 1 / Math.tan(fov * Math.PI / 360); return [ [f / aspect, 0, 0, 0], [0, f, 0, 0], [0, 0, (far + near) / (near - far), -1], [0, 0, (2 * far * near) / (near - far), 0] ]; } ``` ### 渲染流程 渲染流程通常包括以下步骤: 1. **模型变换**:将局部坐标系中的顶点通过变换矩阵转换到全局坐标系。 2. **视图变换**:将全局坐标系中的顶点转换到相机坐标系。 3. **投影变换**:将相机坐标系中的顶点投影到二维屏幕坐标。 4. **光栅化**:将投影后的二维坐标转换为像素,并进行填充。 在实际应用中,这些步骤可以通过 WebGL 或其他图形库(如 Three.js)来实现。WebGL 是一种低级别的 3D 图形 API,可以直接在 HTML5 的 `<canvas>` 元素中进行渲染。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值