Cannon-ES中RigidVehicle的创建与应用:结合Three.js实现车辆动态模拟

本文目录

  • 前言
  • 1、RigidVehicle
    • 1.1 概念
    • 1.2 RigidVehicle的创建与使用
    • 1.3 RigidVehicle的特性与应用
  • 2、前置代码准备
    • 2.1 代码
    • 2.2 效果
  • 3、RigidVehicle结合three的使用
    • 3.1 代码
      • 3.1.2 效果
    • 3.2 控制车子移动
    • 3.2.1 效果
  • 4、完整代码

前言

在物理引擎与三维图形渲染技术日益融合的今天,Cannon-ES作为一款轻量级的JavaScript物理引擎,为开发者提供了强大的物理模拟功能。其中,RigidVehicle模块更是为车辆动力学模拟提供了强有力的支持。本文旨在深入探讨Cannon-ES中的RigidVehicle,从基本概念到创建使用,再到结合Three.js实现车辆的三维动态模拟,一步步引导读者掌握这一技术。
通过本文的学习,读者将不仅能够理解RigidVehicle的概念和特性,还能掌握其在网页开发中的实际应用。我们将通过丰富的代码示例和详细的效果展示,让读者直观地看到RigidVehicle在车辆模拟中的强大功能。无论是游戏开发、虚拟仿真还是教育演示,RigidVehicle都能成为你手中的得力助手。让我们一起踏上这段探索之旅吧!

1、RigidVehicle

1.1 概念

RigidVehicleCannon-es.js中用于模拟具有物理效果的车辆的对象。它基于刚体动力学原理,通过模拟车辆的悬挂系统、车轮与地面的接触以及车辆的运动学特性,来实现逼真的物理效果。

1.2 RigidVehicle的创建与使用

  1. 创建物理世界:
    在使用RigidVehicle之前,首先需要创建一个物理世界(CANNON.World),并设置重力加速度等参数。
  2. 定义车身刚体:
    车身刚体(chassisBody)是RigidVehicle的基础,它代表了车辆的主体部分。车身刚体通常是一个具有一定质量和形状的刚体。
  3. 创建RigidVehicle对象:
    使用Cannon-es.js提供的RigidVehicle构造函数或相关方法,可以创建一个RigidVehicle对象。在创建过程中,需要传入车身刚体以及其他相关参数,如车辆的轴向索引等。
  4. 添加车轮:
    车轮是RigidVehicle的重要组成部分。在创建RigidVehicle对象后,需要为车辆添加车轮。车轮的添加过程包括定义车轮的形状、质量、连接点等参数,并将车轮添加到车辆上。
  5. 设置车轮的碰撞和物理属性:
    为了模拟车轮与地面的碰撞以及车轮的物理行为,需要为车轮设置碰撞材质(CANNON.Material)和接触材质(CANNON.ContactMaterial)。这些材质决定了车轮与地面之间的摩擦系数、反弹系数等物理参数。
  6. 推进物理模拟:
    在每一帧中调用物理世界的step方法或fixedStep方法,以推进物理模拟。在模拟过程中,RigidVehicle会自动计算车辆的运动状态、车轮与地面的接触力等物理量。

1.3 RigidVehicle的特性与应用

  • 逼真的物理效果:
    RigidVehicle通过模拟车辆的悬挂系统、车轮与地面的接触以及车辆的运动学特性,实现了逼真的物理效果。这使得开发者可以在Web应用中创建具有真实物理行为的车辆模拟。
  • 易于集成:
    Cannon-es.js作为Cannon.js的现代化版本,具有易于集成的特点。它可以与WebGL技术无缝结合,并可以轻松与其他WebGL应用程序(如Three.js)集成。这使得开发者可以在现有的WebGL项目中快速添加物理模拟功能。
    广泛的应用场景:
    RigidVehicle在游戏开发、物理模拟、教育应用等领域具有广泛的应用前景。例如,在游戏开发中,可以使用RigidVehicle来模拟车辆的驾驶和碰撞行为;在物理模拟中,可以使用RigidVehicle来研究车辆的动力学特性;在教育应用中,可以使用RigidVehicle来教授物理学和工程学知识。

2、前置代码准备

2.1 代码

<template><canvas ref="cannonDemo" class="cannonDemo"></canvas>
</template><script setup>
import { onMounted, ref } from "vue"
import * as THREE from 'three'
import * as CANNON from 'cannon-es'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
const cannonDemo = ref('null')onMounted(() => {const cannonDemoDomWidth = cannonDemo.value.offsetWidthconst cannonDemoDomHeight = cannonDemo.value.offsetHeight// 创建场景const scene = new THREE.Scene// 创建相机const camera = new THREE.PerspectiveCamera( // 透视相机45, // 视角 角度数cannonDemoDomWidth / cannonDemoDomHeight, // 宽高比 占据屏幕0.1, // 近平面(相机最近能看到物体)1000, // 远平面(相机最远能看到物体))camera.position.set(0, 2, 40)// 创建渲染器const renderer = new THREE.WebGLRenderer({antialias: true, // 抗锯齿canvas: cannonDemo.value})// 设置设备像素比renderer.setPixelRatio(window.devicePixelRatio)// 设置画布尺寸renderer.setSize(cannonDemoDomWidth, cannonDemoDomHeight)const light = new THREE.AmbientLight(0x404040, 200); // 柔和的白光scene.add(light);let meshes = []let phyMeshes = []const physicsWorld = new CANNON.World()// 设置y轴重力physicsWorld.gravity.set(0, -9.82, 0)const planeShap = new CANNON.Plane()const planeBody = new CANNON.Body({shape: planeShap,mass: 0,type: CANNON.BODY_TYPES.STATIC,position: new CANNON.Vec3(0,0,0)})planeBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1,0,0), Math.PI/2)physicsWorld.addBody(planeBody)phyMeshes.push(planeBody)const planeGeometry = new THREE.PlaneGeometry(100,100)const planeMaterial = new THREE.MeshBasicMaterial({color: 0xE0E0E0, side: THREE.DoubleSide})const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)scene.add(planeMesh)meshes.push(planeMesh)const axesHelper = new THREE.AxesHelper(30);scene.add(axesHelper);const updatePhysic = () => { // 因为这是实时更新的,所以需要放到渲染循环动画animate函数中physicsWorld.step(1 / 60)for (let i = 0; i < phyMeshes.length; i++) {meshes[i].position.copy(phyMeshes[i].position)meshes[i].quaternion.copy(phyMeshes[i].quaternion)}}// 控制器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>
<style scoped>
.cannonDemo {width: 100vw;height: 100vh;
}
</style>

2.2 效果

我们只是创建了一个刚体地板,如下图所示:
请添加图片描述


3、RigidVehicle结合three的使用

3.1 代码

创建车身及车轮代码如下:

    // 创建车身const chassisShape = new CANNON.Box(new CANNON.Vec3(5, 0.5, 2))const chassisBody = new CANNON.Body({mass: 1,shape: chassisShape,})chassisBody.position.set(0, 5, 0)// physicsWorld.addBody(chassisBody)phyMeshes.push(chassisBody)// threejsconst chassisMesh = new THREE.Mesh(new THREE.BoxGeometry(10, 1, 4),new THREE.MeshBasicMaterial({color: 0xE066FF}))scene.add(chassisMesh)meshes.push(chassisMesh)// 创建刚性车子const vehicle = new CANNON.RigidVehicle({chassisBody})// 创建轮子1const wheelShape = new CANNON.Sphere(1.5)const wheelBody1 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody1,position: new CANNON.Vec3(-4, -0.5, 3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody1)phyMeshes.push(wheelBody1)// 创建轮子2const wheelBody2 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody2,position: new CANNON.Vec3(4, -0.5, 3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody2)phyMeshes.push(wheelBody2)// 创建轮子3const wheelBody3 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody3,position: new CANNON.Vec3(4, -0.5, -3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody3)phyMeshes.push(wheelBody3)// 创建轮子4const wheelBody4 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody4,position: new CANNON.Vec3(-4, -0.5, -3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody4)phyMeshes.push(wheelBody4)// threejs轮子1const wheelMesh1 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),new THREE.MeshBasicMaterial({color: 0x898220}))scene.add(wheelMesh1)meshes.push(wheelMesh1)// threejs轮子2const wheelMesh2 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),new THREE.MeshBasicMaterial({color: 0x898220}))scene.add(wheelMesh2)meshes.push(wheelMesh2)// threejs轮子3const wheelMesh3 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),new THREE.MeshBasicMaterial({color: 0x898220}))scene.add(wheelMesh3)meshes.push(wheelMesh3)// threejs轮子4const wheelMesh4 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),new THREE.MeshBasicMaterial({color: 0x898220}))scene.add(wheelMesh4)meshes.push(wheelMesh4)// 将车子的约束添加到世界里vehicle.addToWorld(physicsWorld)

3.1.2 效果

请添加图片描述

3.2 控制车子移动

写入监听事件,代码如下:

    window.addEventListener('keydown', (event) => {if (event.key == 'w') {vehicle.setWheelForce(50, 0)vehicle.setWheelForce(50, 3)}if (event.key == 's') {vehicle.setWheelForce(-50, 0)vehicle.setWheelForce(-50, 3)}if (event.key == 'a') {vehicle.setSteeringValue(Math.PI/4, 0)vehicle.setSteeringValue(Math.PI/4, 3)}if (event.key == 'd') {vehicle.setSteeringValue(-Math.PI/4, 0)vehicle.setSteeringValue(-Math.PI/4, 3)}})window.addEventListener('keyup', (event) => {if (event.key == 'w') {vehicle.setWheelForce(0, 0)vehicle.setWheelForce(0, 1)}if (event.key == 's') {vehicle.setWheelForce(0, 0)vehicle.setWheelForce(0, 1)}if (event.key == 'a') {vehicle.setSteeringValue(0, 0)vehicle.setSteeringValue(0, 3)}if (event.key == 'd') {vehicle.setSteeringValue(0, 0)vehicle.setSteeringValue(0, 3)}})

3.2.1 效果

请添加图片描述


4、完整代码

最后给出完整代码如下:

<template><canvas ref="cannonDemo" class="cannonDemo"></canvas>
</template><script setup>
import { onMounted, ref } from "vue"
import * as THREE from 'three'
import * as CANNON from 'cannon-es'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
const cannonDemo = ref('null')onMounted(() => {const cannonDemoDomWidth = cannonDemo.value.offsetWidthconst cannonDemoDomHeight = cannonDemo.value.offsetHeight// 创建场景const scene = new THREE.Scene// 创建相机const camera = new THREE.PerspectiveCamera( // 透视相机45, // 视角 角度数cannonDemoDomWidth / cannonDemoDomHeight, // 宽高比 占据屏幕0.1, // 近平面(相机最近能看到物体)1000, // 远平面(相机最远能看到物体))camera.position.set(0, 2, 40)// 创建渲染器const renderer = new THREE.WebGLRenderer({antialias: true, // 抗锯齿canvas: cannonDemo.value})// 设置设备像素比renderer.setPixelRatio(window.devicePixelRatio)// 设置画布尺寸renderer.setSize(cannonDemoDomWidth, cannonDemoDomHeight)const light = new THREE.AmbientLight(0x404040, 200); // 柔和的白光scene.add(light);let meshes = []let phyMeshes = []const physicsWorld = new CANNON.World()// 设置y轴重力physicsWorld.gravity.set(0, -9.82, 0)const planeShap = new CANNON.Plane()const planeBody = new CANNON.Body({shape: planeShap,mass: 0,type: CANNON.BODY_TYPES.STATIC,position: new CANNON.Vec3(0, 0, 0)})planeBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2)physicsWorld.addBody(planeBody)phyMeshes.push(planeBody)const planeGeometry = new THREE.PlaneGeometry(100, 100)const planeMaterial = new THREE.MeshBasicMaterial({ color: 0xE0E0E0, side: THREE.DoubleSide })const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)scene.add(planeMesh)meshes.push(planeMesh)// 创建车身const chassisShape = new CANNON.Box(new CANNON.Vec3(5, 0.5, 2))const chassisBody = new CANNON.Body({mass: 20,shape: chassisShape,})chassisBody.position.set(0, 5, 0)// physicsWorld.addBody(chassisBody)phyMeshes.push(chassisBody)// threejsconst chassisMesh = new THREE.Mesh(new THREE.BoxGeometry(10, 1, 4),new THREE.MeshBasicMaterial({color: 0xE066FF}))scene.add(chassisMesh)meshes.push(chassisMesh)// 创建刚性车子const vehicle = new CANNON.RigidVehicle({chassisBody})// 创建轮子1const wheelShape = new CANNON.Sphere(1.5)const wheelBody1 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody1,position: new CANNON.Vec3(-4, -0.5, 3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody1)phyMeshes.push(wheelBody1)// 创建轮子2const wheelBody2 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody2,position: new CANNON.Vec3(4, -0.5, 3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody2)phyMeshes.push(wheelBody2)// 创建轮子3const wheelBody3 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody3,position: new CANNON.Vec3(4, -0.5, -3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody3)phyMeshes.push(wheelBody3)// 创建轮子4const wheelBody4 = new CANNON.Body({mass: 1,shape: wheelShape})vehicle.addWheel({body: wheelBody4,position: new CANNON.Vec3(-4, -0.5, -3.5),direction: new CANNON.Vec3(0, -1, 0)})// physicsWorld.addBody(wheelBody4)phyMeshes.push(wheelBody4)// threejs轮子1const wheelMaterial = new THREE.MeshBasicMaterial({color: 0x898220,wireframe: true})const wheelMesh1 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),wheelMaterial)scene.add(wheelMesh1)meshes.push(wheelMesh1)// threejs轮子2const wheelMesh2 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),wheelMaterial)scene.add(wheelMesh2)meshes.push(wheelMesh2)// threejs轮子3const wheelMesh3 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),wheelMaterial)scene.add(wheelMesh3)meshes.push(wheelMesh3)// threejs轮子4const wheelMesh4 = new THREE.Mesh(new THREE.SphereGeometry(1.5, 20, 20),wheelMaterial)scene.add(wheelMesh4)meshes.push(wheelMesh4)// 将车子的约束添加到世界里vehicle.addToWorld(physicsWorld)window.addEventListener('keydown', (event) => {if (event.key == 'w') {vehicle.setWheelForce(50, 0)vehicle.setWheelForce(50, 3)}if (event.key == 's') {vehicle.setWheelForce(-50, 0)vehicle.setWheelForce(-50, 3)}if (event.key == 'a') {vehicle.setSteeringValue(Math.PI/4, 0)vehicle.setSteeringValue(Math.PI/4, 3)}if (event.key == 'd') {vehicle.setSteeringValue(-Math.PI/4, 0)vehicle.setSteeringValue(-Math.PI/4, 3)}})window.addEventListener('keyup', (event) => {if (event.key == 'w') {vehicle.setWheelForce(0, 0)vehicle.setWheelForce(0, 1)}if (event.key == 's') {vehicle.setWheelForce(0, 0)vehicle.setWheelForce(0, 1)}if (event.key == 'a') {vehicle.setSteeringValue(0, 0)vehicle.setSteeringValue(0, 3)}if (event.key == 'd') {vehicle.setSteeringValue(0, 0)vehicle.setSteeringValue(0, 3)}})const axesHelper = new THREE.AxesHelper(30);scene.add(axesHelper);const updatePhysic = () => { // 因为这是实时更新的,所以需要放到渲染循环动画animate函数中physicsWorld.step(1 / 60)for (let i = 0; i < phyMeshes.length; i++) {meshes[i].position.copy(phyMeshes[i].position)meshes[i].quaternion.copy(phyMeshes[i].quaternion)}}// 控制器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>
<style scoped>
.cannonDemo {width: 100vw;height: 100vh;
}
</style>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1557534.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Unity UndoRedo(撤销重做)功能

需求 撤销与重做功能 思考 关于记录的数据的两点思考&#xff1a; 记录操作记录影响显示和逻辑的所有数据 很显然这里就要考虑取舍了&#xff1a; 记录操作 这种方案只需要记录每一步的操作&#xff0c;具体这个操作要怎么渲染和实现出来完全需要自己去实现&#xff0c;这…

不宜使用Selenium自动化的10个测试场景

尽管在很多情况下测试自动化是有意义的&#xff0c;但一些测试场景是不应该使用自动化测试工具的&#xff0c;比如Selenium、WebDriver。 下面有10个示例&#xff0c;来解释为什么自动化在这种情况下使用时没有意义的&#xff0c;我还将为您提供每种方法的替代方法。 01.验证…

计算机毕业设计 | SpringBoot+vue 学生成绩课程管理 教务管理系统(附源码)

1&#xff0c;项目背景 教育需求增长 随着社会的发展&#xff0c;对于教育质量的要求也在不断提高。传统的手工操作和纸质记录已经不能满足现代教学的需求。因此&#xff0c;一个自动化、数字化的教务管理系统成为了必然的选择。 信息化趋势 现代科技的飞速发展使得信息化成为…

通过Dockerfile 安装rabbitMq

一、编写Dockerfile Dockerfile 指令详细注释如下&#xff1a; # 使用带有管理插件的官方 RabbitMQ 镜像作为基础 FROM rabbitmq:3.9-management# 复制自定义模板文件到 RabbitMQ 管理插件的模板目录 # 这里假设 ./users.ejs 和 ./limits.ejs 是用于自定义管理界面的模板文件…

七、InnoDB数据存储结构

文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的大小1.4 页的上层结构2. 页的内部结构2.1 第1部分:File Header(文件头部)和 File Trailer(文件尾部)2.1.1 File Header(文件头部)2.1.2 File tRAILER(文件尾部)2.2 第2部分:Fr…

网络知识点之—EVPN

EVPN&#xff08;Ethernet Virtual Private Network&#xff09;是下一代全业务承载的VPN解决方案。EVPN统一了各种VPN业务的控制面&#xff0c;利用BGP扩展协议来传递二层或三层的可达性信息&#xff0c;实现了转发面和控制面的分离。 EVPN解决传统L2VPN的无法实现负载分担、…

【优选算法】--- 分治 快速排序

分治 快速排序 一、颜色分类 / 对快排的复习1、题目解析2、算法原理3、代码 二、排序数组&#xff08;快排的方法&#xff09;1、题目解析2、算法原理3、代码 三、数组中的第K个最大元素1、题目解析2、算法原理3、代码 四、库存管理 III&#xff08;原&#xff1a;剑指 Offer .…

如何使用pymysql和psycopg2连接MySQL和PostgreSQL数据库

在现代软件开发中&#xff0c;数据库是存储和管理数据的核心组件。Python作为一种流行的编程语言&#xff0c;提供了多种方式来连接和操作数据库。在这篇文章中&#xff0c;我们将探讨如何使用pymysql和psycopg2这两个库来连接MySQL和PostgreSQL数据库。我们将从基础概念开始&a…

Khronos:动态环境下时空度量语义SLAM的统一方法

Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言&#xff1a; 人类居住环境通常是高度动态的&#xff0c;人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作&#xff0c;仅仅建立一…

想要加密电脑?盘点2024年企业常用的10款电脑文件加密软件

在企业数据安全的时代背景下&#xff0c;文件加密已经成为保护企业核心信息、应对网络安全威胁的关键举措。无论是保护机密的商业数据&#xff0c;还是遵守数据隐私合规性要求&#xff0c;企业对文件加密软件的需求日益增长。本文将盘点2024年企业常用的10款电脑文件加密软件&a…

安卓如何实现双击触摸唤醒点亮屏幕功能-源码分析linage os高通平台

背景&#xff1a; 前面文章已经有讲解过双击亮屏在一些方案调研情况&#xff0c;刚好linage os手机本身也有这个功能&#xff0c;刚好也有整体开源源码&#xff0c;所以今天带大家来对双击亮屏的源码部分进行剖析&#xff0c;本篇文章会一直分析到hal操作驱动节点。 设置作为…

重学SpringBoot3-集成Redis(二)之注解驱动

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;二&#xff09;之注解驱动 1. 为什么选择 Redis 作为缓存&#xff1f;2. 如何在 Spring Boot 中启用 Redis 缓存&#xff1f;2.1 …

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、数组第3天、双指针第4天、滑动窗口第5天、贪心算法第6天、二分查找第7天、分治递归 六、集训总结 大家好&#xff0c;我是哪吒。 最…

Qt程序打包(解决找到dll问题)

1、运行Qt程序找不到dll 在Qt Creator外&#xff0c;运行Qt编译的exe程序&#xff0c;常常出现找不到xxx.dll而无法运行的问题。 解决的办法之一是找到Qt安装目录下bin文件夹中的dll文件&#xff0c;将该路径添加到系统环境变量path中去。 第二种办法就是对Qt程序进行打包&…

来了,使用YOLOv11目标检测教程

来了&#xff0c;使用YOLOv11目标检测教程 概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布&#xff1a;https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本&#xff0c;结合了尖端的准确性、速度和效率&#xff…

【LeetCode】动态规划—72. 编辑距离(附完整Python/C++代码)

动态规划—72. 编辑距离 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 编辑距离问题是字符串处理中的经…

threejs-模型贴图颜色与图片存在色差 问题解决方案

我使用的是obj模型&#xff0c;然后加载的话使用的是texturelLoader加载器&#xff0c;效果是这样的 使用的场景是&#xff1a;能够将图片贴到衣服上&#xff0c;并且能够移动旋转等操作贴图&#xff0c;但是这存在很明显的色差问题&#xff0c;具体的解决方案是&#xff1a; 我…

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

LeetCode 48 Rotate Image 解题思路和python代码

题目&#xff1a; You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …

桥水基金、贝莱德、摩根士丹利选择极狐GitLab 的五大理由!

疯狂上涨的 A股、港股 节前一周&#xff0c;上证指数累计上涨超 12%&#xff0c;创下2008年11月以来最大单周涨幅&#xff1b;深证成指累计上涨超17%&#xff0c;创下1996年4月最大单周涨幅&#xff1b;创业板指上涨超22%&#xff0c;创下史上最大单周涨幅。 过去两周&#x…