案例 - 1
案例 - 1 - 源码
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
import gsap from 'gsap'
import { Water } from 'three/examples/jsm/objects/Water2.js'
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(0, 0, 20)
scene.add(camera)
const rgbeLoader = new RGBELoader()
rgbeLoader.loadAsync('../public/assets/2k.hdr').then(texture => {
texture.mapping = THREE.EquirectangularReflectionMapping
scene.background = texture
scene.environment = texture
})
const gltfLoader = new GLTFLoader()
gltfLoader.load('./assets/model/newyears_min.glb', gltf => {
console.log('gltf=', gltf)
scene.add(gltf.scene)
let waterGeometry = new THREE.PlaneGeometry(100, 100)
let water = new Water(waterGeometry, {
scale: 4,
textureHeight: 1024,
textureWidth: 1024,
normalMap0: new THREE.TextureLoader().load('../public/textures/water/Water_1_M_Normal.jpg', texture => {
texture.wrapS = texture.wrapT = THREE.RepeatWrapping
}), `水的纹理,不加就是个平面,没有动态的`
normalMap1: new THREE.TextureLoader().load('../public/textures/water/Water_2_M_Normal.jpg', texture => {
texture.wrapS = texture.wrapT = THREE.RepeatWrapping
}) `水的纹理,不加就是个平面,没有动态的`
})
water.position.y = 1
water.rotation.x = -Math.PI / 2
scene.add(water)
})
const renderer = new THREE.WebGLRenderer()
renderer.outputColorSpace = THREE.SRGBColorSpace
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.toneMappingExposure = 1
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true
controls.autoRotate = true
controls.autoRotateSpeed = 0.1
const animate = () => {
controls.update()
requestAnimationFrame(animate)
renderer.render(scene, camera)
}
animate()
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight
camera.updateProjectionMatrix()
renderer.setSize(window.innerWidth, window.innerHeight)
renderer.setPixelRatio(window.devicePixelRatio)
})
案例 - 2
案例 - 2 - 源码
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
import { Water } from 'three/examples/jsm/objects/Water2.js'
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(5, 5, 5)
scene.add(camera)
const axesHelper = new THREE.AxesHelper(5)
scene.add(axesHelper)
const rgbeLoader = new RGBELoader()
rgbeLoader.loadAsync('../public/assets/050.hdr').then(texture => {
texture.mapping = THREE.EquirectangularReflectionMapping
scene.background = texture
scene.environment = texture
})
const gltfLoader = new GLTFLoader()
gltfLoader.load('../public/assets/model/yugang.glb', gltf => {
console.log('gltf=', gltf)
const yugang = gltf.scene.children[0]
yugang.material.side = THREE.DoubleSide
const waterGeometry = gltf.scene.children[1].geometry
const water = new Water(waterGeometry, {
color: '#ffffff',
scale: 1,
flowDirection: new THREE.Vector2(1,1),
textureHeight: 1024,
textureWidth: 1024,
normalMap0: new THREE.TextureLoader().load('../public/textures/water/Water_1_M_Normal.jpg', texture => {
texture.wrapS = texture.wrapT = THREE.RepeatWrapping
}),
normalMap1: new THREE.TextureLoader().load('../public/textures/water/Water_2_M_Normal.jpg', texture => {
texture.wrapS = texture.wrapT = THREE.RepeatWrapping
})
})
scene.add(water)
scene.add(yugang)
})
const light = new THREE.AmbientLight(0xffffff)
light.intensity = 10
scene.add(light)
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
scene.add(directionalLight)
const renderer = new THREE.WebGLRenderer()
renderer.outputEncoding = THREE.sRGBEncoding
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true
const animate = () => {
requestAnimationFrame(animate)
renderer.render(scene, camera)
}
animate()
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight
camera.updateProjectionMatrix()
renderer.setSize(window.innerWidth, window.innerHeight)
renderer.setPixelRatio(window.devicePixelRatio)
})