9. 物理属性
物理
给物体赋予物理特性,可以增加动画表现的丰富性和场景的真实性。
用户可通过需要添加物理类型的组件到场景中,可添加的组件类型有角色控制器、碰撞体、刚体、剖切和车辆。
属性列表
一、角色控制器
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
高度 | height | number | | 对应角色的胶囊碰撞体的高度。 |
半径 | radius | number | | 对应角色的胶囊碰撞体的半径。 |
行走速度 | walkSpeed | number | | 对应角色的行走速度。 |
旋转速度 | rotationSpeed | number | | 对应角色的旋转速度。 |
倍率 | speedScale | number | | 行走速度、旋转速度的倍率。 |
步高 | stepHeight | number | | 对应角色的步高的高度。 |
跳高 | maxJumpHeight | number | | 对应角色的跳跃的高度。 |
延迟起跳 | delayedJumpTime | number | | 对应角色的延迟起跳时间。 |
不使用重力 | gravitational | boolean | true、false | 开启后,对应角色将不受重力影响。 |
动画名称 | animationName | string | | 填写对应动画片段的名称,选填。 |
二、碰撞体
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
碰撞体类型 | mode | string | M、B、S、C | 可选择碰撞体类型。类型包括网格碰撞体、盒子碰撞体、球形碰撞体、胶囊碰撞体。 M=网格碰撞体, B=盒子碰撞体, S=球形碰撞体, C=胶囊碰撞体。 |
启用 | enabled | boolean | true、false | 选择后启用碰撞体。 |
触发器 | trigger | boolean | true、false | 如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略。 |
中心 | center | Vector3 | {x:2.60,y:3.60,z:4} | 碰撞体在对象局部空间中的位置。 |
尺寸 | size | Vector3 | {x: 8.50, y: 2.50, z: 2.54}; | 碰撞体的尺寸。 |
三、刚体
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
质量 | mass | number | | 刚体的质量。 |
线性阻力 | drag | number | | 移动对象时影响对象的空气阻力大小。 |
角度阻力 | angleDrag | number | | 旋转对象时影响对象的空气阻力大小。 |
使用重力 | gravitational | boolean | true、false | 如果启用此属性,则对象将受重力影响。 |
碰撞检测 | collisionDetection | number | | 用于防止快速移动的对象穿过其他对象。 |
约束 | constraints | number | | 对刚体运动的限制。 |
抓取 | grab | boolean | true、false | 控制是否允许抓取。 |
四、剖切
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
启用 | enabled | boolean | true、false | 选择后启用剖切。 |
五、车辆
属性 | 属性名 | 类型 | 默认值/可选值 | 说明 |
启用 | enabled | boolean | true、false | 选择后启用车辆 |
线性阻力 | drag | number | | |
角度阻力 | angleDrag | number | | |
使用重力 | gravitational | boolean | true、false | |
碰撞检测 | collisionDetection | number | | |
约束 | constraints | number | | |
抓取 | grab | boolean | true、false | |
牵引力 | maxEngineForce | number | | 对车辆的牵引力。 |
刹车阻力 | maxBreakingForce | number | | 车辆的刹车阻力。 |
质量 | mass | number | | 车辆的质量。 |
摩擦力 | wheelFriction | number | | 车辆对地面的摩擦力。 |
车身节点 | chassis | string | | 需填写对应车身节点。 |
左前轮节点 | leftFront | string | | 需填写对应左前轮节点。 |
右前轮节点 | rightFront | string | | 需填写对应右前轮节点。 |
左后轮节点 | leftBack | string | | 需填写对应左后轮节点。 |
右后轮节点 | rightBack | string | | 需填写对应左后轮节点。 |
悬挂长度 | suspensionRestLength | number | | 轮胎与车身之间的悬挂距离。 |
转向幅度 | SteeringClamp | number | | 转向时转向的角度。 |
转向速度 | SteeringIncrement | number | | 根据按下转向键的时间来算转向的程度,单位为 °/s。 |
示例代码
// 是否启用|enabled
rigidBody.enabled = true;
// 修改线性阻力|drag
rigidBody.drag = 32;
// 修改角度阻力|angleDrag
rigidBody.angleDrag = 28;
// 是否使用重力|gravitational
rigidBody.gravitational = false;
// 修改碰撞检测|collisionDetection
rigidBody.collisionDetection = 22;
// 修改约束|constraints
rigidBody.constraints = 35;
// 是否抓取|grab
rigidBody.grab = true;
// 修改质量|mass
rigidBody.mass = 1;
示例案例
// 1-刚体
rigidBody_Demo() {
// 获取name为Box的三维物体—立方体
let rigidBody_Actor = gVrpManager.Scene().FindActor("Box");
// 添加刚体组件
rigidBody_Actor.AddComponent("Rigidbody");
// 获取刚体组件
let rigidBody = rigidBody_Actor.GetComponent("Rigidbody");
// 是否启用|enabled
rigidBody.enabled = true;
// 修改线性阻力|drag
rigidBody.drag = 32;
// 修改角度阻力|angleDrag
rigidBody.angleDrag = 28;
// 是否使用重力|gravitational
rigidBody.gravitational = false;
// 修改碰撞检测|collisionDetection
rigidBody.collisionDetection = 22;
// 修改约束|constraints
rigidBody.constraints = 35;
// 是否抓取|grab
rigidBody.grab = true;
// 修改质量|mass
rigidBody.mass = 1;
}
// 2-碰撞体
collider_Demo() {
// 需要一个平面和球/立方体/圆柱体才能看出效果
// 2、为球添加碰撞体和刚体组件
// 获取name为Sphere的三维物体-球
let sphere_Actor = gVrpManager.Scene().FindActor("Sphere");
// 修改球属性的位置/旋转/缩放
sphere_Actor.localPosition = { x: 0, y: 4, z: 0 };
sphere_Actor.localEulerAngles = { x: 0, y: 0, z: 0 };
sphere_Actor.localScale = { x: 1, y: 1, z: 1 };
// 获取球的碰撞体组件
let sphereCollider = sphere_Actor.GetComponent("Collider");
// 选择碰撞体类型|mode 类型为M/B/S/C 即 M:网格碰撞体, B:盒子碰撞体, S:球形碰撞体, C:胶囊碰撞体
sphereCollider.mode = "S";
// 是否启用|enabled
sphereCollider.enabled = true;
// 是否触发器|trigger
sphereCollider.trigger = false;
// 修改中心|center
sphereCollider.center = { x: 0, y: 0, z: 0 };
// 修改半径|radius
sphereCollider.radius = 0.5;
// 为球添加刚体组件
sphere_Actor.AddComponent("Rigidbody");
// 获取球的刚体组件
let sphere_Rigidbody = sphere_actor.GetComponent("Rigidbody");
// 是否启用|enabled
sphere_Rigidbody.enabled = true;
// 修改线性阻力|drag
sphere_Rigidbody.drag = 0;
// 修改角度阻力|angleDrag
sphere_Rigidbody.angleDrag = 0;
// 是否抓取|grab
sphere_Rigidbody.grab = true;
// 修改碰撞检测|collisionDetection
sphere_Rigidbody.collisionDetection = 0;
// 修改约束|constraints
sphere_Rigidbody.constraints = 0;
// 修改质量|mass
sphere_Rigidbody.mass = 1;
// 是否使用重力|gravitational
sphere_Rigidbody.gravitational = true;
// 1、为平面添加碰撞体和刚体组件
// 获取name为plane的三维物体-平面
let plane_Actor = gVrpManager.Scene().FindActor("Plane");
// 为平面添加刚体组件
plane_Actor.AddComponent("Rigidbody");
// 获取平面的碰撞体组件
let plane_Collider = plane_Actor.GetComponent("Collider");
// 选择碰撞体类型|mode 类型为M/B/S/C 即 M:网格碰撞体, B:盒子碰撞体, S:球形碰撞体, C:胶囊碰撞体
plane_Collider.mode = "M";
// 是否启用|enabled
plane_Collider.enabled = true;
// 是否触发器|trigger
plane_Collider.trigger = false;
// 修改中心|center
plane_Collider.center = { x: 0, y: 0, z: 4 };
// 是否凸多面体|convex
plane_Collider.convex = false;
// 获取平面的刚体组件
let plane_RigidBody = plane_actor.GetComponent("Rigidbody");
// 是否启用|enabled
plane_RigidBody.enabled = true;
// 修改线性阻力|drag
plane_RigidBody.drag = 0;
// 修改角度阻力|angleDrag
plane_RigidBody.angleDrag = 0;
// 是否使用重力|gravitational
plane_RigidBody.gravitational = false;
// 修改碰撞检测|collisionDetection
plane_RigidBody.collisionDetection = 0;
// 修改约束|constraints
plane_RigidBody.constraints = 0;
// 是否抓取|grab
plane_RigidBody.grab = false;
// 修改质量|mass
plane_RigidBody.mass = 0;
}
// 3-角色控制器
characterController_Demo() {
// 在角色控制器教材案例模型中实现该功能 只要添加一个Empty三维物体就可实现以下效果
// 将子节点“角色”拖入节点“Empty”中
// 获取name为Empty的三维物体-空物体
let characterController_Actor = gVrpManager.Scene().FindActor("Empty");
// 为Empty添加角色控制器组件
characterController_Actor.AddComponent("CharacterControllerComponent");
// 修改Empty属性的位置/旋转/缩放
characterController_Actor.localPosition = { x: 0, y: 0.75, z: 0 };
characterController_Actor.localEulerAngles = { x: 0, y: 0, z: 0 };
characterController_Actor.localScale = { x: 1, y: 1, z: 1 };
// 获取name为角色的人物
let person_Actor = gVrpManager.Scene().FindActor("角色");
// 修改角色属性的位置/旋转/缩放
person_Actor.localPosition = { x: 0, y: -0.75, z: 0 };
person_Actor.localEulerAngles = { x: 0, y: 180, z: 0 };
person_Actor.localScale = { x: 1, y: 1, z: 1 };
// 获取Empty的角色控制器组件
let characterController = characterController_Actor.GetComponent("CharacterControllerComponent");
// 是否启用|enabled
characterController.enabled = true;
// 选择高度|height
characterController.height = 0.7;
// 选择半径|radius
characterController.radius = 0.4;
// 选择行走速度|walkSpeed
characterController.walkSpeed = 1;
// 选择旋转速度|rotationSpeed
characterController.rotationSpeed = 0.015;
// 选择倍率|speedScale
characterController.speedScale = 1;
// 选择步高|stepHeight
characterController.stepHeight = 0.2;
// 选择跳高|maxJumpHeight
characterController.maxJumpHeight = 0.6;
// 是否使用重力|gravitational
characterController.gravitational = true;
// 选择延迟起跳|delayedJumpTime
characterController.delayedJumpTime = 0.8;
// 前进|forwardKey
characterController.forwardKey = "";
// 后退|backOffKey
characterController.backOffKey = "";
// 左转|turnLeftKey
characterController.turnLeftKey = "";
// 右转|turnRightKey
characterController.turnRightKey = "";
// 跳跃|jumpKey
characterController.jumpKey = "";
// 输入待机动画名称|idleAnimation
characterController.idleAnimation = "idle";
// 输入行走动画名称|walkAnimation
characterController.walkAnimation = "Walking";
// 输入左转动画名称|turnLeftAnimation
characterController.turnLeftAnimation = "Walking";
// 输入右转动画名称|turnRightAnimation
characterController.turnRightAnimation = "Walking"
// 输入跳跃动画名称|jumpAnimation
characterController.jumpNameAnimation = "jump";
// 输入倒退动画名称|backWalkAnimation
characterController.walkBackAnimation = "Walking";
// 输入动画Actor名称|animationName 子节点名称为角色
characterController.animationName = "角色";
}
// 4-剖切
sectioning_Demo() {
// 获取name为Sphere的三维物体——球
let sectioning_Actor = gVrpManager.Scene().FindActor("Sphere");
// 获取剖切组件
let sectioning = sectioning_Actor.GetComponent("Sectioning");
// 是否启用|enabled
sectioning.enabled = true;
}
// 5-车辆
vehicle_Demo() {
// 获取name为Box的三维物体—立方体
let vehicle_Actor = gVrpManager.Scene().FindActor("Box");
// 获取车辆组件
let vehicle = vehicle_Actor.GetComponent("Vehicle");
// 是否启用|enabled
vehicle.enabled = true;
// 修改线性阻力|drag
vehicle.drag = 0;
// 修改角度阻力|angleDrag
vehicle.angleDrag = 0;
// 是否使用重力|gravitational
vehicle.gravitational = true;
// 修改碰撞检测|collisionDetection
vehicle.collisionDetection = 0;
// 修改约束|constraints
vehicle.constraints = 0;
// 是否启用抓取|grab
vehicle.grab = false;
// 修改牵引力|maxEngineForce
vehicle.maxEngineForce = 1000;
// 修改刹车阻力|maxBreakingForce
vehicle.maxBreakingForce = 100;
// 修改质量|mass
vehicle.mass = 1;
// 修改摩檫力|wheelFriction
vehicle.wheelFriction = 1000;
// 车身节点|chassis
vehicle.chassis = "";
// 左前轮节点|leftFront
vehicle.leftFront = "";
// 右前轮节点|rightFront
vehicle.rightFront = "";
// 左后轮节点|leftBack
vehicle.leftBack = "";
// 右后轮节点|rightBack
vehicle.rightBack = "";
// 修改悬挂长度|suspensionRestLength
vehicle.suspensionRestLength = 1.5;
// 修改转向幅度|SteeringClamp
vehicle.SteeringClamp = 42;
// 修改转向速度|SteeringIncrement
vehicle.SteeringIncrement = 0.04;
}