three实现煤炭火车在草原上冒烟行驶三维动画效果代码

代码语言:html

所属分类:三维

代码描述:three实现煤炭火车在草原上冒烟行驶三维动画效果代码

代码标签: three 煤炭 火车 草原 冒烟 行驶 三维 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8" />
  <title>three.js 直线铁路 · 蒸汽火车 + 煤炭车厢 · 田野 · 蓝天白云</title>
  <style>
    html, body { margin: 0; height: 100%; background: #000; }
    canvas { display: block; }
    #info {
      position: absolute; top: 10px; left: 10px; z-index: 10;
      color: #fff; background: rgba(0,0,0,0.45); padding: 8px 12px; border-radius: 8px;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial;
      font-size: 13px; line-height: 1.6;
    }
  </style>
</head>
<body>
  <div id="info">
    直线铁路上的蒸汽火车 + 多节煤炭车厢(OrbitControls 可旋转/缩放)<br />
    - 鼠标左键:旋转 | 右键:平移 | 滚轮:缩放<br/>
    - 相机沿 X 方向跟随火车(可随时拖拽调整视角)
  </div>

  <script type="importmap">
  {
    "imports":{
      "three":"//repo.bfw.wiki/bfwrepo/js/module/three/build/164/three.module.js",
      "three/addons/":"//repo.bfw.wiki/bfwrepo/js/module/three/examples/164/jsm/"
    }
  }
  </script>

  <script type="module">
    import * as THREE from 'three';
    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

    // 常量
    const GAUGE = 1.4;             // 轨距(与车轮/车体匹配)
    const TRACK_LEN = 6000;        // 渲染的直线轨道长度(足够长,视觉近似“无限”)
    const SLEEPER_SPACING = 1.5;   // 枕木间距
    const TRAIN_SPEED = 4.0;       // 列车速度(单位/秒)
    const NUM_WAGONS = 12;         // 煤炭车厢数量
    const WAGON_SPACING = 4.6;     // 车厢间隔(从中心到中心的间距)
    const WORLD_TREE_COUNT = 600;  // 沿线树木数量

    // 基础
    const scene = new THREE.Scene();
    scene.background = new THREE.Color(0x87c7ff); // 天空蓝
    scene.fog = new THREE.FogExp2(0x87c7ff, 0.0013);

    const renderer = new THREE.WebGLRenderer({ antialias: true });
    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.15;

    document.body.appendChild(renderer.domElement);

    const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 5000);
    camera.position.set(-12, 10, 18);

    const controls = new OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true;
    controls.target.set(0, 3, 0);

    // 灯光(增强亮度)
    const hemi = new THREE.HemisphereLight(0xbbddee, 0x4a7f29, 1.0);
    scene.add(hemi);

    const sun = new THREE.DirectionalLight(0xffffff, 2.4);
    sun.castShadow = true;
    sun.shadow.mapSize.set(2048, 2048);
    sun.shadow.camera.near = 1;
    sun.shadow.camera.far = 400;
    sun.shadow.camera.left = -80;
    sun.shadow.camera.right = 80;
    sun.shadow.camera.top = 80;
    sun.shadow.camera.bottom = -80;
    sun.position.set(-30, 40, 20);
    scene.add(sun);
    scene.add(sun.target);

    // 轻微环境光,提亮阴影处
    scene.add(new THREE.AmbientLight(0xffffff, 0.25));

    // 地面:超大平面作为“无尽”的田野
    {
      const groundGeo = new THREE.PlaneGeometry(20000, 20000, 1, 1);
      const groundMat = new THREE.MeshLambertMaterial({ color: 0x6ec15a });
      const ground = new THREE.Mesh(groundGeo, groundMat);
      ground.rotation.x = -Math.PI / 2;
      ground.receiveShadow = true;
      scene.add(ground);
    }

    // 沿线树木
    addTracksideTrees(WORLD_TREE_COUNT, -TRACK_LEN/2, TRACK_LEN/2, 12, 90);
    function addTracksideTrees(count, minX, maxX, minDistZ, maxDistZ) {
      const trunkMat = new THREE.MeshStandardMate.........完整代码请登录后点击上方下载按钮下载查看

网友评论0