javascript - que - three.js skybox asignado a la cámara
webgl three js documentation (2)
Entonces, después de indagar en los ejemplos de Three.js, encontré la forma de hacerlo. http://learningthreejs.com/blog/2011/08/15/lets-do-a-sky/ está desactualizado. Una forma utilizada en los ejemplos es agregar skybox en la segunda escena con cámara fija y representar ambas escenas. Mira el ejemplo webgl_materials_cars.html.
Además, debido a que uso una cámara de tercera persona asignada al personaje, debo obtener una rotación mundial desde la cámara de caracteres a la cámara de la caja del cielo. Esto se puede hacer en render con:
function render(){
<...>
skyboxCamera.rotation.setEulerFromRotationMatrix( new THREE.Matrix4().extractRotation( camera.matrixWorld ), skyboxCamera.eulerOrder );
renderer.render(skyboxScene, skyboxCamera);
renderer.render(scene, camera);
<...>
}
Estoy tratando de hacer que Skybox esté asignado a la cámara del jugador. Cuando la cámara se mueve (también se mueve con Skybox), la textura se estira. ¿Cómo deshacerse de esto?
Código:
var textureCube = THREE.ImageUtils.loadTextureCube( urls );
textureCube.format = THREE.RGBFormat;
var shader = THREE.ShaderUtils.lib[ "cube" ];
shader.uniforms[ "tCube" ].value = textureCube;
cubematerial = new THREE.ShaderMaterial({
fragmentShader: shader.fragmentShader,
vertexShader: shader.vertexShader,
uniforms: shader.uniforms,
depthWrite: false,
side: THREE.BackSide
});
skyBox = new THREE.Mesh(new THREE.CubeGeometry(1000,1000,1000), cubematerial);
camera.add(skyBox);
Sé que es una pregunta cerrada, pero quiero ofrecer una alternativa que no requiera una escena adicional, para futuros buscadores:
Comience leyendo y siguiendo este tutorial: http://learningthreejs.com/blog/2011/08/15/lets-do-a-sky/
Ahora crea el siguiente shader (lo agregué a three.js ShaderLib, pero si no quieres atemperarlo con tres ''código fuente, agrégalo afuera):
''skybox'': { uniforms: { "tCube": { type: "t", value: null }, "tFlip": { type: "f", value: -1 } }, vertexShader: [ "varying vec3 vWorldPosition;", THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], "void main() {", " vec4 worldPosition = modelMatrix * vec4( position, 1.0 );", " vWorldPosition = worldPosition.xyz;", " gl_Position = projectionMatrix * modelViewMatrix * vec4( position + cameraPosition, 1.0 );", THREE.ShaderChunk[ "logdepthbuf_vertex" ], "}" ].join("/n"), fragmentShader: [ "uniform samplerCube tCube;", "uniform float tFlip;", "varying vec3 vWorldPosition;", THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], "void main() {", " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", THREE.ShaderChunk[ "logdepthbuf_fragment" ], "}" ].join("/n")
},
crea tu skybox así:
// urls is a list of textures to use var cubemap = THREE.ImageUtils.loadTextureCube(urls); cubemap.format = THREE.RGBFormat; var shader = THREE.ShaderLib[''skybox'']; // init the skybox shader we created above shader.uniforms[''tCube''].value = cubemap; // apply textures to shader // create shader material var skyBoxMaterial = new THREE.ShaderMaterial( { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: shader.uniforms, depthWrite: false, side: THREE.BackSide }); // create skybox mesh var skybox = new THREE.Mesh( new THREE.CubeGeometry(1000, 1000, 1000), skyBoxMaterial ); // THIS IS IMPORTANT! or the skybox will get culled after you move the camera too far.. skybox.frustumCulled = false;