物理
物理引擎
此类封装物理以及射线相关的操作,用于构造物理世界、模拟物理效果、设置交互拾取策略。
适用于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)