2014-12-22 3 views
1

Я пытаюсь, чтобы мой skybox не был затронут параметром camera.far. Я хотел бы отбросить все другие объекты сцены с этим, а не с skybox.Three.js Unculled SkyBox

Когда я установил skyBox.frustumCulled = false;, это не имеет значения. skyBox быть сеткой конечно.

Это делается путем добавления другого шага визуализации? Если это так, мне понадобится две разные камеры с очень высоким значением, позволяющим просматривать Skybox правильно? Как это можно сделать эффективно?

Для ясности здесь есть отрывок из моей местности объектного кода используется для рисования скайбокса:

shader = THREE.ShaderLib["cube"]; 
    shader.uniforms["tCube"].value = this.cubetexture; 

    mat = new THREE.ShaderMaterial({ 
     uniforms: shader.uniforms, 
     fragmentShader: shader.fragmentShader, 
     vertexShader: shader.vertexShader, 
     depthWrite: false, 
     side: THREE.BackSide 
    }); 

    geo = new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(1024, 1024, 1024)); 

    mesh = new THREE.Mesh(geo, mat); 

    mesh.rotation.y += 90; 

    mesh.scale.x = mesh.scale.y = mesh.scale.z = 50; 

    mesh.frustumCulled = false; 
    mesh.matrixAutoUpdate = false; 
    mesh.rotationAutoUpdate = false; 
    mesh.updateMatrix(); 

    this.skybox = mesh; 

    scene.add(this.skybox); 

ответ

1

Вы хотите добавить скайбокс в «главной» сцене. Лучшим способом выполнения skydome будет создание новой сцены. это будет «фон» для вашей «главной» сцены. Также обсуждается skydomes v.s. skyboxes, просто положить, коробка сохраняет полисы, купол выглядит лучше. в этом примере я буду использовать купол/сферу.

var renderer = new THREE.WebGLRenderer({alpha: true, antialias: true}); 
var mainScene = new THREE.Scene(); 
var mainCamera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 20000); 

var skydome = { 
    scene: new THREE.Scene(), 
    camera: new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 20000); 
}; 

skydome.material = new THREE.MeshBasicMaterial({color: 0x0F0F0F}) //the material for the skydome, for sake of lazyness i took a MeshBasicMaterial. 
skydome.mesh = new THREE.Mesh(new THREE.SphereGeometry(100, 20, 20), skydome.material); 
skydome.scene.add(skydome.mesh); 

сейчас, во время функции рендеринга вы настраиваете только поворот камеры skydome, а не позицию.

var render = function(){ 
    requestAnimationFrame(render); 
    skydome.camera.quaternion = mainCamera.quaternion; 
    renderer.render(skydome.scene, skydome.camera); //first render the skydome 
    renderer.render(mainScene, mainCamera);//then render the rest over the skydome 
}; 
renderer.autoclear = false; //otherwise only the main scene will be rendered. 
+0

Вау! Выглядит потрясающе, я не могу дождаться, когда попробую, когда я вернусь домой =] – Hobbes

+0

Хм, отличный ответ, но почему-то, внедрив свой код, я обнаружил, что только мой skybox визуализируется :( –

Смежные вопросы