基于SceneForm如何实现子弹射击

  介绍

这篇文章将为大家详细讲解有关基于SceneForm如何实现子弹射击,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

基于SceneForm实现的子弹射击(绘制子弹运行轨迹)

SceneForm框架很强大,不了解SceneForm的时候,觉得要想做三维场景需要会OpenGL,而OpenGL的学习曲线很陡,接触到这个框架之后觉得小白也可以很快上手,甚至可以实现第一人称射击的效果

<强>注:强自己学习SceneForm有一段时间了,不过没有发现模拟重力场的接口,不知道是不是自己漏掉了

模拟射击效果的思路其实很简单

1,加载一个子弹模型
2,规划子弹由近及远的轨迹
3,绘制子弹的运行轨迹

子弹运行轨迹的逻辑代码;代码中涉及的CleanArFragment在之前的《桃色的SceneForm框架在没有飞机情况下的绘制3 d模型》已经给出;另外需要自行提供一个纹理图片,即代码中的R.drawable。纹理。

class  MainActivity :, AppCompatActivity (), {      ,var  arFragment : CleanArFragment ?=,空   ,var  camera :相机?=,空   ,var  size =,点();,//屏幕尺寸,控制子弹发射的初始位置   ,var  bullet : ModelRenderable ?=,空   ,var  scene :场景吗?=,空   ,val  SHOT =, 0 x1101 ,//绘制过程轨迹信号   ,val  SHOT_OVER =, 0 x1102 //清除子弹模型信号      ,var  handler =, object :,处理程序(),{   override 才能;fun  handleMessage (msg :消息)   {才能   ,,if  (msg.what ==,拍摄),{,//绘制移动过程中的轨迹   ,,,var  currentStatus =, msg.obj  as  CurrentStatus   ,,,currentStatus.node.worldPosition =currentStatus.status   ,,},else  if  (msg.what ==, SHOT_OVER),{,//一次射击完成,清除屏幕的子弹   ,,,var  node =, msg.obj  as 节点   ,,,的场景! ! .removeChild(节点)   ,,}   ,,}   ,}      ,override  fun  onCreate (savedInstanceState:包?),{   super.onCreate才能(savedInstanceState)   ,,setContentView (R.layout.activity_main)//,才能获取屏幕尺寸   val 才能;display =windowManager.defaultDisplay   display.getRealSize才能(大小)   时间=arFragment 才能;this.supportFragmentManager.findFragmentById (R.id.arFragment), as  CleanArFragment   arFragment ! !才能.arSceneView.planeRenderer.isEnabled =, false ,//禁止,sceneform 框架的平面绘制   scene 才能=arFragment ! ! .arSceneView.scene   camera 才能=场景! ! .camera      initbullet才能()   shootButton.setOnClickListener才能(听众)   ,}      ,var  listener : View.OnClickListener =, object :, View.OnClickListener {   override 才能;fun  onClick (v:视图?),{   ,才能拍摄()   ,,}   ,}      ,@TargetApi (Build.VERSION_CODES.N)   ,//初始化子弹模型   ,private  fun  initbullet (), {   Texture.builder才能().setSource (this@MainActivity, R.drawable.texture) .build ()   ,,.thenAccept (   ,,,{,texture →   ,,,MaterialFactory.makeOpaqueWithTexture (this@MainActivity,纹理)   ,,,,.thenAccept  {, material →   ,,,,,//,设置子弹模型为球体   ,,,,,bullet =, ShapeFactory.makeSphere (0.1 f, Vector3 (0 f, 0 f, 0 f),,材料),}   ,,,}   ,,,)   ,}      ,private  fun 拍摄(),{//才能从屏幕发出的射线,对应子弹的运行轨迹   var 才能;ray =,照相机! ! .screenPointToRay (size.x /, 2 f, size.y /, 2 f);   var 才能;node =,节点(),//子弹节点   时间=node.renderable 才能;bullet //子弹节点加载子弹模型   场景! !才能.addChild(节点)      线程(才能object :可运行{   ,,override  fun 运行(),{      ,,,//子弹射击过程中的轨迹,子线程处理轨迹事件,主线程改变轨迹位置   ,,,for (小姐:1,拷贝. .,200,),{,//子弹射程,20,m   ,,,,var  stepLen =,我;   ,,,,var  currentPoint =, ray.getPoint (stepLen  0.1 *, f)   ,,,,var  msg =, handler.obtainMessage ()   ,,,,msg.what =,   ,,,,msg.obj =, CurrentStatus(节点,currentPoint)   ,,,,handler.sendMessage(味精)   ,,,}      ,,,//子弹超出距离后,从屏幕清除掉   ,,,var  msg =, handler.obtainMessage ()   ,,,msg.what =SHOT_OVER   ,,,msg.obj =,节点   ,,,handler.sendMessage(味精)   ,,}   })才能.start ()   ,}      ,//子线程和主线程穿点的数据类   ,data  class  CurrentStatus (var  node :节点,var  status :, Vector3)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

基于SceneForm如何实现子弹射击