2.4 在LINUX C++(www.cppentry.com)中运行第一个程序(3)
编译执行HelloPanda3D-02后,显示如图2.9左侧所示的青葱绿地和竹林。
|
| (点击查看大图)图2.9 通过C++(www.cppentry.com)显示青葱绿地和竹林 |
如果进一步地将window->setup_trackball()前的注释符"//"去除,编译后执行结果如图2.9右侧所示。此时,用鼠标在场景中拖动,可以转换场景的不同视角。不过,这种相机位置控制不是很方便,显得有些迟缓和笨拙,因为我们无法明确相机的方位。相机控制方式与Python一致,如前面表2.2所示。同样,文件目录使用的是正斜杠"/",Panda3D使用的是地理坐标系统,环境文件environment是以egg格式记录保存的三维模型"蛋"。
游戏中的相机控制需要通过编程(www.cppentry.com)来实现。假设现在需要旋转相机,应该编写以下代码(HelloPanda3D-03.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);
-
- //定义任务,未向任务传递客户数据
- 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);
- }