ThreeJS 屏幕坐标与世界坐标互转

本文详细介绍了ThreeJS中屏幕坐标与世界坐标的转换过程,包括从屏幕坐标到世界坐标,以及从世界坐标到屏幕坐标的转换公式和实现方法。涉及到ThreeJS中的空间坐标系、标准设备坐标系和屏幕坐标系的概念及其相互转换。
摘要由CSDN通过智能技术生成

  要理解坐标系间的转换过程,需要提前了解:

  1. ThreeJS 中的几种坐标系
  2. 屏幕坐标系和标准设备坐标系

  不想看链接中的内容这边也有不规范的简述

  物体的坐标转换过程大致为:局部坐标 -> 世界坐标 -> 观察空间坐标 -> 裁剪空间坐标 -> 屏幕空间坐标

  我们将 观察空间坐标系裁剪空间坐标系 之间的转换统一处理,最终得到 标准设备坐标系

  因此坐标转换过程就变成了:局部坐标 -> 世界坐标 -> 标准设备坐标 -> 屏幕空间坐标

  原本世界坐标转换到观察空间坐标需要乘上视图矩阵 CameraMatrixWorldInverse(ViewMatrix)

  随后,观察空间坐标转换到裁剪空间坐标需要乘上相机投影矩阵:ProjectMatrix

  在 ThreeJS 中有一个方法 Vector3.project(camera) 综合了这两步:

project( camera ) {
   
    return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );
}

屏幕坐标系和标准设备坐标

  ThreeJS 是使用了 canvas 画布绘制图形的,因此屏幕坐标系就是 canvas 中的坐标系,也就是左上角是坐标原点:

image-20210117192758975

  在 ThreeJS 中,一个物体可看作一个 MeshMesh 的坐标是用一个 Vector3 来表示的,Vector3 中包含了 xyz 坐标。

  空间坐标系是三维的,其原点默认在屏幕中心,且 x y z 的范围是 [-1,1],因此其 xy 轴在屏幕坐标系中的表示就是:

image-20210117193755299

屏幕坐标转世界坐标

  屏幕坐标转空间坐标需要经过两个步骤:屏幕坐标 -> 标准设备坐标 -> 世界坐标

ThreeJS 中,画布一般是全屏的,因此画布的宽高 w,h 就是:window.innerWidthwindow.innerHeight,所以 Three 的空间坐标系中点 (cx, cy)在屏幕坐标系中就是:(w / 2,h / 2)

(根据情况,有时候宽高会是 canvas.offsetWidthcanvas.offsetHeight

假设 canvas 中有一点 (x,y),这个点在空间坐标系中为 (x1,y1),那么这个转换公式是:
x 1 = ( x / w ) ∗ 2 − 1 x1 = (x / w) * 2 - 1 x1=(x/w)21

y 1 = − ( y / h ) ∗ 2 + 1 y1 = -(y / h) * 2 + 1 y1=(y/h)2+1

公式推导过程如下

  1. 首先,我们知道了空间坐标系中点在屏幕坐标系中的表示: c x = w / 2 cx = w / 2 cx=w/2 c y = h / 2 cy = h / 2 cy=h/2

  2. 那么,屏幕坐标系中的点 ( x

  • 16
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值