昨天,我们分享了一篇2D物理文档《LayaAirIDE的可视化2D物理使用文档》。

今天,我们针对LayaAir引擎的初学者,以及对物理引擎使用不熟悉的开发者,再来分享一篇3D物理文档,本篇文档全面介绍了3D物理引擎使用的基础能力。方便开发者快速上手。

LayaAir 3D引擎集成了世界三大物理引擎之一的Bullet引擎,当在Unity中使用了物理组件,用LayaAir的Unity插件导出后,默认就是采用的Bullet引擎。当然,LayaAir引擎也支持使用比较轻量的Cannon.js物理引擎的基础功能。

阅读本篇时,除非是Cannon物理引擎的专属章节,或者注明是cannon物理引擎,默认介绍都是基于LayaAir封装的Bullet引擎。

一、刚体

1.1 什么是刚体

无论是2D,还是3D,物理的开篇,都需要先了解刚体,这是物理引擎的基础之一。

大家都知道,自然界一切有形体的物质,都可以叫物体。

刚体是力学中为了体现物体特性的一种科学抽象概念,也是一种理想状态的力学表达模型,是指在运动中和受到力的作用后,形状和大小不变,而且内部各点的相对位置不变的物体。

然而,现实中不可能存在这种理想模型,物体在受力之后,会根据力、材料、弹性、 塑性等综合因素,决定是否改变或改变多少。如果物体本身的变化不影响整个运动过程,为使被研究的问题简化,仍将该物体当作刚体来处理而忽略物体的体积和形状,这样所得结果仍与实际情况相当符合。

1.2 常用的刚体属性

isKinematic是否为运动刚体

3D的刚体,默认是动力学刚体。会受力的影响,可以位移。

一旦我们把刚体设置为运动刚体类型后,即将isKinematic的值设置为true。

那么运动刚体可以触发第三方的物理反馈,自己却不受物理影响。例如,运动刚体与动力学刚体发生撞击,动力学刚体会受力反弹,但运动刚体却不会受力的影响,不会产生受力位移,运动刚体的位移只能通过transform改变节点坐标。

与2D的运动学类型刚体不同,LayaAir 3D的运动刚体脱离了物理引擎运动,即使设置速度也不可以使其位移。这样做的好处是减少了物理运算,节省了性能。

mass质量

质量是物质的量的量度,Bullet引擎中的质量单位为kg。

刚体的质量越大,运动状态改变越难,比如,不同质量的两个物体相撞,质量大的一方改变更小一些,如动图1的右侧所示:

(动图1)

静态刚体和运动刚体就相当于无限大质量,所以不受力的影响。

gravity 重力

自然界中物体受地心吸引的作用而受到的力叫重力,物理引擎中也同样模拟了重力,

动力学刚体在同等的质量下,重力越大,下落的加速度越大。对比效果如动图1-1。

(动图1-1)

linearVelocity 线性速度

刚体的linearVelocity属性称为线速度或者线性速度,是指物体的直线运动速度。

动力学刚体的线速度是3维向量Vector3类型值,向量的方向即速度的方向,向量的长度即速度的大小。

动图1-2,是动力学刚体在同样重力值为0的情况下,没有设置线速度和y轴设置了线速度值的对比效果。

(动图1-2)

linearDamping 线性阻尼

刚体的linearDamping属性,是指线性速度的阻尼系数,使得线性速度衰减。

动图1-3,是动力学刚体在重力为0并且y轴设置了同样为-1的线速度值情况下,左侧为0.9线性阻尼值和右侧为1线性阻尼值的对比效果。

(动图1-3)

angularVelocity 角速度

刚体的angularVelocity属性是角速度, 角速度简单理解就是单位时间的角位移,以弧度每秒进行旋转 。当我们设置动力学刚体angularVelocity属性为正值的时候,则按顺时针旋转位移。angularVelocity属性为负值的时候,则按逆时针旋转位移。属性值的绝对值越大,旋转位移速度越快。

(动图1-4)

angulaVelocity属性的值是3维向量Vector3类型值,Bullet使用欧拉角来描述物体的旋转,3D向量的每个分量代表绕x、y、z轴旋转的速度,单位是弧度/秒。动图1-4,就是在x轴分别设置了3.14与31.4的对比效果。

angularDamping 角阻尼

刚体的角阻尼相当于是为角速度旋转方向施加了相反的力,使得旋转速度衰减。动图1-5,是在同样的31.4角速度下,左侧为1的的角阻尼值,右侧为0.9的角阻尼值,对比效果。

(动图1-5)


二、物理碰撞

碰撞是物理引擎中最基础、最常用的功能。在这个小节里,我们对3D物理碰撞进行全面的认知。

2.1 碰撞器与触发器

对于检测3D物理碰撞的方式,有碰撞器与触发器两种。我们先从概念认知开始。

2.1.1 碰撞器

在LayaAir引擎2D物理的时候,通过封装的不同形状的碰撞体,就可以直接实现带范围的物理碰撞。

而LayaAir引擎的3D物理,形状不再是最主要的特征,只是碰撞器用于检测碰撞范围的三维形状区域。

完整的3D碰撞器,由碰撞器和碰撞器形状两部分组成。

3D碰撞器根据特点的不同,分为静态碰撞器、刚体碰撞器、角色碰撞器。

这些碰撞器必须要添加三维碰撞器形状(例如:盒形、球形、圆锥形、圆柱形、胶囊形、平面、混合、模型网格),才可以实现有范围的物理碰撞。

    

(图2)

图2是胶囊形状角色碰撞器的编辑预览效果。

2.1.2 触发器

LayaAir 3D物理的触发器相当于2D物理里的传感器。

触发器是碰撞器的一个属性,任何碰撞器的触发器属性设置生效后,当前的碰撞器即转变为触发器(比如,刚体碰撞器设置触发器后可称为刚体触发器)。即使发生物体接触,也不会产生碰撞的物理反馈。例如,动图3-1右侧所示。下落的盒子无视物理引擎,直接穿透而过。

(动图3-1)

设置触发器后,虽然失去了物理引擎反馈,但是可以激活触发器的事件生命周期方法,用于检测物体间碰撞接触的发生。

激活触发器生命周期也有特定的情况除外,具体规则会在下面的物理生命周期章节介绍

当触发器isTrigger设置为true时,或者在Unity的碰撞体组件那里勾选Is Trigger并导出使用时,如图3-2所示。触发器即可设置生效。

(图3-2)

通过LayaAir引擎代码设置触发器的方式:

/*
……省略若干代码
*/
//创建盒型MeshSprite3D
let box = scene.addChild(newLaya.MeshSprite3D(Laya.PrimitiveMesh.createBox(sX, sY, sZ)))asLaya.MeshSprite3D;
//创建静态碰撞器
let staticCollider:Laya.PhysicsCollider= box.addComponent(Laya.PhysicsCollider);
//设置为触发器,取消物理反馈
staticCollider.isTrigger =true;
/*
……省略若干代码
*/

2.2 理解各种碰撞器

2.2.1 静态碰撞器 PhysicsCollider

LayaAir的3D物理碰撞器类是PhysicsCollider,为了便于记忆和理解,我们叫他静态碰撞器类。因为它的特性是不受力,不会产生物理移动。

当其与动力学刚体碰撞器或角色碰撞器发生物理碰撞后,可以触发物理碰撞生命周期方法,但不会产生物理的受力位移。

这种碰撞器可以用于不需要物理受力位移的物体,只需要触发碰撞逻辑的应用场景。例如墙体,撞墙后判定游戏结束。

在Unity中,如果我们添加了某种Collider组件,但并没有添加Rigidbody组件,那导出后就是PhysicsCollider

2.2.2 刚体碰撞器 Rigidbody3D

LayaAir的2D物理刚体与碰撞体是分开的,而3D物理的刚体与碰撞器是整合的,Rigidbody3D类即是刚体也是碰撞器,我们可称为刚体碰撞器。

默认情况下,Rigidbody3D动力学类型的刚体碰撞器,这是可以受力影响的刚体类型碰撞器,所以我们通常用动力学刚体碰撞器进行受力的交互反馈。例如,撞击后的反弹、飞出或者倒下,放在空中会受重力影响而掉落,等等。

当我们将刚体Rigidbody3DisKinematic设置为true后,那么默认的动力学刚体碰撞器就转变为运动刚体碰撞器。

运动刚体碰撞器从表象上看,与静态碰撞器基本上没有什么区别。都是不受重力、不受速度、不受其它力的影响,在物理世界中永远处于静止,只能通过transform去改变节点坐标来移动。

但实质上,运动刚体有物理特性,它可以是施力物体,可以对非运动刚体产生力,例如通过控制节点去移动运动刚体,会推着挡在前面的动力学刚体移动。而静态碰撞器的应用场景则是要永远不动,也无法施加力。并且,通过节点去移动静态碰撞器,也比较消耗性能。如果有移动的碰撞器需求,例如来回移动的跳板或障碍,使用运动刚体碰撞器就可以了。

通过代码设置运动刚体的方式:

/*
……省略若干代码
*/
//创建刚体碰撞器
let _rigidBody = sphere.addComponent(Laya.Rigidbody3D)asLaya.Rigidbody3D;
//开启运动类型刚体
_rigidBody.isKinematic =true;
/*
……省略若干代码
*/

在Unity中设置运动类型刚体的方式,如图4所示:

(图4)

由于LayaAir的3D物理中有了静态碰撞器PhysicsCollider,所以并没有在Rigidbody3D中去实现静力学类型的刚体碰撞器。有静止的碰撞反馈需求,直接使用静态碰撞器即可。

2.2.3 角色碰撞器 CharacterController

角色控制器类CharacterController常用于对第一人称和第三人称游戏角色的控制,可以方便的控制角色的跳跃、跳跃速度、降落速度、行走、等。

由于角色控制器继承于PhysicsComponent,也具有碰撞器的特性,可以添加三维碰撞形状,产生碰撞的反馈,因此也称为角色碰撞器,属于碰撞器之一。

与静态碰撞器和刚体碰撞器都继承自物理触发器组件PhysicsTriggerComponent不同,角色控制器直接继承于物理组件的父类PhysicsComponent。所以,角色控制器是无法设置为触发器的。但是,角色碰撞器与触发器进行接触,仍然可以激活触发器事件的生命周期方法。

2.3 碰撞形状

碰撞形状是用于检测碰撞接触的范围,只有添加了形状,碰撞器和触发器才能触发物理反馈和生命周期。

LayaAir引擎支持8种3D碰撞形状,分别为:

盒形BoxColliderShape
球形SphereColliderShape
圆柱形CylinderColliderShape
胶囊形CapsuleColliderShape
圆锥形ConeColliderShape
平面形状StaticPlaneColliderShape
复合形状CompoundColliderShape
网格形状MeshColliderShape

2.3.1 Unity中可导出的碰撞形状

Unity中的盒形碰撞体Box collider、球形碰撞体Sphere Collider、胶囊形碰撞体Capsule Collider、网格碰撞体 Mesh Collider,这4种组件是可以通过LayaAir导出插件直接导出使用的。

这些组件包括了碰撞形状,无需通过引擎代码添加碰撞形状,所以对于盒形、球形、胶囊形、网格形、以及由以上基础形状碰撞体组合而成的复合碰撞形状。都建议在Unity里编辑导出使用。

需要注意的是,这些碰撞体组件的节点如果没有添加刚体组件,那导出后在LayaAir引擎属于静态碰撞器,加上Rigidbody组件后,在LayaAir引擎属刚体碰撞器。

下面我们简单介绍一下这些碰撞体形状的基础属性设置

盒形碰撞形状

盒形碰撞形状是通过设置XYZ调整长宽高的长方体(含立方体)形状。常用于盒子外形的长方体物体,如图5-1所示。

(图5-1)
在Unity中,为物体节点对象添加Box Collider组件,设置XYZ各轴的大小,如图5-2所示,导出后即可使用。

(图5-2)

球形碰撞形状

球形碰撞形状是通过设置半径调整球体大小的碰撞形状。常用于球形外观的物体,如图6-1所示。

(图6-1)

在Unity中,为物体节点对象添加Sphere Collider组件,设置半径,如图6-2所示,导出后即可使用。

(图6-2)

胶囊形碰撞形状

胶囊形碰撞形状是由两个半球和一个圆柱体组成,需要通过设置球体半径和圆柱体的高来组成胶囊形状。常用于角色碰撞器。如图7-1所示。

(图7-1)

在Unity中,为物体节点对象添加Capsule Collider组件,设置半径和高,如图7-2所示,导出后即可使用。

(图7-2)

网格形碰撞形状

网格形碰撞形状是利用模型网格资源构建的形状,如图8-1的蜥蜴所示。相对于其它固定规则的碰撞形状(LayaAir内置的3D碰撞基础形状),网格形碰撞形状属于自定义任意外观的碰撞形状,可以适用于任何模型网格。

(图8-1)

在Unity中,为物体节点对象添加Mesh Collider组件,设置模型网格,如图8-2所示,导出后即可使用。

(图8-2)

复合碰撞形状

复合碰撞形状是由多个基础形状组合而成的碰撞器形状。例如桌子或者凳子等,可以由多个盒形碰撞形状组成,如图8-3所示。

(图9-1)

LayaAir引擎的复合碰撞形状,其实Unity中并没有直接对应的组件。但是,开发者在Unity中,对同一个节点对象添加多个基础的碰撞体,例如同时添加Box Collider组件和Sphere Collider组件,如图8-4所示,那通过LayaAir的导出插件导出后,会自动识别为复合碰撞形状。

(图9-2)

2.3.2 Unity没有的LayaAir碰撞形状

除了Unity碰撞体组件支持的一些形状外,LayaAir引擎中还内置了一些基础的3D碰撞形状。这些只能通过代码的方式进行添加。

分别是:圆柱形、圆锥形、平面形状。

圆柱形碰撞形状

圆柱形碰撞形状是由两个大小相等、相互平行的圆形(底面)以及连接两个底面的一个曲面(侧面)围成的几何体形状,通过设置底面半径和连接高度来调整碰撞形状的大小。常用于场景的柱子等圆柱形外观的物体碰撞。如图10-1所示。

(图10-1)

项目代码里,通过创建一个CylinderColliderShape实例的方式,传入半径和高,即可返回一个圆柱形碰撞形状对象,将这个对象添加给碰撞器的colliderShape属性即可。API说明如图10-2所示。

(图10-2)

圆锥形碰撞形状

圆锥形碰撞形状是以直角三角形的直角边所在直线为旋转轴,其余两边旋转360度而成的曲面所围成的几何体形状。需要设置底面半径和锥体高来调整碰撞形状大小。常用于锥体外观的物体碰撞。如图11-1所示。

(图11-1)

项目代码里,通过创建一个ConeColliderShape实例的方式,传入半径和高,即可返回一个圆锥形碰撞形状对象,将这个对象添加给碰撞器的colliderShape属性即可。API说明如图11-2所示。

(图11-2)

平面碰撞形状

平面碰撞形状,是一种无限大的2D平面碰撞形状。通常用于整个场景地面的碰撞形状。通过法线来确定在3维世界的平面朝向,可以通过偏移值来调整距离原点的偏移多少。API说明如图12-1所示。

(图12-1)

通过API,我们可以看到normal是一个3维向量值,表示着平面的法线。例如这个值为Vector3(0, 1, 0),则表示法线位于Y轴正方向,平面碰撞形状就是处于其垂直的X轴无限大水平面。

图12-2是法线同样位于Y轴正方向,偏移值offset分别为0(左侧)和为1(右侧)的效果对比。

(图12-2)

2.3.3 碰撞器的形状添加示例
使用Unity导出的碰撞组件

Unity导出的碰撞组件使用起来最简单,由于组件已经整合了碰撞器和碰撞形状,直接加载就可以使用了。某些情况下甚至可以不写代码,所以我们介绍一下使用Unity的节点对象和刚体,通过代码添加碰撞形状的示例。

在Unity中,是可以直接创建圆柱体这种基础3D对象的,但是Unity没有圆柱形碰撞组件,创建的圆柱体默认是胶囊碰撞体组件Capsule Collider,所以,我们删除圆柱体对象的胶囊碰撞体组件,添加刚体组件(Rigidbody)导出,编写代码如下所示:

/*……省略若干代码*/
Laya.Scene3D.load("Conventional/SampleScene.ls",Laya.Handler.create(null,function(_Scene3D:Laya.Scene3D){
//添加3D场景到舞台
Laya.stage.addChild(_Scene3D);
let _camera = _Scene3D.getChildByName("Main Camera") as Laya.Camera;_camera.clearFlag = Laya.CameraClearFlags.Sky;
//从场景中找到圆柱对象
let _cylinder = _Scene3D.getChildByName("Cylinder");
//从圆柱对象上获得刚体碰撞器(对应Unity的刚体组件)
let cyRigid = _cylinder.getComponent(Laya.Rigidbody3D) as Laya.Rigidbody3D;
//创建圆柱体形状(通常与圆柱对象的大小保持一致)
let cyShape = new Laya.CylinderColliderShape(0.5,2);
//为刚体碰撞器添加碰撞形状cyRigid.colliderShape = cyShape;
}));
/*……省略若干代码*/
LayaAir内置的基础碰撞形状使用示例

内置的碰撞器使用思路为,创建节点对象,创建碰撞器,创建碰撞器形状,为碰撞器添加碰撞形状。

我们以创建圆锥形刚体碰撞器为例,编写代码如下所示:

/*……省略若干代码*/
/**增加圆锥形刚体碰撞器 */
private addCone():void{
//生成随机值半径和高
let raidius =Math.random()*0.2+0.2;
let height =Math.random()*0.5+0.8;
//创建圆锥形3D模型节点对象
let cone =newLaya.MeshSprite3D(Laya.PrimitiveMesh.createCone(raidius, height));
//把圆锥形3D节点对象添加到3D场景节点下
this.newScene.addChild(cone);
//设置随机位置
this.tmpVector.setValue(Math.random()*6-2,6,Math.random()*6-2);cone.transform.position =this.tmpVector;
//为圆锥形3D节点对象创建刚体碰撞器
let _rigidBody =<Laya.Rigidbody3D>(cone.addComponent(Laya.Rigidbody3D));
//创建圆锥形碰撞器形状(使用节点对象的值,保持一致性)
let coneShape =newLaya.ConeColliderShape(raidius, height);
//为刚体碰撞器添加碰撞器形状_rigidBody.colliderShape = coneShape;
}
/*……省略若干代码*/

其它基础形状的创建可参考官网的引擎示例

复合碰撞形状的使用示例

虽然可以通过Unity导出复合的碰撞形状,这里也有必要单独介绍一下复合碰撞形状如何通过代码添加。

复合碰撞形状主要就是可以添加多个不同的子形状,理解后其实也是非常简单。

创建复合碰撞形状的方式并不复杂,先实例化复合碰撞形状CompoundColliderShape(),再通过复合碰撞形状对象的addChildShape方法添加基础碰撞形状子对象即可。

我们继续通过代码和注释来理解。编写代码如下所示:

/*……省略若干代码*/
Laya.Mesh.load("res/threeDimen/Physics/table.lm",Laya.Handler.create(this,function(mesh:Laya.Mesh){
//读取Unity导出的桌子模型节点对象,添加到3D场景节点下,
var table = scene.addChild(newLaya.MeshSprite3D(mesh))asLaya.MeshSprite3D;
//给桌子节点对象添加刚体碰撞器
var rigidBody = table.addComponent(Laya.Rigidbody3D)asLaya.Rigidbody3D;
//实例化一个复合碰撞形状对象
var compoundShape:Laya.CompoundColliderShape=newLaya.CompoundColliderShape();
//创建盒形碰撞形状
var boxShape:Laya.BoxColliderShape=newLaya.BoxColliderShape(0.5,0.4,0.045);
//获取本地偏移
var localOffset:Laya.Vector3= boxShape.localOffset;
//修改偏移localOffset.setValue(0,0,0.125);boxShape.localOffset = localOffset;
//为复合碰撞形状对象添加子形状(刚刚创建的盒形碰撞形状)compoundShape.addChildShape(boxShape);
//后面的代码都是类似,把一个个的子形状都添加到复合碰撞形状对象上。子形状也可以是别的形状,例如球形、圆柱形等,根据模型节点的实际情况来。
/*……省略若干boxShapeXX类似的代码,只保持到boxShape4*/
var boxShape4:Laya.BoxColliderShape=newLaya.BoxColliderShape(0.1,0.1,0.3);
var localOffset4:Laya.Vector3= boxShape4.localOffset;localOffset4.setValue(0.2,0.153,-0.048);boxShape4.localOffset = localOffset3;compoundShape.addChildShape(boxShape4);
//把组合好的复合碰撞形状添加给刚体碰撞器的碰撞器形状属性rigidBody.colliderShape = compoundShape;
}));
/*……省略若干代码*/

2.4 碰撞生命周期方法

生命周期是从开始到结束的完整周期过程,有主动触发的主干生命周期方法,例如onAwake()onEnable()、等。也有被动触发的事件类生命周期虚方法,这种只有在某个条件达到时才会自动激活,例如,本小节要讲的物理事件相关的方法。

2.4.1 物理事件的生命周期方法说明

前文介绍过,检测物理碰撞的方式有两种,那物理事件的方法,也对应着两种。分别是碰撞事件生命周期方法和触发事件生命周期方法。

碰撞事件生命周期方法说明:

碰撞器之间发生碰撞后,自动激活的事件虚方法。

(点击放大查看高清图)

触发事件生命周期方法说明:

设置为触发器之后,因物体接触而自动激活的事件虚方法。

(点击放大查看高清图)

特别说明:
  • 碰撞事件的生命周期方法永远不会与触发事件的生命周期方法同时激活,只能是碰撞事件或者是触发事件。并且,如果有一方是触发器,那两方一定无法进入碰撞事件,只有进入触发事件的可能。

  • 无论是碰撞事件还是触发事件的生命周期方法,从进入到离开的顺序皆为“Enter,Stay,Stay,……,Exit”。

2.4.2 碰撞事件生命周期方法的触发条件

根据碰撞器的类型不同,并不是所有碰撞器之间,都会触发碰撞的反馈,以及激活相应的生命周期方法。

下面通过表格的方式,对应了各碰撞器之间是否可触发碰撞事件的生命周期虚方法。

(点击放大查看高清图)

总结:

通过上面的表格,我们发现,静态碰撞器和运动刚体碰撞器,只能与动力学刚体碰撞器或者是角色碰撞器碰撞才可以触发碰撞器生命周期方法,静态碰撞器和运动刚体碰撞器彼此之间,是无法触发碰撞器生命周期的。

而动力学刚体碰撞器和角色碰撞器,和任意的碰撞器发生碰撞都可以触发碰撞器生命周期方法。

2.4.3 触发事件生命周期方法的触发条件

碰撞器是只能与碰撞器之间碰撞,才有可能进入碰撞器的生命周期,

而触发器则不然,触发器不仅与触发器之间有可能进入触发器的生命周期,当触发器与碰撞器之间接触,也有可能进入触发器的生命周期,所以,我们分成两个表来理解。

触发器与触发器之间:

(点击放大查看高清图)

触发器与碰撞器之间:

(点击放大查看高清图)

总结:

通过上面的两个表格,我们发现,无论是触发器与触发器之间,还是触发器与碰撞器之间,只有静态碰撞器与静态触发器彼此之间碰撞或者接触,是无法进入物理触发事件的。

而其它类型之间接触,哪怕碰撞器没有开启触发器,甚至没有触发器属性(角色碰撞器),只要有任意一方是触发器,那也会自动进入触发器的生命周期。

2.4.4 使用生命周期方法
创建Script3D脚本

生命周期的方法,只能在脚本类里使用,所以,我们需要创建一个脚本,3D游戏必须要继承3D的脚本Script3D。空脚本的示例代码如下:

/*** TypeScript语言的3D脚本示例*/
export default class TSDemo extends Laya.Script3D{constructor(){super();}
}

2D脚本与3D脚本不要混用,如果是用IDE创建的脚本模板,需要将继承的2D脚本类(Laya.Script)改为3D脚本类(Laya.Script3D),

添加物理脚本

只有为节点添加了我们自定义的脚本,我们才可以让该节点使用生命周期方法。

添加的方式很简单,直接在代码中,用节点的addComponent()方法,就可以轻松的把继承了脚本类的3D脚本添加到节点上。

例如,我们创建一个3D盒子,并为其绑定刚刚创建的TSDemo脚本。示例代码如下:

//引入自定义脚本TSDemo
import TSDemo from"./TSDemo";
/*** TypeScript语言示例*/
export default class GameUI extends ui.TestSceneUI{
/*……省略若干代码*/
private addBox():void{
//创建盒型MeshSprite3D
let box =this.newScene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createBox(0.75,0.5,0.5))) as Laya.MeshSprite3D;
//设置材质box.meshRenderer.material =this.mat1;
//设置空间位置
let transform = box.transform;
let pos = transform.position;pos.setValue(1,6,0);transform.position = pos;
//创建刚体碰撞器
let _rigidBody = box.addComponent(Laya.Rigidbody3D) as Laya.Rigidbody3D;
//创建盒子形状碰撞器
let boxShape =new Laya.BoxColliderShape(0.75,0.5,0.5);
//设置盒子的碰撞形状_rigidBody.colliderShape = boxShape;
//添加自定义脚本组件TSDemobox.addComponent(TSDemo);
}
/*……省略若干代码*/
}
重写物理生命周期方法

之前介绍过,物理事件的生命周期方法分别为三个碰撞事件方法和三个触发事件方法。我们在使用的时候,重写这些虚方法即可,当物理行为触发了对应的物理事件就会自动执行。

重写生命周期方法的示例代码如下:

/*** TypeScript语言的3D脚本示例*/
export default class TSDemo extends Laya.Script3D{constructor(){super();}onTriggerEnter():void{/*……省略若干逻辑代码*/console.log("触发器物理事件onTriggerEnter");
}onTriggerStay():void{
/*……省略若干逻辑代码*/console.log("触发器物理事件onTriggerStay");
}onTriggerExit():void{
/*……省略若干逻辑代码*/console.log("触发器物理事件onTriggerExit");
}onCollisionEnter():void{
/*……省略若干逻辑代码*/console.log("碰撞器物理事件onCollisionEnter");
}onCollisionStay():void{
/*……省略若干逻辑代码*/console.log("碰撞器物理事件onCollisionStay");
}onCollisionExit():void{
/*……省略若干逻辑代码*/console.log("碰撞器物理事件onCollisionExit");
}
}

2.5 碰撞分组与过滤碰撞组

当我们产生复杂的碰撞需求时,例如,想碰哪个,不碰哪个。这时候就需要进行分组,并指定可以与哪个碰撞组进行碰撞。另外,设置碰撞组过滤,还会优化性能。

各种碰撞器从物理组件父类PhysicsComponent那里继承了collisionGroup与canCollideWith属性,用以实现碰撞分组和指定碰撞组。

2.5.1 碰撞组 collisionGroup

碰撞组的值,我们通常设置为2的N次幂值。如果应用场景比较复杂,需要用到的碰撞分组比较多,记不住太多2的N次幂值,也可以直接使用LayaAir引擎内置的碰撞组工具类。

LayaAir引擎内置了17个碰撞组属性值,用于过滤不需要的碰撞。

引擎内置的碰撞组工具类为Physics3DUtils

全部可碰撞的组

由于碰撞组之间的碰撞依据是位运算的按位与,按位与的计算结果非0则可以碰撞,为0则不可碰撞。

Physics3DUtils工具类的COLLISIONFILTERGROUP_ALLFILTER属性值为-1,-1与任何2的幂值进行按位与都非0,所以取该属性值为分组时,则所有的碰撞组都可碰撞。
使用示例为:

//指定xxx碰撞器所属哪个碰撞组(-1组与LayaAir任何内置组都可碰撞)
xxx.collisionGroup =Laya.Physics3DUtils.COLLISIONFILTERGROUP_ALLFILTER;
自定义碰撞分组

LayaAir内置的碰撞组,不包括刚刚讲的-1(COLLISIONFILTERGROUP_ALLFILTER),我们可以用的还有10个,分别是COLLISIONFILTERGROUP_CUSTOMFILTER1......10。全都是2的幂,从64到32768。

为了方便记忆,我们可以不记实际值,记住CUSTOMFILTER后1到10的ID号区别即可。

使用示例为:

//指定xxx碰撞器所属哪个碰撞组(COLLISIONFILTERGROUP_CUSTOMFILTER2对应的值为128)
xxx.collisionGroup =Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER2;
特定的碰撞分组

除了以上的分组外,LayaAir也对接了一些Bullet物理引擎预留的特定分组,用于比较简单的碰撞过滤需求。

例如,当前场景我们只有动态刚体碰撞器,静态碰撞器,运动学刚体碰撞器,只是对这几种碰撞器之间作碰撞过滤,那么我们就可以分别使用对应的默认碰撞组、静态碰撞组、运动学刚体碰撞组。

具体的预留分组属性说明如下:

以上的属性是原样对接了Bullet物理引擎,例如碎片碰撞组和字符过滤器的概念,当前的引擎版本还没有。开发者想用也可以,但建议不采用,推荐使用自定义碰撞分组,以ID为分组标记更便于记忆。

2.5.2 过滤碰撞组 canCollideWith
指定碰撞单个组

碰撞器的canCollideWith属性可以用于指定与哪个组碰撞,指定哪个,就可以与哪个碰撞。其它的都不可以碰撞,起到了过滤其它碰撞组的效果。

使用示例为:

//指定xxx碰撞器可以与其发生碰撞的碰撞组(本例只与自定义组1碰撞)
xxx.canCollideWith =Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER1;
指定碰撞多个组

如果我们想碰撞多个组,可以采用位运算的按位或| ,去指定多个可以与其发生碰撞的碰撞组。

使用示例为:

//指定xxx碰撞器可以与其发生碰撞的碰撞组(本例只与自定义组1、2、5进行碰撞)
xxx.canCollideWith =Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER1 |Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER2 |Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER5;

关于位运算用于碰撞的基础原理,可以点击阅读《物理引擎的碰撞分组,适用2D和3D》

指定不可碰撞的组

在多个碰撞分组的情况下,如果我们只想排除掉某个或者某几个碰撞组不与其发生碰撞,与其它所有的碰撞组发生碰撞如何处理呢?

这时候可以通过异或运算符^来实现。用 -1去异或^任何2的幂值,那该值的碰撞组就不会被碰撞。

使用示例为:

//指定不可以与其发生碰撞的碰撞组(本例将不与自定义组2、5进行碰撞,除自定义2与5组之外,都可以发生碰撞)
xxx.canCollideWith =Laya.Physics3DUtils.COLLISIONFILTERGROUP_ALLFILTER ^Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER2 ^Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER5;

三、物理约束

在物理世界中,有些物体的运动会受到其它物体的影响,例如:人体关节、钟摆、链条、滑轮组、等等。

这种限制物体运动,避免其运动超出一定限度的物理方法就是约束。由于其还具有着关节的特性表现,所以有些引擎也称为关节。

3.1 LayaAir支持哪些约束

目前在LayaAir引擎中只支持两种,分别是固定约束Fixed Constraint和可配置约束Configurable Constraint

Unity里的固定关节组件Fixed Joint可导出对应固定约束Fixed Constraint,可配置关节组件Configurable Joint可导出对应可配置约束Configurable Constraint

固定约束是比较常用的约束,而可配置约束可以模拟任意约束的效果,所以这两种约束可以满足绝大多数的常用需求。

3.2 固定约束Fixed Constraint

固定约束将对象的移动限制为依赖于另一个对象,一个物体产生位移变化 ,另一个与其约束的物体也会随之变化 。有些类似父子节点关系,但它与父子节点不同,位移不是通过transform实现,而是基于物理引擎。

固定关节类似2D物理(Box2D)里的焊接关节,适用于游戏中的物体对象永久或暂时粘在一起的需求,最好是两个没有父子关系的物理一起运动。好处是不必通过脚本更改对象的层级视图来实现所需的效果。代价是所有使用固定关节的对象都必须使用刚体。

LayaAir引擎支持Unity中固定关节Fixed Joint的三个属性(Connected Body、Break Force、Break Torque)是支持导出使用的。如下图12所示。

(图12)

3.2.1 设置连接刚体 setConnectRigidBody

Unity中的Connected Body对应LayaAir的设置连接刚体setConnectRigidBody

setConnectRigidBody用于指定固定约束要连接的刚体,若不指定,则该约束连接到世界。

3.2.2 断开力 breakForce

Unity中的Break Force对应LayaAir的断开力breakForce

breakForce用于设置破坏固定约束需要施加的最大力。

3.2.3 断开力矩 breakTorque

Unity中的Break Torque对应LayaAir的断开力矩 breakTorque

breakTorque用于设置破坏固定约束需要施加的最大力矩。

3.3 可配置约束Configurable Constraint

可配置约束可实现各种约束类型的所有功能,比如上文介绍过的固定约束,也可以通过可配置约束来实现,并且提供更强大的角色移动控制。

当开发者想要自定义布娃娃的运动并对角色强制实施某些姿势时,这种约束特别有用。使用可配置约束还可以将约束修改为开发者自行设计的高度专业化约束。

LayaAir引擎支持Unity中可配置关节的属性如图13的红框中所示。下面将逐一详细介绍。

(图13)

Unity的可配置关节Configurable Joint里的断开力Break Force和断开力矩Break Torque在LayaAir中也是支持的,由于上个小节已介绍,本小节不再重复介绍。所以图14中也没有体现。

3.3.1 设置连接刚体 setConnectRigidBody

Unity中的Connected Body对应LayaAir的设置连接刚体setConnectRigidBody

setConnectRigidBody用于指定固定约束要连接的刚体,若不指定,则该约束连接到世界。

3.3.2 锚点 anchor

Unity中的Anchor对应LayaAir的锚点anchor ,

锚点anchor 是用于定义自身刚体约束中心的点。物理模拟会使用此点作为计算的中心点。

3.3.3 主轴 axis

Unity中的Axis对应LayaAir的主轴 axis ,

主轴 axis用于基于物理模拟来定义对象自然旋转的局部轴,该轴决定了对象在物理模拟下自然旋转的方向。

3.3.4 连接锚点 connectAnchor

Unity中的Connected Anchor 对应LayaAir的连接锚点connectAnchor ,

连接锚点connectAnchor 用于设置所连接刚体的约束锚点。

例如自己是车轮,连接的刚体是车身。那锚点就是车轮的约束中心点,连接锚点就是所连接的车身约束中心点。

3.3.5 副轴 secondaryAxis

Unity中的Secondary Axis 对应LayaAir的副轴secondaryAxis,

副轴secondaryAxis的作用是与主轴axis共同定义了约束的局部坐标系。第三个轴会与这两个轴所构成的平面相垂直。

3.3.6 沿XYZ轴平移约束模式 (X\Y\Z)Motion

Unity中的X Motion, Y Motion, Z Motion 对应LayaAir的 XMotion, YMotion, ZMotion,

(X\Y\Z)Motion是表示沿 X、Y 、Z 轴平移约束的模式,根据属性设置的不同,约束的模式也不同。可以设置的值分别是:自由移动Free、锁定移动 Locked、限制性移动 Limited

自由移动Free就是不作限制的沿某轴移动。

锁定移动 Locked是没有运动,完全固定住。

限制性移动 Limited是平移运动受限于用户定义的约束。

3.3.7 绕XYZ轴旋转的角运动约束模式angular (X\Y\Z)Motion

Unity中的Angular X Motion, Angular Y Motion, Angular Z Motion 对应LayaAir的 angularXMotion, angularYMotion, angularZMotion

angular (X\Y\Z)Motion是表示绕X、Y 、Z 轴旋转的角运动约束模式,也是根据自由移动Free、锁定移动 Locked、限制性移动 Limited三种值的设置来区别约束模式,与(X\Y\Z)Motion类似,只是运动形式的线性平移和角运动旋转的区别。

3.3.8 弹簧线性限制 (linearLimitSpring、linearDamp)

Unity中的 Linear Limit Spring 是当对象超过了限制位置时要拉回对象而施加的弹簧力。该项有两个配置参数,弹簧力Spring与阻尼Damper

弹簧力Spring

其中的弹簧力Spring 在LayaAir引擎中对应线性限制的弹簧力linearLimitSpring,如果此处的值设置为零,则无法逾越限制;零以外的值将使限制变得有弹性。

阻尼Damper

其中的阻尼Damper在LayaAir引擎中对应线性阻尼linearDamp,设置为大于零的值可让约束抑制振荡(否则将不断的进行振荡)。

3.3.9 线性移动限制(minLinearLimit、maxLinearLimit、linearBounce)

Unity中的Linear Limit 是关节线性移动的限制,LayaAir导出插件只支持该项的限制Limit与反弹力Boundciness设置。

限制Limit

其中的Limit是从原点到限制位置的距离。在LayaAir引擎中需要分别设置线性移动限制的最小值minLinearLimit和线性移动限制的最大值maxLinearLimit

反弹力Boundciness

其中的反弹力 Bounciness 是当对象达到限制距离时,要将对象拉回而施加的弹力。在LayaAir引擎中对应线性反弹力linearBounce

3.3.10 弹簧角运动限制(angularLimitSpring、angularDamp)

在Unity中,弹簧的角运动旋转限制分为X轴旋转限制Angular X Limit Spring以及Y轴和Z轴旋转限制Angular YZ Limit Spring。这些限制都是当对象超过了约束的限制角度时要反向旋转对象而施加的弹簧力矩,只是轴的区别。而且他们都有弹簧力Spring与阻尼Damper两个配置项,

弹簧力Spring

其中的弹簧力Spring 在LayaAir引擎中对应角运动旋转限制的弹簧力angularLimitSpring,如果此处的值设置为零,则无法逾越限制;零以外的值将使限制变得有弹性。

阻尼Damper

其中的阻尼Damper在LayaAir引擎中对应角运动旋转阻尼angularDamp,设置为大于零的值可让约束抑制振荡(否则将不断的进行振荡)。

3.3.11 角运动限制(minAngularLimit、maxAngularLimit、angularBounce)

在Unity中,关于角运动旋转的限制有X轴旋转的下限Low Angular X Limit、X轴旋转的上限Hight Angular X Limit、Y轴旋转的限制Angular Y Limit、Z轴旋转的限制Angular Z Limit。这些限制项,LayaAir导出插件只支持限制Limit与反弹力Boundciness设置。

限制Limit

其中的Limit是限制旋转角度,设置对象旋转角度的下限值。在LayaAir引擎中需要分别设置旋转角度限制的最小值minAngularLimit和旋转角度限制的最大值maxAngularLimit。这两个值都是3D向量值。

旋转限制最小值的X对应X轴旋转的下限Low Angular X Limit值,Y对应Y轴旋转的限制Angular Y Limit值取负,Z对应Z轴旋转的限制Angular Z Limit值取负。

旋转限制最大值的X对应X轴旋转的上限Hight Angular X Limit值,Y对应Y轴旋转的限制Angular Y Limit值,Z对应Z轴旋转的限制Angular Z Limit值。

反弹力Boundciness

其中的反弹力 Bounciness 是当对象的旋转达到限制角度时在对象上施加的反弹力矩。在LayaAir引擎中对应角度反弹力矩angularBounce

四、物理射线

4.1 什么是物理射线

射线的定义是只有一个端点无限延长形成的直的线。LayaAir引擎的数学对象Laya.Ray()就是只有起点和方向的射线。

在LayaAir引擎中,射线常用于基础的碰撞检测,所以具有射线的发射特性,用于碰撞检测功能的射线称为物理射线。

需要注意的是,射线可以用于物理射线检测,但是物理射线并不等同于射线。

4.2 创建射线

LayaAir引擎提供了创建3D空间射线的类Laya.Ray(),以及通过摄像机从屏幕空间点去生成这个射线的方法viewportPointToRay()

示例代码如下所示:

/*
……省略若干代码
*/
//创建一个屏幕点
let point =newLaya.Vector2();
//创建一个射线 Laya.Ray(射线的起点,射线的方向)
let ray =newLaya.Ray(newLaya.Vector3(0,0,0),newLaya.Vector3(0,0,0));
//以鼠标点击的点作为原点
point.x =Laya.stage.mouseX;
point.y =Laya.stage.mouseY;
//计算一个从屏幕空间生成的射线
_camera.viewportPointToRay(point, ray);
/*
……省略若干代码
*/

4.3 使用物理射线

在LayaAir 3D中实现射线检测是使用物理模拟器类PhysicsSimulation

射线检测的方法有4个,分别为射线检测第一个碰撞物体的方法raycast 和 raycastFromTo以及射线检测所有碰撞物体的方法raycastAllraycastAllFromTo

检测一个和所有的区别比较容易理解,就是碰到第一个物体后射线立即结束,和射线可穿透所有碰撞物体一直不结束,这两种区别。如图14所示。

(图14)

那为什么同样的功能名称还有带FromTo和不带FromTo两种,又有什么区别呢?

与数学对象的射线所不同的是,用于检测碰撞的物理射线是有长度的,或者是需要设置世界空间的结束位置。

带FromTo的是使用两个点(射线的起始位置点和结束位置点)作为参数。

而不带FromTo的则是直接使用已经创建好的射线,不需要设置射线的结束位置点,但需要设置长度,如果我们不设置长度,则采用默认值长度2147483647

如果是不带FromTo的射线检测,我们可以沿用上个小节创建射线的示例,稍加补充一下,具体代码如下所示:

/*
……省略若干代码
*/
//创建一个屏幕点
let point =new Laya.Vector2();
//创建一个射线 Laya.Ray(射线的起点,射线的方向)
let ray =new Laya.Ray(new Laya.Vector3(0,0,0),new Laya.Vector3(0,0,0));
//以鼠标点击的点作为原点
point.x =Laya.stage.mouseX;
point.y =Laya.stage.mouseY;
//计算一个从屏幕空间生成的射线
_camera.viewportPointToRay(point, ray);
//拿到3D场景中射线碰撞的物体
_scene3D.physicsSimulation.rayCastAll(ray,this.outs);
//如果射线碰撞到物体
if(this.outs.length !==0){
for(let i =0; i <this.outs.length; i++){
//在射线击中的位置添加一个立方体
this.addBoxXYZ(this.outs[i].point.x,this.outs[i].point.y,this.outs[i].point.z );
}
}
/*
……省略若干代码
*/

带FromTo的射线检测使用示例,具体代码如下所示:

/*
……省略若干代码
*/
/*进行射线检测,检测所有碰撞的物体
//_scene3D.physicsSimulation.raycastAllFromTo(this.from, this.to, this.outs);
//检测所有物体的射线使用与上个示例类似
*/
//进行射线检测,检测第一个碰撞物体
_scene3D.physicsSimulation.raycastFromTo(this.from,this.to,this.out);
//将射线碰撞到的物体设置为红色
((this.out.collider.owner asLaya.MeshSprite3D).meshRenderer.sharedMaterial as Laya.BlinnPhongMaterial).albedoColor =new Laya.Vector4(1.0,0.0,0.0,1.0);
/*
……省略若干代码
*/

4.4 使用异形物理射线

常规的物理射线是用一条射线来检测碰撞,LayaAir引擎中也提供了与物理射线检测类似的功能,但采用的是自定义碰撞器形状检测来代替物理射线,相当于异形的射线检测功能。

与普通的射线检测一样,异形射线也是有检测第一个和检测所有两个检测方法,分别是shapeCastshapeCastAll

(图15)

图15的示例,就采用球形射线来实现碰撞检测,具体代码如下所示:

//创建球型碰撞器
var sphereCollider:Laya.SphereColliderShape=new Laya.SphereColliderShape(0.5);
//通过按钮this.castAll状态切换是采用检测全部还是检测第一个
if(this.castAll){
//采用球形碰撞器进行形状检测,检测所有碰撞的物体
this.scene.physicsSimulation.shapeCastAll(sphereCollider,this.from,this.to,this.outs);
for(let i =0; i <this.outs.length; i++){
((this.outs[i].collider.owner as Laya.MeshSprite3D).meshRenderer.sharedMaterial asLaya.BlinnPhongMaterial).albedoColor =new Laya.Vector4(1.0,0.0,0.0,1.0);
}else{
//采用球形碰撞器进行形状检测,检测第一个碰撞物体
if(this.scene.physicsSimulation.shapeCast(sphereCollider,this.from,this.to,this.out))
((this.out.collider.owner as Laya.MeshSprite3D).meshRenderer.sharedMaterial as Laya.BlinnPhongMaterial).albedoColor =new Laya.Vector4(1.0,0.0,0.0,1.0);
}

4.5 设置射线碰撞组

无论是普通射线还是异形射线,都可以设置碰撞组,以及指定射线可碰撞的组。

设置碰撞组值collisonGroup和指定可发生碰撞的组值canCollideWith在前文中已经介绍过,

我们将值带入射线检测对应的方法参数即可实现射线的选择性碰撞。

五、Cannon.js物理引擎的使用

之前的章节一直在介绍LayaAir基于Bullet物理引擎封装的物理引擎API。Bullet虽然强大,但是有些开发者对于物理精度要求不高,物理功能的使用也比较基础,只对物理引擎库的体积有要求(Cannon物理引擎库不足200k)。那或许Cannon.js可以考虑。

5.1 如何切换使用Cannon.js物理引擎库

如果想使用Cannon.js物理引擎库,要引入物理引擎库cannon.js以及LayaAir引擎封装的物理API库laya.cannonPhysics.js

采用LayaAirIDE创建项目的开发者,可以直接在IDE中通过F9打开项目设置的类库设置,如图16进行勾选即可。


(图16)

如果不打算使用Bullet物理引擎,Physics3D相关的物理库不需要勾选。

引用了cannon.jslaya.cannonPhysics.js引擎库后,就可以直接使用Cannon.js物理引擎的API了。

在LayaAir封装的物理API的设计上,基本上与Bullet引擎保持了一致,只是在命名前增加了Cannon标识,例如3D刚体Rigidbody3D在Cannon物理引擎的使用时变为了CannonRigidbody3D

毕竟Cannon.js物理引擎与Bullet物理引擎本身存在差异,以及对于Cannon.js的基础物理功能使用的定位,Bullet中有很多API,在Cannon.js中是没有的。关于这些,开发者可以通过下一小节进行详细了解。

5.2 Cannon.js物理引擎中可以使用的API

Cannon.js物理引擎与Butllet的使用方式基本相同,只是类名称会有所不同,本小节列出常用的API供开发者参考。

5.2.1 碰撞器

(点击放大查看高清图)

5.2.2 常用的刚体物理属性

(点击放大查看高清图)

5.2.3 碰撞器形状

5.2.4 常用的碰撞器属性

(点击放大查看高清图)

5.2.5 射线检测

射线检测基于Cannon物理模拟器类CannonPhysicsSimulation

(点击放大查看高清图)

5.2.6 碰撞生命周期

LayaAir引擎的3D物理碰撞生命周期,适用于Cannon.js引擎与Bullet引擎,参考前文的碰撞生命周期方法即可。

END

引擎案例分享:

  • 聊聊电商圈成功的游戏跨界案例

  • 3D研发经验分享:50多款3D小游戏的炫稷游戏创始人程银斌分享3D研发经验!

  • 3D技术分享:有着30多款3D小游戏产品的长沙嗨鹿互动科技资深研发工程师分享3D游戏研发经验

  • 132款3D跑酷极限运动主题的微信小游戏分享

  • LayaAir引擎78款3D射击主题微信小游戏分享,看看玩过几款!

推荐阅读:

  • 显存优化:纹理压缩功能介绍与使用说明

  • LayaAir引擎的未来规划 #BIGC#

  • 3D场景编辑导出-LayaAir引擎Unity插件使用详解

  • 有效解决3D游戏边缘锯齿现象及全面理解LayaAir引擎游戏屏幕适配!

  • 如何使用及参与维护Github的LayaAir引擎源码

  • VSCode高效开发工作流配置指南

  • 科普:零基础了解3D游戏开发

  • 应对苹果iOS新规,Layabox再次成功过审HTML5的APP包,同时推出iOS过审协助服务

  • Layabox推出低价位共享技术服务活动!

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 【JavaScript】(6)Object、String、Array、Date对象的方法、属性(constructor、prototype)

    Object对象&#xff1a; 1、【Object对象】—-提供JavaScript对象通用的功能 1.1、使用格式&#xff1a;var objnew Object( [value] );alue为基本数据类型[ Number, Boolean ,String] 1.2、prototype 属性 | constructor 属性代码演示&#xff1a; <!DOCTYPE html PUBLIC…...

    2024/4/20 18:46:01
  2. 双眼皮21天可以画眼线吗

    ...

    2024/4/20 18:45:59
  3. web前端开发入门学习线路图详解-2019升级版

    现如今&#xff0c;Web前端工程师已经成为各大互联网公司不可或缺的热门职位&#xff0c;从业者队伍日渐庞大&#xff0c;这其中不乏零基础学习者和转行人士。为了方便大家系统而全面的掌握前端基础知识&#xff0c;千锋小编特意整理了web前端开发入门学习线路图和前端学习详细…...

    2024/4/19 21:01:49
  4. html中的描点怎么写,html 锚点的使用

    html 锚点 到底是干吗的&#xff1f;通俗简单地说&#xff0c;比如一篇很长的文章&#xff0c;你想按分段精确来看&#xff0c;那就可以用到锚点了。代码&#xff1a;跳到001...文字省略...文字省略其实锚点只需name就可以可&#xff0c;加id是为了让它兼容性更好.href的值要跟…...

    2024/5/2 7:30:20
  5. 刘纲做的双眼皮图片

    ...

    2024/5/2 11:31:08
  6. 2020 年「我与技术面试那些事儿」

    前言 2020年&#xff0c;是个不平凡的一年&#xff0c;因为疫情的蔓延打乱了我的全盘计划。但在工作中&#xff0c;完成了目标项目、攻克了技术难关、学习了新的技术&#xff0c;也感谢平台&#xff01; 首先上来就是给一个思维导图分享&#xff1a; 思维导图 微信Web开发者…...

    2024/4/27 23:17:32
  7. AngularDart4.0 英雄之旅-教程-07路由

    2019独角兽企业重金招聘Python工程师标准>>> Tour of Heroes应用程序有新的要求&#xff1a; 添加一个Dashboard视图。添加在Heroes和Dashboard视图之间导航的功能。当用户在任一视图中点击英雄名称时&#xff0c;导航至所选英雄的详细视图。当用户点击电子邮件中的…...

    2024/4/21 7:40:32
  8. 做完双眼皮两眼无神怎么回事

    ...

    2024/4/21 7:40:31
  9. html页面加载完跳转到锚点,angularjs – 在页面加载后滚动到锚点

    我需要设置一个ng-click事件,以便它加载一个新页面,然后,一旦页面加载,滚动到页面上的一个锚点.我已经尝试了在this SO post提出的每个解决方案,但我无法使其正常工作.大多数解决方案围绕滚动到已经加载的页面上的锚点.在加载新页面之后,我需要滚动.这是我的视图代码&#xff1…...

    2024/4/21 7:40:30
  10. 第七章 路由

    1. 为什么需要路由 需要直接到达某个页面 在Angular中&#xff0c;HTML5路由是默认的模式 2. Angular 路由的组成部件 Routes&#xff1a;描述了应用程序支持的路由配置。RouterLink指令&#xff1a;用于创建各种路由链接。RouterOutlet&#xff1a;这是一个“占位符”组件…...

    2024/4/21 7:40:29
  11. router锚点和html锚点,关于角度:如何在锚点上有条件地使用[href]或[routerLink]?...

    我需要将相同的锚定链接有条件地指向本地或外部资源。 我试过了test但这是行不通的。 我没有任何错误&#xff0c;但是它指向同一个本地页面&#xff0c;并且忽略了外部URL。 有任何想法吗&#xff1f;另一个选择是构造链接&#xff0c;但是我找不到任何文档来访问服务内部的ro…...

    2024/4/21 7:40:28
  12. 跨平台开发框架Ionic学习之路------4(使用angularjs实现滚动条定位)

    在帮QQ群里面一个群友解决一个滚动条定位的过程中,碰到了一些问题并且解决了,写篇博客以备自己忘记了。解决滚动条定位有两种方式(目前我掌握的) 1、采用描标记的形式滚动到指定的区域。 需要跟html标签加上id属性。例如 <div class"row item-divider" id"…...

    2024/4/21 7:40:28
  13. 手术时间最短的男明星的埋线双眼皮 忌口

    ...

    2024/4/21 7:40:27
  14. angularjs 锚点操作服务 $anchorScroll

    在普通的html网页中&#xff0c;我们可以通过在url后边添加 #elementid 的方式&#xff0c;将页面显示定位到某个元素&#xff0c;也就是锚点。 但是在angularjs应用的网页中&#xff0c;页面路由的写法是 #route/route 锚点的写法会被当做一个页面路由解析过去&#xff0c;…...

    2024/4/21 7:40:26
  15. 双眼皮 提肌手术恢复时间

    ...

    2024/4/24 8:17:43
  16. 刚做完双眼皮手木伤口有一点感染怎么办

    ...

    2024/4/21 7:40:24
  17. angular前端基本页面验证

    验证值必须要在【0.01-100】之间&#xff0c;而且最多是2位小数 <md-input-container flex""><label>费率</label> <input type"number" name"fee" ng-model"config.fee" required"" pattern"^(0…...

    2024/4/21 7:40:22
  18. Angular学习笔记51:响应式表单的异步校验器

    继Angular学习笔记50&#xff1a;响应式表单动态修改表单校验器之后,有时会遇到对于某一个控件&#xff0c;它要有整个系统的唯一性校验&#xff0c;但是又不想通过在用户填写完表单以后&#xff0c;再告知用户&#xff0c;填写的某一个控件内容重复&#xff0c;需要重新填写&a…...

    2024/4/21 7:40:22
  19. Angular 6 自定义校验器校验身份证

    /*** 自定义身份校验器* */ import { FormControl} from angular/forms; export function identityNoValidator(input: FormControl) {const value input.value;if (checkCode(value)) {console.log(checkCode);let date value.substring(6, 14);if (checkDate(date)) {conso…...

    2024/4/21 7:40:21
  20. angular自定义验证器

    https://www.jianshu.com/p/6221e4eee4a5...

    2024/4/21 7:40:19

最新文章

  1. nginx负载均衡配置

    1.nginx负载均衡配置 upstream lbs {server 192.168.1.12:8080;server 192.168.1.12:8081; }server {listen 80;server_name localhost a.com;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}locatio…...

    2024/5/2 20:07:23
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. javaWeb网上零食销售系统

    1 绪 论 目前&#xff0c;我国的网民数量已经达到7.31亿人&#xff0c;随着互联网购物和互联网支付的普及&#xff0c;使得人类的经济活动进入了一个崭新的时代。淘宝&#xff0c;京东等网络消费平台功能的日益完善&#xff0c;使得人们足不出户就可以得到自己想要的东西。如今…...

    2024/5/1 12:59:25
  4. 前端 js 经典:字符编码详解

    前言&#xff1a;计算机只能识别二进制&#xff0c;开发语言中数据类型还有数字&#xff0c;字母&#xff0c;中文&#xff0c;特殊符号等&#xff0c;都需要转化成二进制编码才能让技术机识别。 一. 编码方式 ACSLL、Unicode、utf-8、URL 编码、base64 等。 1. ACSLL 对英语…...

    2024/5/2 2:42:44
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57