three三维雨夜便利店建筑场景代码

代码语言:html

所属分类:其他

代码由deepseek-4.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.0">
<title>雨夜便利店 · 街角</title>
<style>
  html, body { margin: 0; height: 100%; overflow: hidden; background: #08070f; }
  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 });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
renderer.setSize(innerWidth, innerHeight);
renderer.outputColorSpace = THREE.SRGBColorSpace;
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
document.body.appendChild(renderer.domElement);

const scene = new THREE.Scene();
scene.background = new THREE.Color(0x0a0918);
scene.fog = new THREE.FogExp2(0x0d0c1e, 0.015);

const camera = new THREE.PerspectiveCamera(38, innerWidth / innerHeight, 0.1, 300);
camera.position.set(16, 12.5, 18);

const controls = new OrbitControls(camera, renderer.domElement);
controls.target.set(0.2, 1.5, -2.6);
controls.enableDamping = true;
controls.dampingFactor = 0.07;
controls.minDistance = 9;
controls.maxDistance = 48;
controls.maxPolarAngle = Math.PI * 0.494;
controls.update();

/* ============================================================
   1. 三渲二 工具
   ============================================================ */
function makeGradient(steps) {
  const c = document.createElement('canvas');
  c.width = steps; c.height = 1;
  const ctx = c.getContext('2d');
  for (let i = 0; i < steps; i++) {
    const v = Math.round(255 * (0.46 + 0.54 * (i / (steps - 1))));
    ctx.fillStyle = `rgb(${v},${v},${v})`;
    ctx.fillRect(i, 0, 1, 1);
  }
  const t = new THREE.CanvasTexture(c);
  t.minFilter = THREE.NearestFilter;
  t.magFilter = THREE.NearestFilter;
  t.generateMipmaps = false;
  return t;
}
const GRAD = makeGradient(3);

const toon = (color, extra = {}) =>
  new THREE.MeshToonMaterial({ color, gradientMap: GRAD, ...extra });

// 轮廓线材质(背面外扩)
const _outlineCache = {};
function outlineMaterial(w) {
  const k = w.toFixed(4);
  if (_outlineCache[k]) return _outlineCache[k];
  const m = new THREE.ShaderMaterial({
    uniforms: {
      uWidth: { value: w },
      uColor: { value: new THREE.Color(0x17131f) }
    },
    vertexShader: /* glsl */`
      uniform float uWidth;
      void main() {
        vec3 p = position + normalize(normal) * uWidth;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 1.0);
      }`,
    fragmentShader: /* glsl */`
      uniform vec3 uColor;
      void main() { gl_FragColor = vec4(uColor, 1.0); }`,
    side: THREE.BackSide
  });
  _outlineCache[k] = m;
  return m;
}

function addMesh(parent, geo, mat, o = {}) {
  const g = new THREE.Group();
  const m = new THREE.Mesh(geo, mat);
  m.castShadow = o.cast !== false;
  m.receiveShadow = o.receive !== false;
  g.add(m);
  if (o.outline) {
    const om = new THREE.Mesh(geo, outlineMaterial(o.ow ?? 0.016));
    om.castShadow = false;
    om.receiveShadow = false;
    g.add(om);
  }
  if (o.pos) g.position.set(o.pos[0], o.pos[1], o.pos[2]);
  if (o.rot) g.rotation.set(o.rot[0], o.rot[1], o.rot[2]);
  if (o.scale) g.scale.set(o.scale[0], o.scale[1], o.scale[2]);.........完整代码请登录后点击上方下载按钮下载查看

网友评论0