three.js天空盒的实现

622 阅读1分钟

天空盒制作

一.下载

全景素材下载:polyhaven.com/zh/hdris/ur…

image-20240129190355075

image-20240129190413386

下载得到源文件:buikslotermeerplein_4k.exr

二.格式转换

  • PS 打开buikslotermeerplein_4k.exr
  • PS 选择导出为jpg格式

image.png

三.裁剪

全景转天空盒:jaxry.github.io/panorama-to…

image.png

  • 按照顺序排序:front.jpg、left.jpg、back.jgp、right.jpg、top.jpg、bottom.jpg
  • PS方向旋转:top.jpg顺时针旋转90度;bottom.jpg逆时针旋转90度

四.three.js实现天空盒的两种方法

方法一:利用CUBETEXTURELOADER设置scene的背景

var path = "../images/flyBox/box2/"; //设置路径
var format = '.jpg'; //设定格式
var urls = [
    path + 'px' + format, path + 'nx' + format,
    path + 'py' + format, path + 'ny' + format,
    path + 'pz' + format, path + 'nz' + format
];
var textureCube = new THREE.CubeTextureLoader().load( urls );
scene.background = textureCube;
//or
scene.background = new THREE.CubeTextureLoader()
.setPath( '../images/flyBox/box2/' )
.load( [ 'px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg' ]
);

方法二:利用着色器

let urls = [
    '../images/flyBox/box2//px.jpg', // right
    '../images/flyBox/box2//nx.jpg', // left
    '../images/flyBox/box2//py.jpg', // top
    '../images/flyBox/box2//ny.jpg', // bottom
    '../images/flyBox/box2//pz.jpg', // back
    '../images/flyBox/box2//nz.jpg' // front
];
let skyboxCubemap = new THREE.CubeTextureLoader().load(urls);
skyboxCubemap.format = THREE.RGBFormat;
let skyboxShader = THREE.ShaderLib['cube'];
skyboxShader.uniforms['tCube'].value = skyboxCubemap;
skyBox = new THREE.Mesh(
    new THREE.BoxGeometry(10000, 10000, 10000),
    new THREE.ShaderMaterial({
        fragmentShader: skyboxShader.fragmentShader,//片段着色器
        vertexShader: skyboxShader.vertexShader,//顶点着色器
        uniforms: skyboxShader.uniforms,//是所有顶点都具有相同的值的变量。 比如灯光,雾,和阴影贴图就是被储存在uniforms中的数据。 uniforms可以通过顶点着色器和片元着色器来访问。
        depthWrite: false,//深度测试
        side: THREE.BackSide//正反面
    })
);
skyBox.name = 'StarSky';