Clouduo作品集
二次度量误差边坍缩实现的曲面简化——Unity
Demo链接:Clouduooo/Edge-Collapse-Mesh-Simplification: unity实现基于二次度量误差的边坍缩曲面简化 (github.com)

二次度量误差最小的边坍缩算法大致思路:
从优先队列中取出代价最小的边:
从 edgeQueue
中 Dequeue
一条边。
执行边坍缩操作:
将边的两个顶点合并为一个新的顶点。
更新新顶点的误差矩阵。
更新受影响的边和三角形:
合并操作会影响相邻的边和三角形,重新计算这些边的代价。
将受影响的边重新插入优先队列。
移除退化的三角形:
如果三角形的三个顶点中有两个或以上相同,则移除该三角形。
算法难点主要是论文中如何把二次度量误差转换为Q误差系数矩阵,和根据系数矩阵找到最小误差的合并点坐标。
其次就是在unity中如何实现这些数学过程。
边坍缩的理解方法请见Games101几何第三课,闫老师讲得非常生动易懂,但是我也没想到实现起来这么麻烦!
Touch the Star-Remake
复刻的CGJ上玩到的有趣小游戏Demo
游戏玩法介绍:玩家控制的猫猫只能在当前站立的线条上下或者左右行动,但是可以往被点亮的线条上进行跳跃,通过长距离的跳跃和移动产生大光圈点亮黑暗中的线条来开拓新的道路。
难点:
在视觉上使用Bloom后处理。使用模板测试来让猫猫移动产生的光圈限定在闭合的光纤方块内而不显示在背景黑色中。猫猫的跳跃过程的猫条动画使用了LineRenderer画线。跳跃的过程使用了协程进行位移插值。线条的点亮渐变和光圈扩大均使用协程完成。线条采用很小的Tilemap绘制,目的是方便点亮效果的连续性(太大了就很断层)。
点亮的检测本来使用了暴力遍历当前光圈覆盖的坐标再接上点亮的协程实现,但是这种方法及其消耗性能且重复遍历。后面改成了Bresenham画圆算法,因为画圆算法只需要计算1/4的圆周边界坐标就可以得到整个圆边界,且放大过程中只需要记录边界扩张即可。具体方法是在光圈变大的过程中根据t递增的半径radius和光圈生成点的圆心position使用画圆算法快速得到当前时间点的圆的边界x,y坐标,然后在一个单例模式实现的TileManager中点亮该位置对应的Tile,点亮过程使用协程增加透明度。
为了保证效率,光圈采用了对象池管理,闲置的光圈会被取出来产生效果。
游戏下载链接:Clouduooo/Touch-the-Star-Remake-Download (github.com)



OpenGL实现的2D打砖块弹球游戏
C++和OpenGL实现了Bloom泛光效果,碰撞系统,粒子系统,边缘检测顶点动画,画面反色反转,屏幕震动,简单文本渲染,关卡选择和导入
主要难点功能:
1.Bloom泛光效果先使用一种方式计算颜色的亮度,提取亮度超过某一阈值的颜色值输出为一张图像,随后将亮部图使用高斯模糊算法在横向和纵向进行多次平均模糊操作,最后把模糊过的图像和原图进行叠加输出到屏幕buffer中显示
2.碰撞检测使用球和矩形中心连线在矩形长宽上clamp以后找到矩形边上与球最近的点,再计算该点与球心连线的长度和球半径比较来判断是否碰撞。
3.粒子系统使用一个类似对象池的管理系统,对于每个粒子维护粒子的生命周期和速度值,在玩家球的位置按照一定频率从对象池中取出已经闲置的粒子出来赋予其玩家球的大小和速度(速度在玩家速度上减少一个offset以实现拖尾效果),随后逐减粒子生命时间等,并按照生命时间与总生命周期的比值作为球贴图大小的缩放比例,实现越远粒子越小的效果。生命周期到0时alpha值也到0,并且设置为闲置,更新对象池
4.边缘检测就是很简单的边缘检测算子实现,顶点动画使用了关于时间的三角函数实现类似圆圈的效果,反色反转就是片元着色器中把采样坐标用1-uv和1-颜色值实现,屏幕震动就是很短的时间内对顶点进行整体的偏移实现。这些效果都是后处理效果中对屏幕的截图实现的。
5.文本渲染使用了FreeType矢量字体库,通过获取对于分辨率的bit-image经过顶点和片元着色器绘制到屏幕对应位置上
6.资源管理使用单例模式,读入Texture和Shader文本,保存在单例中,使用时传引用调用。



AI大模型扮演NPC的AI实验性游戏——间谍故事会
视频链接:【潜伏在抽象 AI 小说公司《间谍故事会》】 https://www.bilibili.com/video/BV1Fb4y1j72g/?share_source=copy_web&vd_source =5bcfe78e6c32624e336f17cbf2365a45
《间谍故事会》是基于大模型开发的一款融入AI Agent的多人派对游戏,玩家们持不同的任务目标, 共同指导AI创作一个故事。玩家各自在游戏进程中左右故事走向,最终任务与实际情节相符最多的玩家获胜。
我主要负责游戏中各种AI NPC的Prompt编写和对返回json的处理,并且简单实现了一个类似于PPT中每一页UI界面的序列动画管理系统,便于让策划快速地给icon,UI组件添加通用动效,具体动效部分使用了DoTween插件实现。


Qt实现的多线程P2P文件传输应用
将UI和数据传输分为两个线程,使用TCP传输数据,同时实现客户端和服务端的功能
难点:
多线程分离的设计,如何让UI和数据线程分离不出Bug,线程之间什么时候,如何通信
使用信号与槽的机制进行线程间通信,以函数封装要通信的参数
在项目进行的过程中,因为首先分别实现Client和Server,并且并没有分离UI与数据传输,需要从头开始重构代码,一开始就解耦UI和通信数据的逻辑。而且网络编程和多线程编程在debug时也很难定位问题,甚至出现了报错到Windows API上面的情况。大量的时间被消耗在debug上
Demo开源链接:Clouduooo/P2PMultiThread-FileTransfer: P2P多线程文件传输系统 (github.com)


学校社团Hackthon开发的以主题为Future的小游戏
游戏的玩法是平台跳跃闯关,但是需要走两遍。在第一遍走过的路会被自己的影子摧毁,想表达的是自己过去的行为会影响未来的行为。
技术上使用了队列记录SpriteRenderer和Transform等信息来实现第一遍闯关的回放效果。
视觉上使用了Bloom后处理,噪声消融shader效果,在场景搭建上采用了透视投影的相机设置,以达成三层场景的视差效果,让游戏观感更加丰富。



2023CGJ作品——黑白交换
I Wanna Touch You
主题为Touch的双人游戏。黑色精灵只能行走在白色背景中,白色精灵只能行走在黑色背景中。黑白精灵为了拥抱彼此甘愿踏入会使自己泯灭的颜色之中。
采用了黑白颜色互换的设计,让场景的颜色反转,来改变场景,需要不断地在颜色切换中寻找接近彼此的道路…
游戏链接:https://www.gmhub.com/game/2747



2023GGJ作品——Root
Hide Under the Ground
树根向下生长中在土壤方块会触发各种随机发生的事件,经历危险与获得祝福,有些事件会获得增益Buff,获得道具以达成不同的故事结局,有些会带来灾难,通过探索土壤获得的能力增强树根的强度,可以穿越坚硬的岩石块。在探索中还要注意水分和氧气的保存,水分和氧气互斥但都很重要。玩家共有三条生命,可以在最后查看自己的三条树根所走过的道路。
游戏链接:https://www.gmhub.com/game/2054




2D解密小游戏
光结界
简单的Top-Down视角解密小游戏
游戏链接:光结界

