# csci-522 Game Engine **Repository Path**: wangqiyuejava63/csci-522-game-engine ## Basic Information - **Project Name**: csci-522 Game Engine - **Description**: USC csci-522 Game Engine 参考自:https://github.com/tsuhaowa/CSCI522-Game-Engine-Development - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-17 - **Last Updated**: 2025-04-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 环境安装 ## 参考 https://github.com/sosunnyproject/PrimeEngineMilestone#set-up-pe-workspace ### install cygwin ### Folder PEWorkspace: disable read only ### 修改配置文件 文件位置 `Tools/setenv.sh ` ``` export MAYA_DIR="C:\\Program Files\\Autodesk\\Maya2020" export VSDIR="C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE" ``` 修改后执行 `$ source setenv.sh` ### 执行 premake ``` $ ./premake.sh --platformapi=win32d3d9 vs2022 ``` 如果提示没有`vs2022 action`, 那么就选vs2015 ### 编译错误 一般会遇到编译错误 比如: ![alt text](<编译错误找不到d3dcompiler_46.png>) #### 原因 找不到对应的路径和文件 #### 解决方法如下: 在项目->属性-> 生成事件 -> 生成后事件 修改地址为有 `d3dcompiler_46.dll` 的地址即可 我的位置是这个,如果你找不到 d3dcompiler_46.dll 文件,那么可以从网上下载一个x86的。 ![alt text](<编译错误解决方法.png>) # 作业3:边界体积与剔除 ## 参考: https://github.com/tsuhaowa/CSCI522-Game-Engine-Development/A3 可以说这个链接的代码,真正的 **save my ass** 了 所以我也想把自己的一点收获,分享在这里. ## 概述 本作业旨在通过实现边界体积和视锥体剔除来优化渲染性能。目标是仅渲染处于摄像机视野内的对象,忽略视野外的对象,从而提高效率。 ## 项目原理核心内容 ### 1. 创建边界体积 - **目标**:为静态网格创建轴对齐边界框(AABB)。 - **细节**:AABB在网格的局部空间中定义,但当网格在世界中移动时,它们可以取任何方向。分析网格点数据以生成AABB。 - **提示**:在加载网格时一次性创建边界体积。查看`MeshManager::getAsset()`中的网格加载逻辑。 ### 2. 显示边界体积 - **目标**:渲染边界体积以便可视化。 - **细节**:实现辅助函数,使用调试渲染器渲染边界框。确保这些框在调试模式下可见。 - **提示**:你可能需要增加渲染器可以处理的线条数量的静态限制。 ### 3. 创建视锥体平面方程 - **目标**:根据摄像机的位置和视野(FOV)生成视锥体平面方程。 - **细节**:实现一个稍微偏移的平面方程,以便于测试。 - **提示**:在`CameraSceneNode::do_CALCULATE_TRANSFORMATIONS`中每帧生成视锥体平面信息。 ### 4. 测试边界体积 - **目标**:使用边界体积测试与摄像机视锥体的交集。 - **细节**:实现逻辑以忽略不与摄像机视锥体相交的网格实例。 - **提示**:修改`SingleHandler_DRAW::do_GATHER_DRAWCALLS()`以包含视锥体剔除逻辑。使用提供的调试代码测试实例剔除。 ### 5. 测试代码 - **目标**:验证性能提升。 - **细节**:生成多个网格(例如100个imrods),并观察帧率。使用边界体积检查后,帧率应更高。 - **提示**:在`ClientCharacterControlGame::initGame()`中启用`spawnALotOfMeshes`以测试性能。 --- # 作业4:物理 ## 概述 本作业涉及为引擎创建一个物理子系统,将游戏玩法和数学概念结合起来。 ## 参考 https://github.com/tsuhaowa/CSCI522-Game-Engine-Development/A4 注意这次需要导入相关的 Assets 导入方法可以参考这个视频:https://www.bilibili.com/video/BV1YRRCY4EUm/ 要用到 pyclient.sh 工具 ## 效果演示 https://www.bilibili.com/video/BV1bv54z5Ejy/ ## 项目原理核心内容 ### 游戏玩法部分 - **目标**:创建一个可以附加到游戏对象的`PhysicsComponent`。 - **细节**:实现一个物理图(一个平面列表或队列),游戏对象可以引用它。类似于游戏对象如何引用场景图中的组件。 - **提示**:使用游戏对象和场景节点的现有结构作为参考。 ### 数学部分 - **目标**:实现物理形状(球体、盒子)和碰撞检测。 - **细节**:通过游戏对象数据初始化`PhysicsComponent`,指定形状类型和尺寸。 - **提示**:先专注于核心功能,然后再进行细化。 ### 多线程 - **目标**:在单独的线程上运行物理模拟。 - **细节**:先在游戏线程中实现物理功能,然后将其移动到单独的线程上。小心处理同步点。 - **提示**:由于线程安全问题,避免在物理中使用Lua。如有必要,使用单独的Lua环境。 ### 测试案例 - **目标**:将物理功能集成到`CharacterControl`演示中。 - **细节**:为静态网格添加物理数据,并在`SoldierNPC`中实现重力和交互测试,例如穿过障碍物和掉落。 - **提示**:从硬编码的物理数据开始,稍后再进行细化。 ## 实现建议 1. **聚焦核心问题**:从最简单的解决方案开始,逐步构建。例如,最初硬编码碰撞体积。 2. **理解领域**:专注于演示的具体需求(例如,慢速移动的球体,静态盒子)。 3. **建议架构**: - **PhysicsManager**:维护物理组件的平面列表。 - **场景节点**:可以引用物理组件。 - **事件**:实现预物理和后物理更新事件。 - **预物理更新**:场景节点向物理组件提供数据。 - **后物理更新**:场景节点从物理组件同步数据。