跳转至

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;
    }