three做个三维黄昏寺庙微缩沙盘模型代码
代码语言:html
所属分类:其他
代码由deepseek-v4.1 ai生成,可能有错误,仅供参考:点击查看提示词
代码描述:三维黄昏寺庙微缩沙盘模型
代码标签: three 三维 黄昏 寺庙 微缩 沙盘 模型 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>盛夏黄昏 · 山间古刹</title>
<style>
html, body { margin: 0; padding: 0; height: 100%; overflow: hidden; background: #1c2138; }
canvas { display: block; }
</style>
</head>
<body>
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/three@0.160.0/build/three.module.js",
"three/addons/": "https://unpkg.com/three@0.160.0/examples/jsm/"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
/* =========================================================
0. 渲染器 / 场景 / 相机
========================================================= */
const renderer = new THREE.WebGLRenderer({ antialias: true, powerPreference: 'high-performance' });
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 1.12;
renderer.outputColorSpace = THREE.SRGBColorSpace;
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(38, window.innerWidth / window.innerHeight, 0.5, 1400);
camera.position.set(88, 68, 108);
const controls = new OrbitControls(camera, renderer.domElement);
controls.target.set(0, 9, 0);
controls.enableDamping = true;
controls.dampingFactor = 0.06;
controls.enablePan = false;
controls.minDistance = 62;
controls.maxDistance = 250;
controls.minPolarAngle = 0.14;
controls.maxPolarAngle = Math.PI * 0.468;
controls.autoRotate = true;
controls.autoRotateSpeed = 0.32;
renderer.domElement.addEventListener('pointerdown', () => { controls.autoRotate = false; }, { once: false });
renderer.domElement.addEventListener('wheel', () => { controls.autoRotate = false; }, { passive: true });
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
/* =========================================================
1. 天空 / 光照
========================================================= */
function makeSkyTexture() {
const c = document.createElement('canvas');
c.width = 16; c.height = 512;
const ctx = c.getContext('2d');
const g = ctx.createLinearGradient(0, 0, 0, 512);
g.addColorStop(0.00, '#1e2748');
g.addColorStop(0.20, '#3b3a63');
g.addColorStop(0.40, '#6f5c86');
g.addColorStop(0.56, '#9c7290');
g.addColorStop(0.70, '#cf8f83');
g.addColorStop(0.82, '#efa87c');
g.addColorStop(0.92, '#f8c79c');
g.addColorStop(1.00, '#e9a877');
const t = new THREE.CanvasTexture(c);
t.colorSpace = THREE.SRGBColorSpace;
return t;
}
const sky = new THREE.Mesh(
new THREE.SphereGeometry(520, 32, 24),
new THREE.MeshBasicMaterial({ map: makeSkyTexture(), side: THREE.BackSide, depthWrite: false })
);
scene.add(sky);
// 半球光——天光
const hemi = new THREE.HemisphereLight(0xa9bede, 0x4a3b32, 1.05);
scene.add(hemi);
// 主光——落日余晖(右前上方)
const sun = new THREE.DirectionalLight(0xffc08a, 2.05);
sun.position.set(78, 62, 66);
sun.castShadow = true;
sun.shadow.mapSize.set(2048, 2048);
sun.shadow.camera.left = -78;
sun.shadow.camera.right = 78;
sun.shadow.camera.top = 78;
sun.shadow.camera.bottom = -78;
sun.shadow.camera.near = 1;
sun.shadow.camera.far = 320;
sun.shadow.bias = -0.0006;
sun.shadow.normalBias = 0.14;
scene.add(sun);
scene.add(sun.target);
sun.target.position.set(0, 0, -6);
// 冷色补光——暮色反光
const rim = new THREE.DirectionalLight(0x7d95cf, 0.85);
rim.position.set(-70, 44, -80);
scene.add(rim);
// 微弱环境
scene.add(new THREE.AmbientLight(0x6b6f92, 0.42));
/* =========================================================
2. 卡通材质系统
========================================================= */
const gradientMap = (() => {
const data = new Uint8Array([86, 148, 206, 255]);
const tex = new THREE.DataTexture(data, data.length, 1, THREE.RedFormat);
tex.needsUpdate = true;
tex.minFilter = THREE.NearestFilter;
tex.magFilter = THREE.NearestFilter;
tex.generateMipmaps = false;
return tex;
})();
function toon(color, extra = {}) {
return new THREE.MeshToonMaterial(Object.assign({ color, gradientMap }, extra));
}
const MAT = {
stone: toon(0xc4c0b4),
stoneWarm: toon(0xb8b0a0),
stoneBlue: toon(0x8f959c),
stoneDark: toon(0x74777e),
marble: toon(0xe6e2d6),
tile: too.........完整代码请登录后点击上方下载按钮下载查看















网友评论0