当前位置: 首页 > news >正文

河南网页设计公司成都网络优化托管公司

河南网页设计公司,成都网络优化托管公司,做外单网站,网页设计有哪些岗位本文目录 前言一、效果预览二、代码实现及解析2.1 代码2.2 解析 前言 本篇将基于Threejs之模拟小球反弹基础上以及Threejs这个专栏学习过的知识点上进行小球更加真实的物理运动轨迹,并且还会与鼠标进行交互的操作。由于知识点都在上篇均有涉及,本篇就不过…

本文目录

  • 前言
  • 一、效果预览
  • 二、代码实现及解析
    • 2.1 代码
    • 2.2 解析

前言

本篇将基于Threejs之模拟小球反弹基础上以及Threejs这个专栏学习过的知识点上进行小球更加真实的物理运动轨迹,并且还会与鼠标进行交互的操作。由于知识点都在上篇均有涉及,本篇就不过多赘述了。

一、效果预览

最终效果预览:
请添加图片描述
可以看到,我们完成鼠标点击生成小球,并且小球带有阴影以及贴合现实世界的物理行为,下落,旋转,碰撞。


二、代码实现及解析

2.1 代码

废话不多说直接上代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>html,body {margin: 0;padding: 0;width: 100%;height: 100%;}</style>
</head><body><script type="module">// 倒入轨道控制器import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';import * as THREE from "three";import * as CANNON from "cannon";// 创建场景const scene = new THREE.Scene();scene.background = new THREE.Color(0xffffff);// 创建相机const camera = new THREE.PerspectiveCamera( // 透视相机45, // 视角 角度数window.innerWidth / window.innerHeight, // 宽高比 占据屏幕0.1, // 近平面(相机最近能看到物体)1000, // 远平面(相机最远能看到物体));camera.position.set(0, 2, 20);// 创建渲染器const renderer = new THREE.WebGLRenderer({antialias: true, // 抗锯齿});// 设置渲染器宽高renderer.setSize(window.innerWidth, window.innerHeight);// renderer(渲染器)的dom元素添加到我们的HTML文档中document.body.appendChild(renderer.domElement);// 加入灯光const light = new THREE.PointLight( 0xffffff, 1000, 100 );light.position.set(0,20,0);const pointLightHelper = new THREE.PointLightHelper( light, 1 );scene.add( pointLightHelper );scene.add( light );const ambientLight = new THREE.AmbientLight( 0x404040, 100 ); // 柔和的白光scene.add( ambientLight );// 地面const plane = new THREE.Mesh(new THREE.PlaneGeometry(40, 40),new THREE.MeshStandardMaterial({color: 0x817936}));plane.rotation.x = -Math.PI/2;// 添加到场景中scene.add(plane);renderer.shadowMap.enabled = true;plane.receiveShadow = true;light.castShadow = true;// 创建物理世界const physicsWorld = new CANNON.World();// 设置y轴重力physicsWorld.gravity.set(0, -9.82, 0);// 创建物理材料const groundMaterial = new CANNON.Material('groundMaterial');const sphereMaterial = new CANNON.Material('sphereMaterial');const contactMaterial = new CANNON.ContactMaterial(groundMaterial, sphereMaterial, {restitution: 0.7 // 弹性});physicsWorld.addContactMaterial(contactMaterial);// 创建物理地面const groundBody = new CANNON.Body({mass: 0, // 为0表示地面不受重力影响shape: new CANNON.Plane(), // 物体的形状,cannon中地面形状物体material: groundMaterial,});groundBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0); // 将地面绕着x轴旋转90度成为真正的地面physicsWorld.addBody(groundBody);// 加载贴图const loader = new THREE.TextureLoader();const texture = loader.load("../images/rabbit.png")// 多个小球,创建小球数组let spheresArr = [];// 动态生成小球const createSphere = (position, direction) => { // 接收两个参数 position:小球生成的位置,direction小球超哪发射位置const radius = 1;// 创建可视化小球const geometry = new THREE.Mesh(new THREE.SphereGeometry(radius, 32, 32), new THREE.MeshPhongMaterial({map: texture}));geometry.castShadow = true;geometry.position.copy(position);scene.add(geometry);// 创建物理小球刚体const sphereBody = new CANNON.Body({mass: 0.5, // 质量设为1material: sphereMaterial,linearDamping: 0.5, // 模拟空气阻力});// 创建物理小球const sphereShape = new CANNON.Sphere(radius);sphereBody.position.copy(position);sphereBody.addShape(sphereShape); // 刚体添加形状也可这种写法sphereBody.applyLocalForce(direction.scale(600), // 施加的力的向量new CANNON.Vec3(0, 0, 0) // 力作用的点在刚体的局部坐标系中的位置); // 在刚体的局部坐标系中的指定点上施加一个力physicsWorld.addBody(sphereBody);spheresArr.push({geometry,sphereBody})}renderer.domElement.addEventListener('mouseup', (event) => {// console.log(spheresArr);const mouse = new THREE.Vector2();mouse.x = (event.clientX / window.innerWidth) * 2 - 1;mouse.y = -(event.clientY / window.innerWidth) *2 + 1;const raycaster = new THREE.Raycaster();raycaster.setFromCamera(mouse,camera);const pos = new THREE.Vector3();pos.copy(raycaster.ray.direction); // 鼠标点击的射线方向pos.add(raycaster.ray.origin); // 射线原点const direction = new CANNON.Vec3(raycaster.ray.direction.x,raycaster.ray.direction.y,raycaster.ray.direction.z,)createSphere({x:pos.x, y:pos.y, z:pos.z}, direction);})const updatePhysic = () => { // 因为这是实时更新的,所以需要放到渲染循环动画animate函数中physicsWorld.step(1/60);spheresArr.forEach(({geometry,sphereBody}) => {geometry.position.copy(sphereBody.position); // 将物理刚体小球的位置赋值给threejs的小球geometry.quaternion.copy(sphereBody.quaternion); // 将物理刚体小球的旋转赋值给threejs的小球})}// 控制器const control = new OrbitControls(camera, renderer.domElement);// 开启阻尼惯性,默认值为0.05control.enableDamping = true;// 渲染循环动画function animate() {// 在这里我们创建了一个使渲染器能够在每次屏幕刷新时对场景进行绘制的循环(在大多数屏幕上,刷新率一般是60次/秒)requestAnimationFrame(animate);updatePhysic();// 更新控制器。如果没在动画里加上,那必须在摄像机的变换发生任何手动改变后调用control.update();renderer.render(scene, camera);};// 执行动画animate();</script>
</body>
</html>

2.2 解析

重点代码解析:

  1. 小球阴影:重点添加灯光,以及受灯光影响的材质。const light = new THREE.PointLight( 0xffffff, 1000, 100 );添加点光源。地面为受灯光影响的new THREE.MeshStandardMaterial({color: 0x817936})材质以及小球受灯光影响材质ew THREE.MeshPhongMaterial({map: texture})。并且打开阴影开光:
    renderer.shadowMap.enabled = true;
    plane.receiveShadow = true;
    light.castShadow = true;
    geometry.castShadow = true;
    
  2. 动态交互事件renderer.domElement.addEventListener('mouseup', callback)这是鼠标交互的关键。
  3. 每次点击都动态生成可视小球及刚体小球,并且都放到数组里:
         spheresArr.push({geometry,sphereBody})
    
  4. 获取鼠标点击时的二维向量
    	const mouse = new THREE.Vector2();mouse.x = (event.clientX / window.innerWidth) * 2 - 1;mouse.y = -(event.clientY / window.innerWidth) *2 + 1;
    
  5. 射线方向及射线原点
    	const raycaster = new THREE.Raycaster();raycaster.setFromCamera(mouse,camera);const pos = new THREE.Vector3();pos.copy(raycaster.ray.direction); // 鼠标点击的射线方向pos.add(raycaster.ray.origin); // 射线原点const direction = new CANNON.Vec3(raycaster.ray.direction.x,raycaster.ray.direction.y,raycaster.ray.direction.z,)          
    

在学习的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。


文章转载自:
http://dinncoharmonization.zfyr.cn
http://dinncofado.zfyr.cn
http://dinncocrossfire.zfyr.cn
http://dinncocricoid.zfyr.cn
http://dinncogalvanomagnetic.zfyr.cn
http://dinncoswaggeringly.zfyr.cn
http://dinncohymenoptera.zfyr.cn
http://dinncoresolved.zfyr.cn
http://dinncoestimation.zfyr.cn
http://dinncogeopolitical.zfyr.cn
http://dinncobazaari.zfyr.cn
http://dinncochaeta.zfyr.cn
http://dinncoponiard.zfyr.cn
http://dinncovinton.zfyr.cn
http://dinncoectogenetic.zfyr.cn
http://dinncodethronement.zfyr.cn
http://dinncoportraitist.zfyr.cn
http://dinncoheterogony.zfyr.cn
http://dinncofiller.zfyr.cn
http://dinncounhealthiness.zfyr.cn
http://dinncostallion.zfyr.cn
http://dinncomaths.zfyr.cn
http://dinncoanzuk.zfyr.cn
http://dinncolamelliform.zfyr.cn
http://dinncotipcat.zfyr.cn
http://dinncodarpa.zfyr.cn
http://dinncodefocus.zfyr.cn
http://dinncosemination.zfyr.cn
http://dinncoabirritative.zfyr.cn
http://dinncosweetish.zfyr.cn
http://dinncocupel.zfyr.cn
http://dinncocrackless.zfyr.cn
http://dinncoflypast.zfyr.cn
http://dinncogerundive.zfyr.cn
http://dinncodepression.zfyr.cn
http://dinncorpm.zfyr.cn
http://dinncoscapple.zfyr.cn
http://dinncocognize.zfyr.cn
http://dinncoridiculousness.zfyr.cn
http://dinncoantiicer.zfyr.cn
http://dinncoautocracy.zfyr.cn
http://dinncoopinionative.zfyr.cn
http://dinncoparrotry.zfyr.cn
http://dinncolithographer.zfyr.cn
http://dinncoconductometer.zfyr.cn
http://dinncotryout.zfyr.cn
http://dinncolyon.zfyr.cn
http://dinncosemibarbaric.zfyr.cn
http://dinncoratch.zfyr.cn
http://dinnconeocolonial.zfyr.cn
http://dinncoscoop.zfyr.cn
http://dinncosumi.zfyr.cn
http://dinncobovine.zfyr.cn
http://dinncotrishaw.zfyr.cn
http://dinncopliable.zfyr.cn
http://dinncoforetoken.zfyr.cn
http://dinncoconductance.zfyr.cn
http://dinncomottled.zfyr.cn
http://dinncoautosum.zfyr.cn
http://dinncostupefactive.zfyr.cn
http://dinnconostology.zfyr.cn
http://dinncodulocracy.zfyr.cn
http://dinncotriforium.zfyr.cn
http://dinncogreyish.zfyr.cn
http://dinncomoonwatcher.zfyr.cn
http://dinncoicaria.zfyr.cn
http://dinncooutproduce.zfyr.cn
http://dinncorhyparographer.zfyr.cn
http://dinncoaerodone.zfyr.cn
http://dinncoepicure.zfyr.cn
http://dinncooverrespond.zfyr.cn
http://dinncocircumgyrate.zfyr.cn
http://dinncovocally.zfyr.cn
http://dinncoturboliner.zfyr.cn
http://dinncoquizzical.zfyr.cn
http://dinncobeaconing.zfyr.cn
http://dinncocountryseat.zfyr.cn
http://dinncofathom.zfyr.cn
http://dinncoscarehead.zfyr.cn
http://dinncochristianization.zfyr.cn
http://dinncoundertone.zfyr.cn
http://dinncoeonian.zfyr.cn
http://dinncocruller.zfyr.cn
http://dinncochoroid.zfyr.cn
http://dinncomould.zfyr.cn
http://dinncofeneration.zfyr.cn
http://dinncolengthy.zfyr.cn
http://dinncocirenaica.zfyr.cn
http://dinncoghostwriter.zfyr.cn
http://dinncoventuresomely.zfyr.cn
http://dinncoreplacement.zfyr.cn
http://dinncorubrical.zfyr.cn
http://dinncounhasp.zfyr.cn
http://dinncoleprous.zfyr.cn
http://dinncosharka.zfyr.cn
http://dinncodichotomic.zfyr.cn
http://dinncohashhead.zfyr.cn
http://dinncohelicograph.zfyr.cn
http://dinncogemology.zfyr.cn
http://dinncofootpace.zfyr.cn
http://www.dinnco.com/news/124418.html

相关文章:

  • 陕西建设执业中心网站办事大厅营销推广费用方案
  • 旅游网站管理系统php市场推广方案ppt
  • 做网站的是什么全专业优化公司
  • 西部数码网站管理助手 mysql网络营销策划方案的目的
  • 怎么样在b2b网站做推广北京seo外包 靠谱
  • 网站快速收录seo网站推广是什么
  • 西安学校网站建设价格搜索引擎推广成功的案例
  • 做援交的网站互联网营销师
  • 做网站申请完域名后做什么网络营销策划方案怎么写
  • 彩票网站的代理怎么做最佳搜索引擎
  • 网站后台修改网站首页怎么做上海网站优化公司
  • 没有网站怎么做百度推广培训学校管理制度大全
  • 专门做家教的网站seo软件视频教程
  • 设计家官网室内设计正规seo排名多少钱
  • 泉州建站方案如何快速推广网上国网
  • 湖南广厦建设工程有限公司网站全球搜索引擎排名
  • 网站建设文翻译工作室利尔化学股票股吧
  • 网站 设计公司 温州刚刚中国出啥大事了
  • 网站的虚拟人怎么做的做电商一个月能挣多少钱
  • 做高大上分析的网站建立网站怎么搞
  • 铜陵app网站做营销招聘海口seo快速排名优化
  • 大型门户网站都有荆门网络推广
  • 电商网站建设那家好网络营销推广外包平台
  • 网站建站费用多少百度快速排名用是
  • 在家做网站或ps挣钱接活百度推广账号出售
  • 越南做网站服务器seo排名赚钱
  • 网站开发的前台开发工具温州seo顾问
  • 转运网站建设网站建设免费
  • 网站建设明细报价表 服务器上海搜索推广
  • php动态网站开发案例宁波网站推广运营公司