three.js 硬核代码片段(长期更新)

Three.js 硬核代码片段(长期更新)

1 获取相机朝向(方向向量)
// 获取相机朝向
const forward = new THREE.Vector3();
forward.set(0, 0, -1).applyQuaternion(camera.quaternion);
2 坐标系变换
// 1 世界坐标转屏幕坐标
function world2screen(v, camera) {
    var vector = v.clone().project(camera);
    vector.x = Math.round(((vector.x + 1) / 2) * window.innerWidth);
    vector.y = Math.round((-(vector.y - 1) / 2) * window.innerHeight);
    return {
        x: vector.x,
        y: vector.y
    };
}

// 2 屏幕坐标转NDC
function screen2ndc(screenPos, screenWidth, screenHeight) {
    const ndc = {
        x: (screenPos.x / screenWidth) * 2 - 1,
        y: -(screenPos.y / screenHeight) * 2 + 1,
        z: 0
    };
    return ndc;
}

// 3 NDC转屏幕
function ndc2screen(ndcPos, screenWidth, screenHeight) {
    const screen = {
        x: ((ndcPos.x + 1) / 2) * screenWidth,
        y: (-(ndcPos.y - 1) / 2) * screenHeight,
        z: 0
    };
    return screen;
}

// 4 NDC转屏世界
function ndc2world(worldPos = {x: 0, y: 0, z: 0}, ndcPos = {x: 0, y: 0, z: 0}, camera) {
    let worldVec4 = new Vector4(worldPos.x, worldPos.y, worldPos.z, 1.0);
    let ndcVec4 = new Vector4(ndcPos.x, ndcPos.y, ndcPos.z, 1.0);

    // world -> clip, 计算w分量
    worldVec4.applyMatrix4(camera.projectionMatrix);

    // ndc -> clip
    ndcVec4.multiplyScalar(worldVec4.w);
    // clip -> world
    ndcVec4.applyMatrix4(camera.projectionMatrixInverse);

    return {
        x: ndcVec4.x,
        y: ndcVec4.y,
        z: ndcVec4.z
    };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值