物理
所有文档

          AR开放平台

          物理

          物理引擎

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

          适用于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 | 碰撞体的碰撞点数量
          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)
          上一篇
          交互
          下一篇
          滤镜