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):
- #include "pandaFramework.h"
- #include "pandaSystem.h"
-
- #include "genericAsyncTask.h"
- #include "asyncTaskManager.h"
-
- PandaFramework framework;
- //全局任务管理器
- PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();
- //全局时钟
- PT(ClockObject) globalClock = ClockObject::get_global_clock();
- //用于保存相机的实例
- NodePath camera;
-
- //通过全局或静态函数定义任务,返回DoneStatus
- //以任务对象及void*指针作为参数,包含各种用户数据
- //还可以从AsyncTask派生子类并重载do_task方法
- AsyncTask::DoneStatus spinCameraTask(GenericAsyncTask* task, void* data) {
- //计算新位置和方向
- double time = globalClock->get_real_time();
- double angledegrees = time * 6.0;
- double angleradians = angledegrees * (3.14 / 180.0);
- camera.set_pos(20*sin(angleradians),-20.0*cos(angleradians),3);
- camera.set_hpr(angledegrees, 0, 0);
-
- //通知任务管理器下一帧继续本任务
- return AsyncTask::DS_cont;
- }
-
- int main(int argc, char *argv[]) {
- //打开一个新窗口框架并设置窗口标题
- framework.open_framework(argc, argv);
- framework.set_window_title("My Panda3D Window");
- WindowFramework *window = framework.open_window();
- //检查是否载入窗口
- if (window != (WindowFramework *)NULL) {
-
- window->enable_keyboard(); //允许接收键盘事件
- window->setup_trackball(); //允许相机移动
-
- //获取当前相机并保存在指定实例中
- camera = window->get_camera_group();
-
- //载入环境模型
- NodePath environ =
- window->load_model(framework.get_models(), "models/environment");
- //设置环境模型的父实例
- environ.reparent_to(window->get_render());
- //对模型进行比例及位置调整
- environ.set_scale(0.25, 0.25, 0.25);
- environ.set_pos(-8, 42, 0);
-
- //载入熊猫
- NodePath pandaActor =
- window->load_model(framework.get_models(), "panda-model");
- pandaActor.set_scale(0.005);
- pandaActor.reparent_to(window->get_render());
-
- //执行动画
- window->load_model(pandaActor, "panda-walk4");
- window->loop_animations(0);
-
- //定义任务,未向任务传递客户数据
- taskMgr->add(
- new GenericAsyncTask("Spins the camera", &spinCameraTask, (void*) NULL));
-
- //引擎主循环
- framework.main_loop();
- } else {
- nout << "Could not load the window!\n";
- }
- //关闭引擎框架
- framework.close_all_windows();
- framework.close_framework();
- return (0);
- }