three模拟物理软体碰撞动画效果代码
代码语言:html
所属分类:三维
代码描述:three模拟物理软体碰撞动画效果代码,点击鼠标扔球碰撞。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <style> body { color: #333; } </style> </head> <body> <div id="info"> 点击扔球 </div> <div id="container"></div> <script src="//repo.bfw.wiki/bfwtool/examples/js/libs/ammo.wasm.js"></script> <!-- Import maps polyfill --> <!-- Remove this when import maps will be widely supported --> <script async type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/es-module-shims.1.3.6.js"></script> <script type="importmap"> { "imports": { "three": "//repo.bfw.wiki/bfwtool/build/three.module.js" } } </script> <script type="module"> import * as THREE from 'three'; import Stats from '//repo.bfw.wiki/bfwtool/examples/jsm/libs/stats.module.js'; import { OrbitControls } from '//repo.bfw.wiki/bfwtool/examples/jsm/controls/OrbitControls.js'; import * as BufferGeometryUtils from '//repo.bfw.wiki/bfwtool/examples/jsm/utils/BufferGeometryUtils.js'; // Graphics variables let container, stats; let camera, controls, scene, renderer; let textureLoader; const clock = new THREE.Clock(); let clickRequest = false; const mouseCoords = new THREE.Vector2(); const raycaster = new THREE.Raycaster(); const ballMaterial = new THREE.MeshPhongMaterial( { color: 0x202020 } ); const pos = new THREE.Vector3(); const quat = new THREE.Quaternion(); // Physics variables const gravityConstant = - 9.8; let physicsWorld; const rigidBodies = []; const softBodies = []; const margin = 0.05; let transformAux1; let softBodyHelpers; Ammo().then( function ( AmmoLib ) { Ammo = AmmoLib; init(); animate(); } ); function init() { initGraphics(); initPhysics(); createObjects(); initInput(); } function initGraphics() { container = document.getElementById( 'container' ); camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.2, 2000 ); scene = new THREE.Scene(); scene.background = new THREE.Color( 0xbfd1e5 ); camera.position.set( - 7, 5, 8 ); renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.shadowMap.enabled = true; container.appendChild( renderer.domElement ); controls = new OrbitControls( camera, renderer.domElement ); controls.target.set( 0, 2, 0 ); controls.update(); textureLoader = new THREE.TextureLoader(); const ambientLight = new THREE.AmbientLight( 0x404040 ); scene.add( ambientLight ); const light = new THREE.DirectionalLight( 0xffffff, 1 ); light.position.set( - 10, 10, 5 ); light.castShadow = true; const d = 20; light.shadow.camera.left = - d; light.shadow.camera.right = d; light.shadow.camera.top = d; light.shadow.camera.bottom = - d; light.shadow.camera.near = 2; light.shadow.camera.far = 50; light.shadow.mapSize.x = 1024; light.shadow.mapSize.y = 1024; scene.add( light ); stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.top = '0px'; container.appendChild( stats.domElement ); window.addEventListener( 'resize', onWindowResize ); } function initPhysics() { // Physics configuration const collisionConfiguration = new Ammo.btSoftBodyRigidBodyCollisionConfiguration(); const dispatcher = new Ammo.btCollisionDispatcher( collisionConfiguration ); const broadphase = new Ammo.btDbvtBroadphase(); const solver = new Ammo.btSequentialImpulseConstraintSolver(); const softBodySolver = new Ammo.btDefaultSoftBodySolver(); physicsWorld = new Ammo.btSoftRigidDynamicsWorld( dispatcher, broadphase, solver, collisionConfiguration, softBodySolver ); physicsWorld.setGravity( new Ammo.btVector3( 0, gravityConstant, 0 ) ); physicsWorld.getWorldInfo().set_m_gravity( new Ammo.btVector3( 0, gravityConstant, 0 ) ); transformAux1 = new Ammo.btTransform(); softBodyHelpers = new Ammo.btSoftBodyHelpers(); } function createObjects() { // Ground pos.set( 0, - 0.5, 0 ); quat.set( 0, 0, 0, 1 ); const ground = createParalellepiped( 40, 1, 40, 0, pos, quat, new THREE.MeshPhongMaterial( { color: 0xFFFFFF } ) ); ground.castShadow = true; ground.receiveShadow = true; textureLoader.load( '//repo.bfw.wiki/bfwtool/examples/textures/grid.png', function ( texture ) { texture.wrapS = THREE.RepeatWrapping; texture.wrapT = THREE.RepeatWrapping; texture.repeat.set( 40, 40 ); ground.material.map = texture; ground.material.needsUpdate = true; } ); // Create soft volumes const volumeMass = 15; const sphereGeometry = new THREE.SphereGeometry( 1.5, 40, 25 ); sphereGeometry.translate( 5, 5, 0 ); createSoftVolume( sphereGeometry, volumeMass, 250 ); const boxGeometry = new THREE.BoxGeometry( 1, 1, 5, 4, 4, 20 ); boxGeometry.translate( - 2, 5, 0 ); createSoftVolume( boxGeometry, volumeMass, 120 ); // Ramp pos.set( 3, 1, 0 ); quat.setFromAxisAngle( new THREE.Vector3( 0, 0, 1 ), 30 * Math.PI / 180 ); const obstacle = createParalellepiped( 10, 1, 4, 0, pos, quat, new THREE.MeshPhongMaterial( { color: 0x606060 } ) ); obstacle.castShadow = true; obstacle.receiveShadow = true; } function processGeometry( bufGeometry ) { // Ony consider the position values when merging the vertices const posOnlyBufGeometry = new THREE.BufferGeometry(); posOnlyBufGeometry.setAttribute( 'position', bufGeometry.getAttribute( 'position' ) ); posOnlyBufGeometry.setIndex( bufGeometry.getIndex() ); // Merge the vertices so the triangle soup is converted to indexed triangles const indexedBufferGeom = BufferGeometryUtils.mergeVertices( posOnlyBufGeometry ); // Create index arrays mapping the indexed vertices to bufGeometry vertices mapIndices( bufGeometry, indexedBufferGeom ); } function isEqual( x1, y1, z1, x2, y2, z2 ) { const delta = 0.000001; return Math.abs( x2 - x1 ) < delta && Math.abs( y2 - y1 ) < delta && Math.abs( z2 - z1 ) < delta; } function mapIndices( bufGeometry, indexedBufferGeom ) { // Creates ammoVertices, ammoIndices and ammoIndexAssociation in bufGeometry const vertices = bufGeometry.attributes.position.array; const idxVertices = indexedBufferGeom.attributes.position.array; const indices = indexedBufferGeom.index.array; const numIdxVertices = idxVertices.length / 3; const numVertices = vertices.length / 3; bufGeometry.ammoVertices = idxVertices; bufGeometry.ammoIndices = indices; bufGeometry.ammo.........完整代码请登录后点击上方下载按钮下载查看
网友评论0