开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术
AR与VR
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
信息服务
智能园区

物理

物理引擎

此类封装物理以及射线相关的操作,用于构造物理世界、模拟物理效果、设置交互拾取策略。

适用于2.6版本以上的SDK。

ARPhysicsBody

物理碰撞类,设置物理碰撞响应函数

ARPhysicsBody::set_collision_handler(function(name_a, name_b, pos_a, pos_b, point_num) end)

设置物理的碰撞回调函数,允许外部对碰撞发生时设置相应的事件回调,实现一些基于碰撞事件的外部效果。

Parameters

  • ARLuaFunction | callback : 回调函数,lua端传入一个function
  • name_a | string : 一个碰撞体的名字
  • name_b | string : 另一个碰撞体的名字
  • pos_a | ARVec3[] : 对于a的碰撞体位置数组,可能同时有多个碰撞点
  • pos_b | ARVec3[] : 对于b的碰撞体位置数组,可能同时有多个碰撞点
  • point_num | int : 碰撞体的碰撞点数量
sample1:
function collision_callback(name_a, name_b, pos_a, pos_b, point_num)
    for i=0,point_num-1,1 do
        ARLOG(name_a .." "..name_b.." "..pos_a[i]:to_string().." "..pos_b[i]:to_string())
    end
end

node:create_physics_body(1, 0.9, 0.1,"dynamic", "sphere")
local body = node:get_physics_body()
body:set_collision_handler(collision_callback)

sample2:
node:create_physics_body(1, 0.9, 0.1,"dynamic", "sphere")
local body = node:get_physics_body()
body:set_collision_handler(function (name_a, name_b, pos_a, pos_b, point_num)
    for i=0,point_num-1,1 do
        ARLOG(name_a .." "..name_b.." "..pos_a[i]:to_string().." "..pos_b[i]:to_string())
    end
end)

ARPhysicsBody::set_property_vec3("force", ARVec3 force)

void set_property_vec3("force", ARVec3 force) 为dynamic碰撞体施加力

Parameters

  • force | ARVec3 : 力,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local force = ae.ARVec3:new_local(1000, 1000, 1000)
physics_node:set_property_vec3("force", force)

ARPhysicsBody::set_property_vec3("impluse",ARVec3 impluse)

void set_property_vec3("impluse",ARVec3 impluse)

为dynamic碰撞体施加冲量

Parameters

  • impluse | ARVec3 : 冲量,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local impluse = ae.ARVec3:new_local(1000, 1000, 1000)
physics_node:set_property_vec3("impluse",impluse)

ARPhysicsBody::set_property_vec3("torque",ARVec3 torque)

void set_property_vec3("torque", ARVec3 torque)

为dynamic碰撞体施加扭矩

Parameters

  • torque | ARVec3 : 扭矩,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local torque = ae.ARVec3:new_local(0, 1000, 0)
physics_node:set_property_vec3("torque", torque)

ARPhysicsBody::set_property_vec3("torque_impluse",ARVec3 torque_impluse)

void set_property_vec3("torque_impluse",ARVec3 torque_impluse)

为dynamic碰撞体施加扭矩冲量

Parameters

  • torque_impluse | ARVec3 : 扭矩冲量,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local torque_impluse = ae.ARVec3:new_local(0, 1000, 0)
physics_node:set_property_vec3("torque_impluse",torque_impluse)

ARPhysicsBody::set_property_vec3("linear_velocity",ARVec3 lin_vel))

void set_property_vec3("linear_velocity",ARVec3 lin_vel)

为dynamic碰撞体施加线性速度

Parameters

  • lin_vel | ARVec3 : 线性速度,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local linear_velocity = ae.ARVec3:new_local(0, 1000, 0)
physics_node:set_property_vec3("linear_velocity",linear_velocity)

ARPhysicsBody::set_property_vec3("angular_velocity",ARVec3 ang_vel)

void set_property_vec3("angular_velocity",ARVec3 ang_vel)

为dynamic碰撞体施加角速度

Parameters

  • ang_vel | ARVec3 : 角速度,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local angular_velocity = ae.ARVec3:new_local(0, 1000, 0)
physics_node:set_property_vec3("angular_velocity",angular_velocity)

ARPhysicsBody::set_property_vec3("gravity",ARVec3 gravity)

void set_property_vec3("gravity", ARVec3 gravity) 为dynamic碰撞体设置重力

Parameters

  • gravity | ARVec3 : 重力,表示为一个三维向量

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local gravity = ae.ARVec3:new_local(0, 0, 0)
physics_node:set_property_vec3("gravity",gravity)

ARPhysicsBody::set_property_vec3("linear_factor",ARVec3 lin_factor)

void set_property_vec3("linear_factor", ARVec3 lin_factor) 为dynamic碰撞体设置线性阻尼系数

Parameters

  • lin_factor | ARVec3 :线性系数,表示为一个三维向量,每个分量都在0-1之间,越小线速度的变化越不明显,当设置为0时物体不会因为碰撞或施加力而移动

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local linear_factor = ae.ARVec3:new_local(0.0, 0.0, 0.0)
physics_node:set_property_vec3("linear_factor",linear_factor)

ARPhysicsBody::set_property_vec3("angular_factor",ARVec3 ang_factor)

void set_property_vec3("angular_factor",ARVec3 ang_factor) 为dynamic碰撞体设置角度系数

Parameters

  • ang_factor | ARVec3 :角度系数,表示为一个三维向量,每个分量都在0-1之间,越小角速度的变化越不明显,当设置为0时物体不会因为碰撞或施加力而旋转

Returns

  • void
sample:
local physics_node = node:get_physics_body()
local ang_factor = ae.ARVec3:new_local(0.0, 0.0, 0.0)
physics_node:set_property_vec3("angular_factor",ang_factor)

ARPhysicsBody::get_property_vec3(string key)

ARVec3 get_property_vec3(string key)

获取碰撞体属性

Parameters

Returns

  • ARVec3 : 碰撞体属性
key 含义 备注
force 返回力 与设置的相同
torque 返回扭矩 与设置的相同
impluse 返回冲量 与设置的相同
torque_impluse 返回扭矩冲量 与设置的相同
linear_velocity 返回线速度 与设置的可能不同,碰撞体受到碰撞与力的影响,线速度会变化
angular_velocity 返回角速度 与设置的可能不同,碰撞体受到碰撞与扭矩、力影响,角速度会变化
linear_factor 返回线系数 与设置的相同
angular_factor 返回角系数 与设置的相同
gravity 返回重力 与设置的相同
sample:
local physics_body = node:get_physics_body()

local force = physics_body:get_property_vec3("force")
local torque = physics_body:get_property_vec3("torque")
local impluse = physics_body:get_property_vec3("impluse")
local torque_impluse = physics_body:get_property_vec3("torque_impluse")
local linear_velocity = physics_body:get_property_vec3("linear_velocity")
local angular_velocity = physics_body:get_property_vec3("angular_velocity")
local linear_factor = physics_body:get_property_vec3("linear_factor")
local angular_factor = physics_body:get_property_vec3("angular_factor")
local gravity = physics_body:get_property_vec3("gravity")

ARPhysicsBody::get_property_mat44(string key)

ARMat44 get_property_mat44(string key)

获取碰撞体属性

Parameters

Returns

  • ARMat44 : 碰撞体属性
key 含义 备注
world_transform 碰撞体的世界变换矩阵 无法被直接设置,只能被获取
sample:
local physics_node = node:get_physics_body()
local world_mat = physics_node:get_property_mat44("world_transform")

ARPhysicsWorld

物理世界类,用于在世界中加入物理特性。

void set_debug_draw_mode(int mode)

取消一个约束

Parameters

  • mode | int : debugdraw模式:PHYSICS.DBG_NoDebug、PHYSICS.DBG_ALL、PHYSICS.DBG_DrawWireframe、PHYSICS.DBG_DrawAabb、PHYSICS.DBG_DrawConstraints、PHYSICS.DBG_DrawConstraintLimits

Returns

  • void

mode有很多种:一般来说使用以下几种类型即可:

mode 含义
PHYSICS.DBG_NoDebug 关闭DebugMode,不显示任何碰撞体 0
PHYSICS.DBG_ALL 显示所有包围盒,碰撞体线框模型,约束,约束限制 -1
PHYSICS.DBG_DrawWireframe 仅显示碰撞体线框模型 1
PHYSICS.DBG_DrawAabb 仅显示碰撞体包围盒 2
PHYSICS.DBG_DrawConstraints 仅显示约束 2048
PHYSICS.DBG_DrawConstraintLimits 仅显示约束范围 4096
sample:
local physics_world = scene:get_physics_world()

1.physics_world:set_debug_draw_mode(PHYSICS.DBG_NoDebug)
2.physics_world:set_debug_draw_mode(PHYSICS.DBG_ALL)
3.physics_world:set_debug_draw_mode(PHYSICS.DBG_DrawWireframe)
4.physics_world:set_debug_draw_mode(PHYSICS.DBG_DrawAabb)
5.physics_world:set_debug_draw_mode(PHYSICS.DBG_DrawConstraints)
6.physics_world:set_debug_draw_mode(PHYSICS.DBG_DrawConstraintLimits)

推荐使用PHYSICS.DBG_ALL。或者直接传入数字即可。

特别注意:

DebugDraw功能仅用于case物理效果调试使用,正式发布时不要调用set_debug_draw_mode!!!

int add_point_constraint(ARPhysicsBody& body, ARVec3 pos)

如果使用一个点约束,那么在创建约束的那一刻,这个碰撞体就会被约束在某一个点的周围

Parameters

  • ARPhysicsBody | body : 被添加约束的碰撞体
  • ARVec3 | pos : 约束点的位置(相对于碰撞体的位置)

Returns

  • int : 约束的id
sample:
......
local physics_world = scene:get_physics_world() //注意physics_world需要创建,此处省略
local pivot = ae.ARVec3:new_local(100,0,0)
local body = node:get_physics_body()
physics_world:add_point_constraint(body, pivot)

int add_point_constraint(ARPhysicsBody& body_a, ARPhysicsBody& body_b, ARVec3 pivot_a, ARVec3 pivot_b)

给两个目标物体添加一个约束体,将两个目标约束在两个点附近

Parameters

  • ARPhysicsBody | body_a : 被添加约束的碰撞体a
  • ARPhysicsBody | body_b : 被添加约束的碰撞体b
  • ARVec3 | pivot_a : 被添加约束的碰撞体的位置a
  • ARVec3 | pivot_a : 被添加约束的碰撞体的位置b
sample:

local physics_world = scene:get_physics_world() //注意physics_world需要创建,此处省略
local pivot_a = ae.ARVec3:new_local(100,-100,0)
local pivot_b = ae.ARVec3:new_local(-100,100,0)

local body_a = node_a:get_physics_body()
local body_b = node_b:get_physics_body()
physics_world:add_point_constraint(body_a, body_b, pivot_a, pivot_b)

设置点约束有两种类型的接口,第一种只用传入一个碰撞体与一个三维量,这种用于将一个碰撞体约束在一个点的位置。注意:这个点的位置是一个相对坐标量,也就是说传入的三维量是一个坐标,但是它是相对于当前碰撞体位置的位置。 举个例子:如果传入的位置是(0,0,0),那么物体会在约束在自己的位置,而不是约束在坐标原点。如果传入的位置是(0, 100, 0),那么物体会在自己位置上方100的地方被约束,而不是约束在世界坐标系的(0, 100, 0)位置。

第二种传入两个碰撞体与两个三维量。这种可以将两个物体通过点约束链接在一起。注意,pos仍然是相对于各个碰撞体的相对位置。创建约束后,两个约束量会在数帧内合并在一起。这样两个物体就被链接在一起了。

HitResult

此类封装HitResult相关数据与操作,HitResult是射线相交判断的结果类型,包含数量、相交类型、相交的对象。

Public methods
HitResult type
获取HitResult的type属性
HitResult count
获取PickResult的拾取结果数量属性
HitResult get_hit_entity
从HitResult中获取HitEntity对象

HitResultDemo

HitResult HitResultDemo ()

demo示例

sample:
local hit_result = ray_caster:get_hit_result(ray, "first_hit")
for i = 0,1,hit_result.count do
    local node = hit_result:get_hit_entity(i)
end

type

string type

获取HitResult的type属性,"first_hit":返回第一个相交的结果; "all_hit":返回所有相交的结果

sample:
local type = hit_result.type

count

int count

获取PickResult的拾取结果数量属性

sample:
local count = hit_result.count

get_hit_entity

HitEntity get_hit_entity(index)

从HitResult中获取HitEntity对象

Parameters

  • int | index : hitentity序号, 默认参数为0

Returns

  • HitEntity : HitEntity对象
sample:
local hit_entity = hit_result:get_hit_entity(0)
上一篇
交互
下一篇
滤镜