three实现三维沙发椅月亮照亮小球发射效果代码

代码语言:html

所属分类:三维

代码描述:three实现三维沙发椅月亮照亮小球发射效果代码,三维场景,可点击鼠标左键发射小球。

代码标签: three 三维 沙发 月亮 照亮 小球 发射

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

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

  
  
  
  
<style>
@import url("https://fonts.googleapis.com/css2?family=Lato&display=swap");
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
*::before,
*::after {
  box-sizing: border-box;
}
html,
body {
  overscroll-behavior-x: none;
  overscroll-behavior-y: none;
  scroll-behavior: smooth;
}
body {
  font-family: "Lato", sans-serif;
  position: relative;
  width: 100%;
  max-width: 100vw;
  height: auto;
  min-height: 100vh;
  text-align: center;
  overflow-x: hidden;

  background: rgb(255, 255, 255);
  color: gray;
}
canvas {
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;
  position: fixed;
  width: 100%;
  max-width: 100vw;
  height: auto;
  min-height: 100vh;
  top: 0;
  left: 0;
  z-index: 0;
}
main {
  position: relative;
}
section {
  position: relative;
  width: 100vw;
  min-height: 100vh;
  display: grid;
  place-items: center;
}
</style>


  
  
</head>

<body translate="no">

<main>
  <section>
    <div>
      <p>Loading...</p>
    </div>
  </section>
</main>
<script  async type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/es-module-shims.1.6.3.js"></script>

<script type="importmap">
  {
    "imports": {      
      "three": "//repo.bfw.wiki/bfwrepo/js/module/three/build/168/three.module.js",
      "three/addons/": "//repo.bfw.wiki/bfwrepo/js/module/three/examples/168/jsm/"
    }
  }
</script>
<script src="//repo.bfw.wiki/bfwrepo/js/module/three/examples/168/jsm/libs/ammo.wasm.js"></script>
  
      <script type="module">
/*!
Moon Lamps
Copyright (c) 2024 by Wakana Y.K. (https://codepen.io/wakana-k/pen/mdNvqQV)
*/
"use strict";
console.clear();
import * as THREE from "three";
import { OrbitControls as e } from "three/addons/controls/OrbitControls.js";
import { GLTFLoader as t } from "three/addons/loaders/GLTFLoader.js";
async function n() {
  if ("Ammo" in window == !1)
  return void console.error("AmmoPhysics: Couldn't find Ammo.js");
  const e = await Ammo(),
  t = new e.btDefaultCollisionConfiguration(),
  n = new e.btCollisionDispatcher(t),
  i = new e.btDbvtBroadphase(),
  a = new e.btSequentialImpulseConstraintSolver(),
  r = new e.btDiscreteDynamicsWorld(n, i, a, t);
  r.setGravity(new e.btVector3(0, -10, 0));
  let s = new e.btTransform();
  const l = new e.btTransform();
  let c,
  d = new e.btVector3(0, 0, 0),
  h = new e.btQuaternion(0, 0, 0, 0);
  function m(e) {
    let t = null;
    d.setValue(0, 0, 0);
    let n = e.attributes.position.array;
    t = new Ammo.btConvexHullShape();
    for (let e = 0, o = n.length; e < o; e += 3) {
      d.setValue(n[e], n[e + 1], n[e + 2]);
      const i = e >= o - 3;
      t.addPoint(d, i);
    }
    return (
      t && t.setMargin(0), t || console.error("AmmoPhysics: Shape error."), t);

  }
  let w = [],
  E = new WeakMap();
  let u = null,
  p = "";
  function g(t, n, o, i = null) {
    c = t.position,
    h = t.quaternion,
    s.setIdentity(),
    d.setValue(c.x, c.y, c.z),
    s.setOrigin(d),
    s.setRotation(new e.btQuaternion(h.x, h.y, h.z, h.w));
    const a = t.scale;
    d.setValue(a.x, a.y, a.z), o.setLocalScaling(d), d.setValue(0, 0, 0);
    const l = new e.btDefaultMotionState(s),
    m = d;
    n > 0 && o.calculateLocalInertia(n, m);
    const u = new e.btRigidBodyConstructionInfo(n, l, o, m),
    p = new e.btRigidBody(u);
    "pointLight" == t.name ? (
    p.setFriction(0.1), p.setRestitution(0.7)) :
    "floor" == t.name ? (
    p.setFriction(1), p.setRestitution(1), p.setDamping(0, 0)) : (
    p.setFriction(0.5), p.setRestitution(0.3), p.setDamping(0, 0)),
    "shootingBall" == t.name &&
    i && (
    d.setValue(i.x, i.y, i.z), p.setLinearVelocity(d)),
    p.name = t.name,
    r.addRigidBody(p),
    n > 0 && (w.push(t), E.set(t, p));
  }
  let M = 0;
  return (
    setInterval(function () {
      const e = performance.now();
      if (M > 0) {
        const t = (e - M) / 1e3;
        r.stepSimulation(t, 10);
      }
      M = e;
      for (let e = 0, t = w.length; e < t; e++) {
        if (!w[e]) continue;
        let t = w[e];
        if (t.isInstancedMesh) {
          let e = t.instanceMatrix.array;
          if (!E.has(t)) continue;
          let n = E.get(t);
          for (let t = 0; t < n.length; t++)
          n[t] && (
          n[t].getMotionState().getWorldTransform(l),
          c = l.getOrigin(),
          h = l.getRotation(),
          o(c, h, e, 16 * t));
          E.set(t, n), t.instanceMatrix.needsUpdate = !0;
        } else if (t.isMesh) {
          if (!E.has(t)) continue;
          E.get(t).getMotionState().getWorldTransform(l),
          c = l.getOrigin(),
          h = l.getRotation(),
          t.position.set(c.x(), c.y(), c.z()),
          t.quaternion.set(h.x(), h.y(), h.z(), h.w());
        }
      }
    }, 1e3 / 60),
    {
      addMesh: function (e, t = 0) {
        const n = m(e.geometry);
        if (!n) return console.error("AmmoPhysics: Shape is NULL."), !1;
        g(e, t, n);
      },
      addTerrainMesh: function (e, t = 0) {
        const n = function (e) {
          let t,
          n = e.attributes.position.array,
          o = e.index.array,
          i = new Ammo.btTriangleMesh();
          for (let e = 0; e < o.length; e += 3) {
            let t = new Ammo.btVector3(
            n[3 * o[e]],
            n[3 * o[e] + 1],
            n[3 * o[e] + 2]),

            a = new Ammo.btVector3(
            n[3 * o[e + 1]],
            n[3 * o[e + 1] + 1],
            n[3 * o[e + 1] + 2]),

            r = new Ammo.btVector3(
            n[3 * o[e + 2]],
            n[3 * o[e + 2] + 1],
            n[3 * o[e + 2] + 2]);

            i.addTriangle(t, a, r);
          }
          return (
            (t = new Ammo.btBvhTriangleMeshShape(i, !0, !0)) && t.setMargin(0),
            t || console.error("AmmoPhysics: Shape error."),
            t);

        }(e.geometry);
        if (!n) return console.error("AmmoPhysics: Shape is NULL."), !1;
        g(e, 0, n);
      },
      addShootingMesh: function (e, t = 0, n = null) {
        return n ? (
        (!e.name || e.name && e.name != p) && (
        u = m(e.geometry), p = e.name),
        u ?
        void g(e, t, u, n) : (
        console.error("AmmoPhysics: Shape is NULL."), !1)) : (
        console.error("AmmoPhysics: Parameter is NULL."), !1);
      } });


}
function o(e, t, n, o) {
  const i = t.x(),
  a = t.y(),
  r = t.z(),
  s = t.w(),
  l = i + i,
  c = a + a,
  d = r + .........完整代码请登录后点击上方下载按钮下载查看

网友评论0