【Three.js基础学习】20.Environment map

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

课程回顾:

    模型的加载

    GLTFLoader

    环境贴图实现;

    CubeTextureLoader

    LDR:低动态范围

    backgroundBlurriness:设置背景模糊 (不生效 为什么?)

    backgroundIntensity: 设置背景强度,设置的是背景亮度 (不生效 为什么?)

    HDRI :  等距矩形环境贴图

    如何加载使用HDRI文件?

    RGBE :红色 ,绿色 ,蓝色 ,指数:存储的是亮度 (重点)

    我们需要使用RGBELoader。"RGBE"代表"红绿蓝指数",指数存储亮度

    这是“HDR”格式的编码。

    THREE.EquirectangularReflectionMapping // 等距型反射

    THREE.EquirectangularRefractionMapping // 折射透明

    HDRI 缺点

        文件加载渲染较大

    建议只对光照使用HDRI

    ?上面实现中有一个问题,如何解决环境贴图对模型的影响

    1.blender如何生成环境地图?

    在blender制作

    2.使用NVIDA Canvas生成环境地图

    https://www.nvidia.cn/studio/canvas/

        类型:exr后缀

        扩展名是.exr,而不是.hdr。我们导出的文件也是存储的颜色范围的“HDR”图像,但编码不同

        EXR还可以存储层,并具有alpha通道

   

    3. 环境贴图 (收费)

        https://skybox.blockadelabs.com/

   

    时间环境地图

    真实的光 : 如何让甜甜圈模型 产生光?

        需要创建自己的立方体纹理,更textureLoad差不多,在每一帧中做处理;因此使用webgl立方体渲染器目标

   

    这个时候模型还是黑色

    需要一个特殊的相机。 如果想要渲染就需要一个相机进行拍摄

    WebGLCubeRenderTarget

    分成解决相机渲染,决定显示什么

    object.layers.enable(..)将添加一个图层

    object.layers.disable(...)将移除一个图层

    object.layers.set(...)将自动启用一个图层并禁用所有其他图层

一、代码

import * as THREE from 'three'
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'
import GUI from 'lil-gui'
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js'
import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'
import {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'
import { Mapping, Mesh } from 'three'


/* 
* Loaders
*/
const gltfLoader = new GLTFLoader()
const cubeTextrueLoader = new THREE.CubeTextureLoader()
const rgbeLoader = new RGBELoader()
const exrLoader = new EXRLoader()
const textureLoader = new THREE.TextureLoader()

/**
 * gui
 */
 const gui = new GUI()
 const global = {
 }

// Canvas
const canvas = document.querySelector('canvas.webgl')

/**
 * scene
 */
const scene = new THREE.Scene()
/*
    Updata all materials
*/
const updateAllMaterials = () => {
    scene.traverse((child)=>{ //  遍历
        if(child.isMesh && child.material.isMeshStandardMaterial){
            child.material.envMapIntensity = global.envMapIntensity
        }
    })
}

/* 
    environmentMap 环境贴图
*/
scene.backgroundBlurriness = 0
scene.backgroundIntensity = 1
// global intensity 
global.envMapIntensity = 1 // 环境贴图强度
gui
    .add(global,'envMapIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    .onChange(updateAllMaterials)
gui
    .add(scene, 'backgroundBlurriness')
    .min(0)
    .max(1)
    .step(0.001)
gui
    .add(scene, 'backgroundIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    

// LDR cube texture  环境贴图的实现
// const environmentMap = cubeTextrueLoader.load([
//     '/environmentMaps/2/px.png',
//     '/environmentMaps/2/nx.png',
//     '/environmentMaps/2/py.png',
//     '/environmentMaps/2/ny.png',
//     '/environmentMaps/2/pz.png',
//     '/environmentMaps/2/nz.png',
// ])
// scene.environment = environmentMap  // 可以实现场景中每一个网格材质对于场景起到作用
// scene.background = environmentMap // 将环境贴图应用到场景中


// HDR (RGBA) equirectangular
// rgbeLoader.load(
//     '/environmentMaps/测试hdr生成全景3.hdr',
//     (environmentMap)=>{
//         environmentMap.mapping = THREE.EquirectangularReflectionMapping
//         scene.background = environmentMap
//         scene.environment = environmentMap
//     }
// )

// HDR (EXR) equirectangular
// exrLoader.load('/environmentMaps/nvidiaCanvas-4k.exr',(environmentMap)=>{
//     environmentMap.mapping = THREE.EquirectangularReflectionMapping
//     scene.background = environmentMap
//     scene.environment = environmentMap
// })

// LDR equirectangular
// const environmentMap = textureLoader.load('') //没资源
// environmentMap.mapping = THREE.EquirectangularReflectionMapping
// environmentMap.colorSpace = THREE.SRGBColorSpace
// scene.background = environmentMap
// scene.environment = environmentMap

// Ground projected skybox
// rgbeLoader.load('/environmentMaps/1/little_paris_eiffel_tower_8k.hdr',(environmentMap)=>{
//     environmentMap.mapping = THREE.EquirectangularReflectionMapping
//     scene.environment = environmentMap
//     scene.background = environmentMap
// })

/* 
    Real time environment map
*/
const environmentMap = textureLoader.load('/environmentMaps/blockadesLabsSkybox/interior_views_cozy_wood_cabin_with_cauldron_and_p.jpg')
environmentMap.mapping = THREE.EquirectangularReflectionMapping
environmentMap.colorSpace = THREE.SRGBColorSpace

scene.background = environmentMap

/* 
    holyDount
*/
const holyDonut = new THREE.Mesh(
    new THREE.TorusGeometry(8,0.5),
    new THREE.MeshBasicMaterial({color:new THREE.Color(10, 4, 2)})
)
holyDonut.layers.enable(1) // 分层启用
holyDonut.position.y = 3.5
scene.add(holyDonut)

/* 
    cube render target
*/
const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(
    256, // 分辨率
    { // 渲染目标的选项
        type:THREE.FloatType  // 类型
    }
)

scene.environment = cubeRenderTarget.texture // 使用自己的纹理

// Cube Camera
const cubeCamera = new THREE.CubeCamera(0.1,100,cubeRenderTarget) // 要每一帧渲染
cubeCamera.layers.set(1) // 设置相机分成

/**
 * torus knot
 */
const torusKnot = new THREE.Mesh(
    new THREE.TorusKnotGeometry(1, 0.4, 100, 16),
    new THREE.MeshStandardMaterial({
        roughness: 0,
        metalness: 1,
        color: 0xaaaaaa
    })
)
torusKnot.position.x = -4
torusKnot.position.y = 4
scene.add(torusKnot)

/* 
* Models
*/
gltfLoader.load(
    '/models/FlightHelmet/glTF/FlightHelmet.gltf',
    (gltf)=>{
        gltf.scene.scale.set(10,10,10)
        scene.add(gltf.scene)
        updateAllMaterials()
    }
)


/**
 * Sizes
 */
const sizes = {
    width: window.innerWidth,
    height: window.innerHeight
}

window.addEventListener('resize', () => {
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})

/**
 * camera
 */
 const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
 camera.position.set(- 8, 4, 8)
 scene.add(camera)

/**
 * renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
// renderer.shadowMap.enabled = true
// renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))


/**
 * control
 */
const controls = new OrbitControls(camera, canvas)
controls.target.y = 3.5
controls.enableDamping = true

/**
 * tick
 */
const clock = new THREE.Clock()
const tick = () => {
    // Time
    const elapsedTime = clock.getElapsedTime()

    if(holyDonut){
        holyDonut.rotation.x = Math.sin(elapsedTime) * 2
        cubeCamera.update(renderer, scene)
    }

    controls.update()
    renderer.render(scene, camera)
    requestAnimationFrame(tick)
}
tick()

二、知识点

1.LDR

import * as THREE from 'three'
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'
import GUI from 'lil-gui'
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js'
import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'
import {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'
import { Mapping, Mesh } from 'three'


/* 
* Loaders
*/
const gltfLoader = new GLTFLoader()
const cubeTextrueLoader = new THREE.CubeTextureLoader()
const rgbeLoader = new RGBELoader()
const exrLoader = new EXRLoader()
const textureLoader = new THREE.TextureLoader()

/**
 * gui
 */
 const gui = new GUI()
 const global = {
 }

// Canvas
const canvas = document.querySelector('canvas.webgl')

/**
 * scene
 */
const scene = new THREE.Scene()
/*
    Updata all materials
*/
const updateAllMaterials = () => {
    scene.traverse((child)=>{ //  遍历
        if(child.isMesh && child.material.isMeshStandardMaterial){
            child.material.envMapIntensity = global.envMapIntensity
        }
    })
}

/* 
    environmentMap 环境贴图
*/
scene.backgroundBlurriness = 0
scene.backgroundIntensity = 1
// global intensity 
global.envMapIntensity = 1 // 环境贴图强度
gui
    .add(global,'envMapIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    .onChange(updateAllMaterials)
gui
    .add(scene, 'backgroundBlurriness')
    .min(0)
    .max(1)
    .step(0.001)
gui
    .add(scene, 'backgroundIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    

// LDR cube texture  环境贴图的实现
const environmentMap = cubeTextrueLoader.load([
    '/environmentMaps/2/px.png',
    '/environmentMaps/2/nx.png',
    '/environmentMaps/2/py.png',
    '/environmentMaps/2/ny.png',
    '/environmentMaps/2/pz.png',
    '/environmentMaps/2/nz.png',
])
scene.environment = environmentMap  // 可以实现场景中每一个网格材质对于场景起到作用
scene.background = environmentMap // 将环境贴图应用到场景中


/**
 * torus knot
 */
const torusKnot = new THREE.Mesh(
    new THREE.TorusKnotGeometry(1, 0.4, 100, 16),
    new THREE.MeshStandardMaterial({
        roughness: 0,
        metalness: 1,
        color: 0xaaaaaa
    })
)
torusKnot.position.x = -4
torusKnot.position.y = 4
scene.add(torusKnot)

/* 
* Models
*/
gltfLoader.load(
    '/models/FlightHelmet/glTF/FlightHelmet.gltf',
    (gltf)=>{
        gltf.scene.scale.set(10,10,10)
        scene.add(gltf.scene)
        updateAllMaterials()
    }
)


/**
 * Sizes
 */
const sizes = {
    width: window.innerWidth,
    height: window.innerHeight
}

window.addEventListener('resize', () => {
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})

/**
 * camera
 */
 const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
 camera.position.set(- 8, 4, 8)
 scene.add(camera)

/**
 * renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
// renderer.shadowMap.enabled = true
// renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))


/**
 * control
 */
const controls = new OrbitControls(camera, canvas)
controls.target.y = 3.5
controls.enableDamping = true

/**
 * tick
 */
const clock = new THREE.Clock()
const tick = () => {
    // Time
    const elapsedTime = clock.getElapsedTime()


    controls.update()
    renderer.render(scene, camera)
    requestAnimationFrame(tick)
}
tick()

2.HDR (RGBA)

import * as THREE from 'three'
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'
import GUI from 'lil-gui'
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js'
import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'
import {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'
import { Mapping, Mesh } from 'three'

/* 
* Loaders
*/
const gltfLoader = new GLTFLoader()
const cubeTextrueLoader = new THREE.CubeTextureLoader()
const rgbeLoader = new RGBELoader()
const exrLoader = new EXRLoader()
const textureLoader = new THREE.TextureLoader()

/**
 * gui
 */
 const gui = new GUI()
 const global = {
 }

// Canvas
const canvas = document.querySelector('canvas.webgl')

/**
 * scene
 */
const scene = new THREE.Scene()
/*
    Updata all materials
*/
const updateAllMaterials = () => {
    scene.traverse((child)=>{ //  遍历
        if(child.isMesh && child.material.isMeshStandardMaterial){
            child.material.envMapIntensity = global.envMapIntensity
        }
    })
}

/* 
    environmentMap 环境贴图
*/
scene.backgroundBlurriness = 0
scene.backgroundIntensity = 1
// global intensity 
global.envMapIntensity = 1 // 环境贴图强度
gui
    .add(global,'envMapIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    .onChange(updateAllMaterials)
gui
    .add(scene, 'backgroundBlurriness')
    .min(0)
    .max(1)
    .step(0.001)
gui
    .add(scene, 'backgroundIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    


// HDR (RGBA) equirectangular
rgbeLoader.load(
    '/environmentMaps/测试hdr生成全景3.hdr',
    (environmentMap)=>{
        environmentMap.mapping = THREE.EquirectangularReflectionMapping
        scene.background = environmentMap
        scene.environment = environmentMap
    }
)


/**
 * torus knot
 */
const torusKnot = new THREE.Mesh(
    new THREE.TorusKnotGeometry(1, 0.4, 100, 16),
    new THREE.MeshStandardMaterial({
        roughness: 0,
        metalness: 1,
        color: 0xaaaaaa
    })
)
torusKnot.position.x = -4
torusKnot.position.y = 4
scene.add(torusKnot)

/* 
* Models
*/
gltfLoader.load(
    '/models/FlightHelmet/glTF/FlightHelmet.gltf',
    (gltf)=>{
        gltf.scene.scale.set(10,10,10)
        scene.add(gltf.scene)
        updateAllMaterials()
    }
)


/**
 * Sizes
 */
const sizes = {
    width: window.innerWidth,
    height: window.innerHeight
}

window.addEventListener('resize', () => {
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})

/**
 * camera
 */
 const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
 camera.position.set(- 8, 4, 8)
 scene.add(camera)

/**
 * renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
// renderer.shadowMap.enabled = true
// renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))


/**
 * control
 */
const controls = new OrbitControls(camera, canvas)
controls.target.y = 3.5
controls.enableDamping = true

/**
 * tick
 */
const clock = new THREE.Clock()
const tick = () => {
    // Time
    const elapsedTime = clock.getElapsedTime()



    controls.update()
    renderer.render(scene, camera)
    requestAnimationFrame(tick)
}
tick()

3.HDR (EXR)

import * as THREE from 'three'
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'
import GUI from 'lil-gui'
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js'
import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'
import {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'
import { Mapping, Mesh } from 'three'

/* 
* Loaders
*/
const gltfLoader = new GLTFLoader()
const cubeTextrueLoader = new THREE.CubeTextureLoader()
const rgbeLoader = new RGBELoader()
const exrLoader = new EXRLoader()
const textureLoader = new THREE.TextureLoader()

/**
 * gui
 */
 const gui = new GUI()
 const global = {
 }

// Canvas
const canvas = document.querySelector('canvas.webgl')

/**
 * scene
 */
const scene = new THREE.Scene()
/*
    Updata all materials
*/
const updateAllMaterials = () => {
    scene.traverse((child)=>{ //  遍历
        if(child.isMesh && child.material.isMeshStandardMaterial){
            child.material.envMapIntensity = global.envMapIntensity
        }
    })
}

/* 
    environmentMap 环境贴图
*/
scene.backgroundBlurriness = 0
scene.backgroundIntensity = 1
// global intensity 
global.envMapIntensity = 1 // 环境贴图强度
gui
    .add(global,'envMapIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    .onChange(updateAllMaterials)
gui
    .add(scene, 'backgroundBlurriness')
    .min(0)
    .max(1)
    .step(0.001)
gui
    .add(scene, 'backgroundIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    


// HDR (EXR) equirectangular
exrLoader.load('/environmentMaps/nvidiaCanvas-4k.exr',(environmentMap)=>{
    environmentMap.mapping = THREE.EquirectangularReflectionMapping
    scene.background = environmentMap
    scene.environment = environmentMap
})

/**
 * torus knot
 */
const torusKnot = new THREE.Mesh(
    new THREE.TorusKnotGeometry(1, 0.4, 100, 16),
    new THREE.MeshStandardMaterial({
        roughness: 0,
        metalness: 1,
        color: 0xaaaaaa
    })
)
torusKnot.position.x = -4
torusKnot.position.y = 4
scene.add(torusKnot)

/* 
* Models
*/
gltfLoader.load(
    '/models/FlightHelmet/glTF/FlightHelmet.gltf',
    (gltf)=>{
        gltf.scene.scale.set(10,10,10)
        scene.add(gltf.scene)
        updateAllMaterials()
    }
)


/**
 * Sizes
 */
const sizes = {
    width: window.innerWidth,
    height: window.innerHeight
}

window.addEventListener('resize', () => {
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})

/**
 * camera
 */
 const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
 camera.position.set(- 8, 4, 8)
 scene.add(camera)

/**
 * renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
// renderer.shadowMap.enabled = true
// renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))


/**
 * control
 */
const controls = new OrbitControls(camera, canvas)
controls.target.y = 3.5
controls.enableDamping = true

/**
 * tick
 */
const clock = new THREE.Clock()
const tick = () => {
    // Time
    const elapsedTime = clock.getElapsedTime()

    controls.update()
    renderer.render(scene, camera)
    requestAnimationFrame(tick)
}
tick()

4.时间环境地图

import * as THREE from 'three'
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'
import GUI from 'lil-gui'
import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js'
import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'
import {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'
import { Mapping, Mesh } from 'three'


/* 
* Loaders
*/
const gltfLoader = new GLTFLoader()
const cubeTextrueLoader = new THREE.CubeTextureLoader()
const rgbeLoader = new RGBELoader()
const exrLoader = new EXRLoader()
const textureLoader = new THREE.TextureLoader()

/**
 * gui
 */
 const gui = new GUI()
 const global = {
 }

// Canvas
const canvas = document.querySelector('canvas.webgl')

/**
 * scene
 */
const scene = new THREE.Scene()
/*
    Updata all materials
*/
const updateAllMaterials = () => {
    scene.traverse((child)=>{ //  遍历
        if(child.isMesh && child.material.isMeshStandardMaterial){
            child.material.envMapIntensity = global.envMapIntensity
        }
    })
}

/* 
    environmentMap 环境贴图
*/
scene.backgroundBlurriness = 0
scene.backgroundIntensity = 1
// global intensity 
global.envMapIntensity = 1 // 环境贴图强度
gui
    .add(global,'envMapIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    .onChange(updateAllMaterials)
gui
    .add(scene, 'backgroundBlurriness')
    .min(0)
    .max(1)
    .step(0.001)
gui
    .add(scene, 'backgroundIntensity')
    .min(0)
    .max(10)
    .step(0.001)
    

/* 
    Real time environment map
*/
const environmentMap = textureLoader.load('/environmentMaps/blockadesLabsSkybox/interior_views_cozy_wood_cabin_with_cauldron_and_p.jpg')
environmentMap.mapping = THREE.EquirectangularReflectionMapping
environmentMap.colorSpace = THREE.SRGBColorSpace

scene.background = environmentMap

/* 
    holyDount
*/
const holyDonut = new THREE.Mesh(
    new THREE.TorusGeometry(8,0.5),
    new THREE.MeshBasicMaterial({color:new THREE.Color(10, 4, 2)})
)
holyDonut.layers.enable(1) // 分层启用
holyDonut.position.y = 3.5
scene.add(holyDonut)

/* 
    cube render target
*/
const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(
    256, // 分辨率
    { // 渲染目标的选项
        type:THREE.FloatType  // 类型
    }
)

scene.environment = cubeRenderTarget.texture // 使用自己的纹理

// Cube Camera
const cubeCamera = new THREE.CubeCamera(0.1,100,cubeRenderTarget) // 要每一帧渲染
cubeCamera.layers.set(1) // 设置相机分成

/**
 * torus knot
 */
const torusKnot = new THREE.Mesh(
    new THREE.TorusKnotGeometry(1, 0.4, 100, 16),
    new THREE.MeshStandardMaterial({
        roughness: 0,
        metalness: 1,
        color: 0xaaaaaa
    })
)
torusKnot.position.x = -4
torusKnot.position.y = 4
scene.add(torusKnot)

/* 
* Models
*/
gltfLoader.load(
    '/models/FlightHelmet/glTF/FlightHelmet.gltf',
    (gltf)=>{
        gltf.scene.scale.set(10,10,10)
        scene.add(gltf.scene)
        updateAllMaterials()
    }
)


/**
 * Sizes
 */
const sizes = {
    width: window.innerWidth,
    height: window.innerHeight
}

window.addEventListener('resize', () => {
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})

/**
 * camera
 */
 const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
 camera.position.set(- 8, 4, 8)
 scene.add(camera)

/**
 * renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
// renderer.shadowMap.enabled = true
// renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))


/**
 * control
 */
const controls = new OrbitControls(camera, canvas)
controls.target.y = 3.5
controls.enableDamping = true

/**
 * tick
 */
const clock = new THREE.Clock()
const tick = () => {
    // Time
    const elapsedTime = clock.getElapsedTime()

    if(holyDonut){
        holyDonut.rotation.x = Math.sin(elapsedTime) * 2
        cubeCamera.update(renderer, scene)
    }

    controls.update()
    renderer.render(scene, camera)
    requestAnimationFrame(tick)
}
tick()

真实时间环境地图


总结

环境地图多种加载方式,以及用法。还有关于环境地图资源如何寻找,怎么自己在blender制作环境地图等

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值