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