资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

物理

物理引擎

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

适用于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)
上一篇
交互
下一篇
滤镜