游戏人生
首页
(current)
GameDevTools
登陆
|
注册
个人中心
注销
游戏引擎 浅入浅出
Introduction
Introduction
前言
前言
1. 游戏引擎框架介绍
1. 游戏引擎框架介绍
1.1 Unity的组成
1.2 游戏引擎组成
2. Opengl开发环境搭建
2. Opengl开发环境搭建
2.1 Opengl到底是什么
2.2 搭建Opengl开发环境
2.3 使用VisualStudio开发
3. 绘制多边形
3. 绘制多边形
3.1 画个三角形
3.2 画个正方形
3.3 画个立方体
4. 着色器
4. 着色器
4.1 Unity Shader和OpenGL Shader
4.2 顶点着色器
4.3 片段着色器
5. 绘制贴图
5. 绘制贴图
5.1 颜色和贴图
5.2 贴图文件介绍
5.3 CPU与GPU的通信方式
5.4 使用stb_image解析图片
5.5 绘制带贴图的立方体盒子
5.6 压缩纹理
5.7 图片压缩工具
5.8 使用压缩纹理
5.9 DXT压缩纹理扩展
6. 索引与缓冲区对象
6. 索引与缓冲区对象
6.1 顶点索引
6.2 缓冲区对象
6.3 OpenGL Core Profile
6.4 顶点数组对象
7. 绘制Mesh和材质
7. 绘制Mesh和材质
7.1 导出Mesh文件
7.2 使用Mesh文件
7.3 Shader文件创建与使用
7.4 创建材质
7.5 使用材质
7.6 MeshRenderer
8. 绘制静态模型
8. 绘制静态模型
8.1 Blender安装与配置
8.2 Blender制作模型
8.3 Blender Python设置开发环境
8.4 Blender Python创建物体
8.5 Blender Python导出顶点数据
8.6 加载导出的Mesh
9. 基于组件开发
9. 基于组件开发
9.1 基于RTTR实现反射
9.2 实现GameObject-Component
10. 相机
10. 相机
10.1 最简单的相机
10.2 多相机渲染
10.3 相机排序
10.4 CullingMask
11. 控制系统
11. 控制系统
11.1 键盘控制
11.2 鼠标控制
12. 拆分引擎和项目
12. 拆分引擎和项目
13. 绘制文字
13. 绘制文字
13.1 TrueType简介
13.2 绘制单个字符
13.3 绘制多个文字
13.4 彩色字
14. GUI
14. GUI
14.1 正交相机
14.2 UIImage
14.3 UIMask
14.4 UIText
14.5 UIButton
15. 播放音效
15. 播放音效
15.1 播放2D音效
15.2 播放3D音效
15.3 使用FMOD Studio音频引擎
16. Profiler
16. Profiler
16.1 初识easy_profiler
16.2 集成easy_profiler
17. 嵌入Lua
17. 嵌入Lua
17.1 Sol2与C++交互
17.2 更加友好的Lua框架设计
17.3 引擎集成sol2
17.4 调试Lua
18. 骨骼动画
18. 骨骼动画
18.1 Blender制作骨骼动画
18.2 Blender导出骨骼动画
18.3 解析骨骼动画
18.4 矩阵的主序
19. 骨骼蒙皮动画
19. 骨骼蒙皮动画
19.1 骨骼蒙皮动画实现
19.2 骨骼权重
19.3 Blender蒙皮刷权重
19.4 Blender导出蒙皮权重
19.5 加载权重文件
20. 解析FBX文件
20. 解析FBX文件
20.1 导出Mesh
20.2 导出骨骼动画
20.3 导出权重
20.4 渲染骨骼蒙皮动画
21. 多线程渲染
21. 多线程渲染
21.1 GLFW多线程渲染
21.2 基于任务队列的多线程渲染
21.3 完全异步的多线程模型
21.4 引擎支持多线程渲染
22. Physx物理引擎
22. Physx物理引擎
22.1 Physx实例-小球掉落
22.2 物理材质
22.3 碰撞检测
22.4 连续碰撞检测
22.5 场景查询
22.6 引擎集成Physx
23. 经典光照
23. 经典光照
23.1 环境光
23.2 漫反射光照模型
23.3 镜面高光光照模型
23.4 高光贴图
23.5 Shader结构体
23.6 Uniform Buffer Object
23.7 方向光
23.8 点光源
23.9 多光源
24. 引擎编辑器的实现
24. 引擎编辑器的实现
24.1 分析Godot引擎编辑器
24.2 FBO RenderTexture GameTurbo DLSS
24.3 ImGui介绍与使用
24.4 分离引擎核心层和应用层
24.5 使用ImGui实现引擎编辑器
24.6 Hierarchy与Inspector面板
24.7 Geometry Buffer
25. Shadow Mapping
25. Shadow Mapping
25.1 深度图
25.2 简单阴影
88. VSCode扩展开发与定制
88. VSCode扩展开发与定制
88.1 第一个VSCode扩展程序
88.2 从源码编译VSCode
88.3 打包VSCode内置扩展
88.4 打包LuaHelper到Code-OSS
89. Doxygen生成API文档
89. Doxygen生成API文档
90. GPU分析工具
90. GPU分析工具
90.1 RenderDoc分析不显示bug
98. SubstancePainter插件开发
98. SubstancePainter插件开发
98.1 SP插件开发环境
98.2 开发SP功能性插件
98.3 开发SP渲染插件
99. Toolbag插件开发
99. Toolbag插件开发
99.1 插件开发环境
99.2 API介绍
99.3 命令行调用Toolbag
99.4 更多实现
99.5 代码参考
附录1. Wwise音频引擎
附录1. Wwise音频引擎
1.1 Wwise名词概念
1.2 Wwise制作音效导出SoundBank
1.3 集成Wwise
1.4 封装Wwise播放3D音效
1.5 Wwise性能分析器介绍
1.6 猎人开发后记
代码资源下载
点我下载
Github
点赞、收藏、关注
目录
<< 22.4 连续碰撞检测
22.6 引擎集成Physx >>
## 22.5 场景查询 ```text 「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book ``` ```bash CLion项目文件位于 samples\physx\physx_scene_query ``` 场景查询挺陌生的,但是射线(Raycast)大家就都知道,从起点发一条射线出去,返回射线撞到的物体信息,这其实就是在查询场景物体的信息。 场景查询有以下几种: 1. raycasts:射线检测 2. overlaps:重叠检测,确定两个几何对象是否相交。 3. sweeps:横扫检测,沿一条线移动一个几何对象以找到与另一个几何对象的第一个交点。 下面分别来看。 ### 1. 射线检测 射线检测,表示以某个坐标为起点,发出一条直线,检测场景中的物体,是否与该直线相交。 ![](md/cpp-game-engine-book/imgs/physx/scene_query/raycast.png) Physx提供了多个接口用以做射线检测,这里简单介绍检测单个对象的接口。 ```c++ /** \brief 发出射线,返回第一个碰撞点。 \param[in] scene scene \param[in] origin 射线起点 \param[in] unitDir 射线方向 \param[in] distance 射线长度 \param[in] outputFlags 标志哪些属性要被写入到hit里 \param[out] hit 射线碰撞点信息 \return 返回True如果有碰撞 */ static bool raycastSingle( const PxScene& scene, const PxVec3& origin, const PxVec3& unitDir, const PxReal distance, PxSceneQueryFlags outputFlags, PxRaycastHit& hit, const PxSceneQueryFilterData& filterData = PxSceneQueryFilterData(), PxSceneQueryFilterCallback* filterCall = NULL, const PxSceneQueryCache* cache = NULL); ``` ### 2. 重叠检测 重叠检测,表示检测场景中的物体,是否与某个范围重叠。 ![](md/cpp-game-engine-book/imgs/physx/scene_query/overlap.png) Physx也提供了多个接口用以做重叠检测,这里简单介绍检测单个Geometry的接口。 ```c++ /** \brief 指定坐标与范围,检测与其重叠的物体。 \param[in] scene The scene \param[in] geometry 要检查重叠的对象的几何形状(支持的类型有:box, sphere, capsule, convex)。 \param[in] pose 物体位置 \param[out] hit 碰撞点信息 \return 如果发现重叠,则返回 True。 */ static bool overlapAny( const PxScene& scene, const PxGeometry& geometry, const PxTransform& pose, PxOverlapHit& hit, const PxSceneQueryFilterData& filterData = PxSceneQueryFilterData(), PxSceneQueryFilterCallback* filterCall = NULL); ``` ### 3. 横扫检测 横扫检测,表示以一个固定的几何物体,沿着一个方向向前推进,检测是否与场景中的物体相交。 其实就是立体版的射线检测,射线检测是一条直线,而横扫检测是一个立体线。 ![](md/cpp-game-engine-book/imgs/physx/scene_query/sweep.png) Physx也提供了多个接口用以做横扫检测,这里简单介绍检测返回单个碰撞信息的接口。 ```c++ /** \brief 返回沿射线击中的第一个刚体actor。将按照 outputFlags 字段的指定返回阻塞命中的数据。 \param[in] scene The scene \param[in] geometry 要检查重叠的对象的几何形状(支持的类型有:box, sphere, capsule, convex)。 \param[in] pose 物体位置 \param[in] unitDir 射线方向 \param[in] distance 距离,受限制于 PX_MAX_SWEEP_DISTANCE. \param[in] outputFlags 指定返回阻塞命中的数据。 \param[out] hit 碰撞点信息 \return 如果发现碰撞,则返回 True。 */ static bool sweepSingle(const PxScene& scene, const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance, PxSceneQueryFlags outputFlags, PxSweepHit& hit, const PxSceneQueryFilterData& filterData = PxSceneQueryFilterData(), PxSceneQueryFilterCallback* filterCall = NULL, const PxSceneQueryCache* cache = NULL, PxReal inflation=0.0f); ``` ### 4. 实例 实例中测试了上面提到的三种场景查询: 1. 在高度9,以小球,进行横扫检测。 2. 在高度5,以Box,进行重叠检测。 3. 在高度0.5,进行射线检测。 ![](md/cpp-game-engine-book/imgs/physx/scene_query/scene_query.jpg)<a id="antiCollectorAdTxt" href="https://github.com/ThisisGame/cpp-game-engine-book">「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book</a> 代码如下: ```c++ //file:example/main.cpp line:106 //~zh 场景查询 //~en scene query void SceneQuery(int frame){ //~zh 射线检测:从指定位置发出射线,检测小球掉落。 //~en Returns the first rigid actor that is hit along the ray. PxVec3 origin(0,0.5f,10); PxVec3 uintDir(0,0,-1); PxHitFlags hitFlags = PxHitFlag::ePOSITION | PxHitFlag::eNORMAL | PxHitFlag::eUV; PxRaycastHit raycastHit; if(PxSceneQueryExt::raycastSingle(*gScene, origin, uintDir, 20, hitFlags, raycastHit)){ printf("frame %d,raycastHit.position:(%f,%f,%f)\n", frame, raycastHit.position.x, raycastHit.position.y, raycastHit.position.z); } //~zh 重叠检测:检测是否有对象与指定几何对象重叠。 //~en Test returning, for a given geometry, any overlapping object in the scene. PxOverlapHit overlapHit; if(PxSceneQueryExt::overlapAny(*gScene,PxBoxGeometry(0.5f,0.5f,0.5f),PxTransform(PxVec3(0,5.0f,0)),overlapHit)){ printf("frame %d,overlapHit:%s\n",frame,overlapHit.actor->getName()); } //~zh 横扫检测:向前发射一个小球检测碰撞。 //~en sweep:fire a small ball forward to detect collision. PxSweepHit sweepHit; if(PxSceneQueryExt::sweepSingle(*gScene,PxSphereGeometry(0.5f), PxTransform(PxVec3(0,9.0f,10)),uintDir,20,hitFlags,sweepHit)){ printf("frame %d,sweepHit:%s\n",frame,sweepHit.actor->getName()); } } ``` 运行后查看日志: ```bash frame 1,sweepHit:Ball frame 2,sweepHit:Ball frame 3,sweepHit:Ball frame 4,sweepHit:Ball frame 5,sweepHit:Ball frame 6,sweepHit:Ball frame 7,sweepHit:Ball frame 8,sweepHit:Ball frame 9,sweepHit:Ball frame 10,sweepHit:Ball frame 11,sweepHit:Ball frame 12,sweepHit:Ball frame 13,sweepHit:Ball frame 14,sweepHit:Ball frame 15,sweepHit:Ball frame 16,sweepHit:Ball frame 17,sweepHit:Ball frame 18,sweepHit:Ball frame 19,sweepHit:Ball frame 20,sweepHit:Ball frame 21,sweepHit:Ball frame 22,sweepHit:Ball frame 23,sweepHit:Ball frame 24,sweepHit:Ball frame 25,sweepHit:Ball frame 26,sweepHit:Ball frame 27,sweepHit:Ball frame 28,sweepHit:Ball frame 29,sweepHit:Ball frame 30,sweepHit:Ball frame 31,sweepHit:Ball frame 32,sweepHit:Ball frame 33,sweepHit:Ball frame 34,sweepHit:Ball frame 35,sweepHit:Ball frame 36,sweepHit:Ball frame 37,sweepHit:Ball frame 54,overlapHit:Ball frame 55,overlapHit:Ball frame 56,overlapHit:Ball frame 57,overlapHit:Ball frame 58,overlapHit:Ball frame 59,overlapHit:Ball frame 60,overlapHit:Ball frame 61,overlapHit:Ball frame 62,overlapHit:Ball frame 63,overlapHit:Ball frame 64,overlapHit:Ball frame 65,overlapHit:Ball frame 81,raycastHit.position:(0.000000,0.500000,0.217368) frame 82,raycastHit.position:(0.000000,0.500000,0.445586) frame 83,raycastHit.position:(0.000000,0.500000,0.500000) frame 84,raycastHit.position:(0.000000,0.500000,0.446527) frame 85,raycastHit.position:(0.000000,0.500000,0.224890) SnippetHelloWorld done. Process finished with exit code 0 ``` 可以看到: 1. 从 1-37 帧,都被横扫检测到。 2. 从 54-65 帧,被重叠检测到。 3. 从 81-85 帧,被射线检测到。 可以在PVD中查看指定帧坐标来验证是否准确。 ![](md/cpp-game-engine-book/imgs/physx/scene_query/pvd_show_frame_position.jpg) 上图是第37帧的小球,高度8.185,处在横扫检测的范围内。
<< 22.4 连续碰撞检测
22.6 引擎集成Physx >>
12
代码资源下载
点我下载
Github
点赞、收藏、关注
目录
Introduction
Introduction
前言
前言
1. 游戏引擎框架介绍
1. 游戏引擎框架介绍
1.1 Unity的组成
1.2 游戏引擎组成
2. Opengl开发环境搭建
2. Opengl开发环境搭建
2.1 Opengl到底是什么
2.2 搭建Opengl开发环境
2.3 使用VisualStudio开发
3. 绘制多边形
3. 绘制多边形
3.1 画个三角形
3.2 画个正方形
3.3 画个立方体
4. 着色器
4. 着色器
4.1 Unity Shader和OpenGL Shader
4.2 顶点着色器
4.3 片段着色器
5. 绘制贴图
5. 绘制贴图
5.1 颜色和贴图
5.2 贴图文件介绍
5.3 CPU与GPU的通信方式
5.4 使用stb_image解析图片
5.5 绘制带贴图的立方体盒子
5.6 压缩纹理
5.7 图片压缩工具
5.8 使用压缩纹理
5.9 DXT压缩纹理扩展
6. 索引与缓冲区对象
6. 索引与缓冲区对象
6.1 顶点索引
6.2 缓冲区对象
6.3 OpenGL Core Profile
6.4 顶点数组对象
7. 绘制Mesh和材质
7. 绘制Mesh和材质
7.1 导出Mesh文件
7.2 使用Mesh文件
7.3 Shader文件创建与使用
7.4 创建材质
7.5 使用材质
7.6 MeshRenderer
8. 绘制静态模型
8. 绘制静态模型
8.1 Blender安装与配置
8.2 Blender制作模型
8.3 Blender Python设置开发环境
8.4 Blender Python创建物体
8.5 Blender Python导出顶点数据
8.6 加载导出的Mesh
9. 基于组件开发
9. 基于组件开发
9.1 基于RTTR实现反射
9.2 实现GameObject-Component
10. 相机
10. 相机
10.1 最简单的相机
10.2 多相机渲染
10.3 相机排序
10.4 CullingMask
11. 控制系统
11. 控制系统
11.1 键盘控制
11.2 鼠标控制
12. 拆分引擎和项目
12. 拆分引擎和项目
13. 绘制文字
13. 绘制文字
13.1 TrueType简介
13.2 绘制单个字符
13.3 绘制多个文字
13.4 彩色字
14. GUI
14. GUI
14.1 正交相机
14.2 UIImage
14.3 UIMask
14.4 UIText
14.5 UIButton
15. 播放音效
15. 播放音效
15.1 播放2D音效
15.2 播放3D音效
15.3 使用FMOD Studio音频引擎
16. Profiler
16. Profiler
16.1 初识easy_profiler
16.2 集成easy_profiler
17. 嵌入Lua
17. 嵌入Lua
17.1 Sol2与C++交互
17.2 更加友好的Lua框架设计
17.3 引擎集成sol2
17.4 调试Lua
18. 骨骼动画
18. 骨骼动画
18.1 Blender制作骨骼动画
18.2 Blender导出骨骼动画
18.3 解析骨骼动画
18.4 矩阵的主序
19. 骨骼蒙皮动画
19. 骨骼蒙皮动画
19.1 骨骼蒙皮动画实现
19.2 骨骼权重
19.3 Blender蒙皮刷权重
19.4 Blender导出蒙皮权重
19.5 加载权重文件
20. 解析FBX文件
20. 解析FBX文件
20.1 导出Mesh
20.2 导出骨骼动画
20.3 导出权重
20.4 渲染骨骼蒙皮动画
21. 多线程渲染
21. 多线程渲染
21.1 GLFW多线程渲染
21.2 基于任务队列的多线程渲染
21.3 完全异步的多线程模型
21.4 引擎支持多线程渲染
22. Physx物理引擎
22. Physx物理引擎
22.1 Physx实例-小球掉落
22.2 物理材质
22.3 碰撞检测
22.4 连续碰撞检测
22.5 场景查询
22.6 引擎集成Physx
23. 经典光照
23. 经典光照
23.1 环境光
23.2 漫反射光照模型
23.3 镜面高光光照模型
23.4 高光贴图
23.5 Shader结构体
23.6 Uniform Buffer Object
23.7 方向光
23.8 点光源
23.9 多光源
24. 引擎编辑器的实现
24. 引擎编辑器的实现
24.1 分析Godot引擎编辑器
24.2 FBO RenderTexture GameTurbo DLSS
24.3 ImGui介绍与使用
24.4 分离引擎核心层和应用层
24.5 使用ImGui实现引擎编辑器
24.6 Hierarchy与Inspector面板
24.7 Geometry Buffer
25. Shadow Mapping
25. Shadow Mapping
25.1 深度图
25.2 简单阴影
88. VSCode扩展开发与定制
88. VSCode扩展开发与定制
88.1 第一个VSCode扩展程序
88.2 从源码编译VSCode
88.3 打包VSCode内置扩展
88.4 打包LuaHelper到Code-OSS
89. Doxygen生成API文档
89. Doxygen生成API文档
90. GPU分析工具
90. GPU分析工具
90.1 RenderDoc分析不显示bug
98. SubstancePainter插件开发
98. SubstancePainter插件开发
98.1 SP插件开发环境
98.2 开发SP功能性插件
98.3 开发SP渲染插件
99. Toolbag插件开发
99. Toolbag插件开发
99.1 插件开发环境
99.2 API介绍
99.3 命令行调用Toolbag
99.4 更多实现
99.5 代码参考
附录1. Wwise音频引擎
附录1. Wwise音频引擎
1.1 Wwise名词概念
1.2 Wwise制作音效导出SoundBank
1.3 集成Wwise
1.4 封装Wwise播放3D音效
1.5 Wwise性能分析器介绍
1.6 猎人开发后记