设为首页 加入收藏

TOP

2.4 在LINUX C++中运行第一个程序(4)
2013-10-07 16:05:44 来源: 作者: 【 】 浏览:69
Tags:2.4 LINUX 运行 一个 程序

2.4  在LINUX C++(www.cppentry.com)中运行第一个程序(4)

其中,taskMgr->add()通过名称、函数指针及用户自定义参数指定了相机控制函数,当返回值为AsyncTask::DS_cont时,后续处理每帧场景时加以调用。在上述相机控制函数中,系统根据已经流逝的时间计算相机距离原点的角度和半径,然后通过调用set_pos()设置相机位置、set_hpr()设置相机方向,每秒旋转6度。spinCameraTask是定义相机控制函数的典型格式,也可以通过从AsyncTask派生子类并重载do_task方法完成相同任务。随后,用GenericAsyncTask类封装相机控制函数即可。Linux下有关运行动画视频与配书光盘的Ch2目录Python子目录中的HelloPanda3D-03.mp4类似,不再额外提供。

Panda3D角色一般是动态的,输入参数是角色模型、一系列动画文件名称。假设需要在场景中引入熊猫,应该编写以下代码(HelloPanda3D-04.cxx):

  1. #include "pandaFramework.h"  
  2. #include "pandaSystem.h"  
  3.  
  4. #include "genericAsyncTask.h"  
  5. #include "asyncTaskManager.h"  
  6.  
  7. PandaFramework framework;  
  8. //全局任务管理器  
  9. PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();   
  10. //全局时钟  
  11. PT(ClockObject) globalClock = ClockObject::get_global_clock();  
  12. //用于保存相机的实例  
  13. NodePath camera;  
  14.  
  15. //通过全局或静态函数定义任务,返回DoneStatus  
  16. //以任务对象及void*指针作为参数,包含各种用户数据  
  17. //还可以从AsyncTask派生子类并重载do_task方法  
  18. AsyncTask::DoneStatus spinCameraTask(GenericAsyncTask* task, void* data) {  
  19. //计算新位置和方向  
  20. double time = globalClock->get_real_time();  
  21. double angledegrees = time * 6.0;  
  22. double angleradians = angledegrees * (3.14 / 180.0);  
  23. camera.set_pos(20*sin(angleradians),-20.0*cos(angleradians),3);  
  24. camera.set_hpr(angledegrees, 0, 0);  
  25.  
  26. //通知任务管理器下一帧继续本任务  
  27. return AsyncTask::DS_cont;  
  28. }  
  29.  
  30. int main(int argc, char *argv[]) {  
  31. //打开一个新窗口框架并设置窗口标题  
  32. framework.open_framework(argc, argv);  
  33. framework.set_window_title("My Panda3D Window");  
  34. WindowFramework *window = framework.open_window();  
  35. //检查是否载入窗口  
  36. if (window != (WindowFramework *)NULL) {  
  37.  
  38. window->enable_keyboard(); //允许接收键盘事件  
  39. window->setup_trackball(); //允许相机移动  
  40.  
  41. //获取当前相机并保存在指定实例中  
  42. camera = window->get_camera_group();  
  43.  
  44. //载入环境模型  
  45. NodePath environ =   
  46. window->load_model(framework.get_models(), "models/environment");  
  47. //设置环境模型的父实例  
  48. environ.reparent_to(window->get_render());  
  49. //对模型进行比例及位置调整  
  50. environ.set_scale(0.25, 0.25, 0.25);  
  51. environ.set_pos(-8, 42, 0);  
  52.  
  53. //载入熊猫  
  54. NodePath pandaActor =   
  55. window->load_model(framework.get_models(), "panda-model");  
  56. pandaActor.set_scale(0.005);  
  57. pandaActor.reparent_to(window->get_render());  
  58.  
  59. //执行动画  
  60. window->load_model(pandaActor, "panda-walk4");  
  61. window->loop_animations(0);  
  62.  
  63. //定义任务,未向任务传递客户数据  
  64. taskMgr->add(  
  65. new GenericAsyncTask("Spins the camera", &spinCameraTask, (void*) NULL));  
  66.  
  67. //引擎主循环  
  68. framework.main_loop();  
  69. } else {  
  70. nout << "Could not load the window!\n";  
  71. }  
  72. //关闭引擎框架  
  73. framework.close_all_windows();  
  74. framework.close_framework();  
  75. return (0);  
  76. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.4 在LINUX C++中运行第一个程序.. 下一篇2.4 在LINUX C++中运行第一个程序..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 C 语言或者限制使 (2025-12-25 08:50:05)
·C++构造shared_ptr为 (2025-12-25 08:50:01)
·既然引用计数在做 GC (2025-12-25 08:49:59)
·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)