three.js多场景应用

333 阅读1分钟
var camera, renderer, controls;
var sceneLP, sceneLD, sceneRP, sceneRD;
var LPVector, LDVector, RPVector, RDVector;
var WIDTH, HEIGHT;

// 创建渲染器
function initRender() {
    WIDTH = window.innerWidth;
    HEIGHT = window.innerHeight;
    renderer = new THREE.WebGLRenderer({
        antialias: true,
    });
    renderer.setSize(WIDTH, HEIGHT);
    renderer.setPixelRatio(WIDTH / HEIGHT);
    //  setScissorTest 启用或禁用剪裁检测. 若启用,则只有在所定义的裁剪区域内的像素才会受之后的渲染器影响。
    renderer.setScissorTest(true);
    document.getElementById('map1').appendChild(renderer.domElement);
}
//  创建场景
function initScene() {
    // 左上
    sceneLP = new THREE.Scene();
    sceneLP.background = new THREE.Color(0x000000);

    // 左下
    sceneLD = new THREE.Scene();
    sceneLD.background = new THREE.Color(0x000000);

    // 右上
    sceneRP = new THREE.Scene();
    sceneRP.background = new THREE.Color(0x000000);

    // 右下
    sceneRD = new THREE.Scene();
    sceneRD.background = new THREE.Color(0x000000);

}


//  创建相机
function initCamera() {
    camera = new THREE.PerspectiveCamera(50, WIDTH / HEIGHT, 1, 10000);
    camera.position.set(0, 0, 50);
    camera.lookAt(0, 0, 0);
    // controls = new THREE.OrbitControls(camera);
}


//  创建灯光
function initLight() {
    //.clone()返回对象物体的克隆
    //  创建环境光 并克隆 分别放入左右场景
    var ambientL = new THREE.AmbientLight(0xffffff, 0.3);
    var ambientR = ambientL.clone();
    sceneLP.add(ambientL);
    sceneLD.add(ambientL);
    sceneRP.add(ambientR);
    sceneRD.add(ambientR);


    //  创建平行光 并克隆 分别放入左右场景
    var directionalL = new THREE.DirectionalLight(0xffffff);
    directionalL.position.set(0, 0, 1);
    var directionalR = directionalL.clone();
    sceneLP.add(directionalL);
    sceneLD.add(directionalL);
    sceneRP.add(directionalR);
    sceneRD.add(directionalR);
}


//  创建对象
function initObject() {
    //立方几何体
    var geometry = new THREE.BoxGeometry(5, 5, 5);
    var material = new THREE.MeshLambertMaterial({ color: 0x00ffff });
    var cube = new THREE.Mesh(geometry, material);
    cube.position.set(22, -10, 0);
    // 加入左边场景中
    sceneRD.add(cube)


    //二十面几何体
    var geometry = new THREE.IcosahedronGeometry(5);
    var material = new THREE.MeshLambertMaterial({ color: 0xff0000 });
    var cube = new THREE.Mesh(geometry, material);
    // 加入右边场景中
    cube.position.set(0, 0, 20);
    // console.log("222", THREE.VTKLoader)
    const loader = new THREE.VTKLoader();
    loader.load('assets/bunny.vtk', function (geometry) {
        geometry.center();
        geometry.computeVertexNormals();
        const material = new THREE.MeshLambertMaterial({ color: 0xffffff });
        const mesh = new THREE.Mesh(geometry, material);
        mesh.scale.multiplyScalar(50);
        mesh.position.set(-22, -10, 0)
        sceneLD.add(mesh);
    });



}

function initThree() {
    initRender();
    initScene();
    initCamera();
    initLight();
    initVector();
    initObject();
    animation();
}


// 各区域初始化点坐标
function initVector() {
    LPVector = new THREE.Vector3(0, 0, 0);
    LDVector = new THREE.Vector3(-22, -10, 0);
    RPVector = new THREE.Vector3(1, 1, 0);
    RDVector = new THREE.Vector3(22, -10, 0);
}

function animation() {
    requestAnimationFrame(animation);
    //  setScissor 将剪裁区域设为(x, y)到(x + width, y + height) 
    renderer.setScissor(80, 50, window.innerWidth / 2.2, window.innerHeight / 2.2);
    renderer.render(sceneLD, camera);

    renderer.setScissor(window.innerWidth / 2, 50, window.innerWidth / 2.2, window.innerHeight / 2.2);
    renderer.render(sceneRD, camera);

    renderer.setScissor(80, window.innerHeight / 2 + 10, window.innerWidth / 2.2, window.innerHeight / 2.2);
    renderer.render(sceneLP, camera);

    renderer.setScissor(window.innerWidth / 2, window.innerHeight / 2 + 10, window.innerWidth / 2.2, window.innerHeight / 2.2);
    renderer.render(sceneRP, camera);

    // controls.update();
}
initThree()

微信图片_20221012155604.jpg