threejs坐标转换

屏幕坐标转three.js坐标

将屏幕坐标转变成threejs空间坐标:

function transToThreeCoord(x,y){
        let mouse = new THREE.Vector3();
        mouse.x = (x/window.innerWidth)*2 -1;
        mouse.y = -(y/window.innerHeight)*2 + 1;
       return mouse;
}

注意:在实际使用中,画布的宽高度并不一定是window.innerWidth或window.innerHeight,要根据画布实际的宽高度进行替换

推导过程如下:

这里写图片描述

上图中的式子化简一下就能得到transToThreeCoord中的公式

three.js坐标转屏幕坐标

将three.js三维坐标转换成屏幕上的二维坐标

/**
* 将three.js三维坐标转换成屏幕上的二维坐标
* @param THREE.Vector3 vector three.js三维坐标
* @return {x:int,y:int} 屏幕坐标
*/
function transToScreenCoord(vector) {
    var screenCoord = {};
    vector.project(camera);
    screenCoord.x = (0.5 + vector.x / 2) * window.innerWidth; 
    screenCoord.y = (0.5 - vector.y / 2) * window.innerHeight;
    return screenCoord;
}

注意:在实际使用中,画布的宽高度并不一定是window.innerWidth或window.innerHeight,要根据画布实际的宽高度进行替换

接下来解释一下这个转换的过程:

vector.project(camera) 这句的意思是,将一个三维坐标,投影到相机平面上,使之变成一个二维坐标。需要注意的是,投影得到的结果是一个标准向量(或者叫单位向量),其值是限定在[-1,1]范围内的。并且,这个向量是定义在以屏幕中心为原点的坐标系里的,这个坐标系和屏幕坐标系的关系,就像下图一样:

这里写图片描述

假如经过投影之后的点就是上图中的点A(0.3,0.5),屏幕坐标系是sx-s0-sy,相机平面坐标系是tx-t0-ty,坐标系的各项参数已经标在图上,试着求A点在屏幕坐标系中的坐标。你求一遍的话,就会理解

screenCoord.x = (0.5 + vector.x / 2) * window.innerWidth; 
screenCoord.y = (0.5 - vector.y / 2) * window.innerHeight;

的意思。

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值