蛋糕本身就是圓柱體堆疊而來的,所以只要去繪製圓柱體
並且做出Y軸差異,堆疊起來及渲染即可
結果:
代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>生日蛋糕</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
</head>
<body>
<script>
const width = window.innerWidth;
const height = window.innerHeight;
const k = width / height;
const s = 200;
const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
const fontLoader = new THREE.FontLoader();
const scene = new THREE.Scene();
const cake = new THREE.Group();
const renderer = new THREE.WebGLRenderer();
function create() {
renderer.setSize(width, height);
renderer.setClearColor(0xFFFFFF, 1);
document.body.appendChild(renderer.domElement);
camera.position.set(0, 100, 500)
camera.lookAt(scene.position);
const light = new THREE.AmbientLight(0xCCCCCC);
scene.add(light);
const cakeTexture = new THREE.TextureLoader().load('https://live.staticflickr.com/8658/16455799840_1cf3d228b8_c.jpg');
const cakeMaterail = new THREE.MeshBasicMaterial({map: cakeTexture})
const pinkMaterial = new THREE.MeshBasicMaterial({color: 'pink'})
const cakeGeometry = new THREE.CylinderBufferGeometry(120, 120, 70, 40);
const cakePart = new THREE.Mesh(cakeGeometry,[cakeMaterail, pinkMaterial, pinkMaterial])
cakePart.translateY(-25)
const cakeGeometry2 = new THREE.CylinderBufferGeometry(140, 140, 60, 40);
const cakePart2 = new THREE.Mesh(cakeGeometry2, [cakeMaterail, pinkMaterial, pinkMaterial])
cakePart2.translateY(-90)
const cakeGeometry3 = new THREE.CylinderBufferGeometry(160, 160, 10, 40);
const cakePart3 = new THREE.Mesh(cakeGeometry3, [cakeMaterail, cakeMaterail, cakeMaterail])
cakePart3.translateY(-120)
cake.add(cakePart)
cake.add(cakePart2)
cake.add(cakePart3)
scene.add(cake)
}
function render() {
renderer.render(scene, camera)
cake.rotation.y = 0
requestAnimationFrame(render)
}
create()
render()
</script>
</body>
</html>