普通视图
-
Moeif
- Gameplay 01 游戏开发中的平滑移动这篇博客,聊一聊在游戏开发中,控制角色或者其他物体的平滑移动。现实中,一个物体,从静止加速到匀速运动状态,或者从匀速运动状态变为静止状态,都会有一个过程。就像人走路,或者汽车开动。 一个物体在运动状态下,会有一个速度变量,也就是我们期望的速度。而从静止到运动状态的过程,会有一个加速度。 而游戏开发中,要做到一个物体平滑的运动,也就是模拟出这个从静止,通过加速度,达到期望速度的过程。 游戏是按帧运行的,在初始的时候,目标运动速度为0,随着每一帧的流逝,目标速度会不断累加一帧中的加速度,当累加到期望速度时,则会以期望速度来运动。 代码如下,这里是在 Unity 中实现的,但是原理对于所有游戏引擎通用 using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovingSphere : MonoBehaviour { // 用户设定最大期望速度 [SerializeField, Range(0f, 100f)] private float maxSpeed = 10
-
Moeif
- This Week In Moeif 28现在已经 2022 年了,本来想跨年夜去外滩,看了一下新闻,好像也没什么活动,就在家里待着了。这个周又开始运动了,跑步加跳绳,保持健康。这周是单调的一周。这周还把博客使用 Cloudflare 加速了,能明显感觉也访问速度的提升。 项目进度 游戏码农:那些打工的日子 这周完成了外卖和自己做饭界面的UI及逻辑,下周开始添加学习内容的模块。这周的内容比较单调,好像也没做什么特别的事情。软件著作权还没有下来,这次真是好慢。 本周电影 寂静之海 고요의 바다 (2021) 本周书籍 《愿你迷路到我身旁》(阅读中) 下周初步计划 继续逻辑编写
This Week In Moeif 28
-
Moeif
- This Week In Moeif 27又是一周结束了,时间过的好快啊。这周在焦虑和烦躁中度过。上海也开启了冬天模式,很冷,还没有取暖设备,买了一个取暖器,也做不到整屋加热,不过还好距离过年也就剩一个多月了,可以回北方了。好像已经两个周没有出去跑步了…
This Week In Moeif 27
又是一周结束了,时间过的好快啊。这周在焦虑和烦躁中度过。上海也开启了冬天模式,很冷,还没有取暖设备,买了一个取暖器,也做不到整屋加热,不过还好距离过年也就剩一个多月了,可以回北方了。好像已经两个周没有出去跑步了…
This Week In Moeif 26
对于下一个游戏产品,有了一点点的方向,还没有深入去考虑。
-
Moeif
- This Week In Moeif 25这周开始学习画像素画了,还不是很熟练,不过每天会多少画几分钟,使用数位板。以前使用数位板不太习惯,慢慢的对于它的控制会越来越顺手。 另外,这周完成了 Ray Tracing in One Weekend 系列的博客Rust重实现。接下来就要开始第二篇章了。 今天上海下雨了,下个周的温度,可能会冷很多。 项目进度 游戏码农:那些打工的日子 这周主要完成了头像自定义模块,简历完善模块,招聘信息模块,以及添加了能用的提示消息界面。确定了核心玩法界面的基本结构,参考了其他同类型的游戏对于时间上的处理逻辑。基本上确定了由事件来驱动整个游戏的进程,如果没有事件填充,那么时间就会停止,这样避免了很多以前想不到解决方案的问题,只是这样唯一的问题是没法一直挂机,可能过一段时间就需要操作一下。另外确定的小玩法有赛车,地下搏击俱乐部这两个。整理了一下游戏的核心,就是围绕着金钱,健康,快乐的循环。 本周电影 花与罪 (2021) 你 第一季 You Season 1 (2018) 本周书籍 《无后为大》(阅读中) 《重构:改善即有代码的设计》(阅读中) 下周初步计划 游戏码农逻辑编写
This Week In Moeif 25
-
Moeif
- Rust 光线追踪 14: 最终汇总效果这一节没有新的知识,只是将之前知识汇总起来,然后生成一张最终的图,最终生成的图如下 首先,将创建世界及添加物体的代码从 main 函数中删除,然后抽象成一个函数 random_scene,在这个函数中,会随机生成一些球体,并且根据规则,随机使用我们的已有的三个材质。 // src/main.rs fn random_scene() -> HittableList { let mut world = HittableList::new(); let ground_material = Lambertian::new(Color::new(0.5, 0.5, 0.5)); world.add(Box::new(Sphere::new( Vec3::new(0.0, -1000.0, 0.0), 1000.0, ground_material, ))); let mut rng = rand::thread_rng(); // 生成一些小球 for a in -11..11 { for b in -11..11 { let choose_mat: f64 = rng.gen(); le
Rust 光线追踪 14: 最终汇总效果
Rust 光线追踪 13: 散焦模糊
散焦模糊,通俗来讲就是在聚焦区域外的东西,都是模糊的。通常这种效果被称为 Depth Of Field(DOF),也就是景深。最终效果如下
-
Moeif
- Rust 光线追踪 12: 正交相机正交相机所看到的东西大小,与远近无关,只与正交相机的视野(FOV)有关。FOV越大,能看到的世界范围就大,也就是能看到更多的东西,而FOV越小,能看到的世界范围就越小,也就是只能看到较少的东西。 由于FOV越小,看到的范围就越小,从而,相机的上下界,所发出的射线,所能覆盖的范围,就小。也就是相当于所有的射线,都集中在世界中一个小范围,从这个小范围中取得颜色,填充画布(最后渲染的图片),所以看到的东西就大。而如果FOV很大,射线所能覆盖的世界范围就大,用这个大范围来填充画布,自然同一个物体就会看起来小。 可以想象一个两个盒子,一个大的,假设口径是50厘米,扣在一把键盘上,可以扣住整个键盘,相当于摄像机看到了整个键盘。而将一个1厘米口径的盒子,扣在键盘上,可能只能覆盖其中一个键,也就是相机只能看到这一个键范围的东西。但最后都会将扣到的东西填充到画布上,所以,就相当于FOV越小,看到的东西就越大。 添加相机FOV逻辑 在本文中,相机的FOV,我们使用角度来表示,上图中,$\theta$ 就是相机的开口大小,而 $h = \tan(\frac{\theta}{2})$,$2 * h$就是视口的
Rust 光线追踪 12: 正交相机
-
Moeif
- Rust 光线追踪 11: 折射关于折射的实现,可以使用斯涅尔定律。当光波从一种介质传播到另一种介质时,如果两种介质拥有不同的折射率,那么光线就会发生折射现象。例如光线从空气中进入水中,或者从空气中进入玻璃中。 下面涉及到的公式,也可以不用理解推导过程,只要拿来用就行。 斯涅尔定律 斯涅尔定律表明,当光波从介质1传播到介质2时,假若两种介质的折射率不同,则会发生折射现象,其入射光和折射光都处于同一平面,称为“入射平面”,并且与界面法线的夹角满足如下关系: $n_{1}\sin\theta_{1} = n_{2}\sin\theta_{2}$ 其中,$n_{1}$、$n_{3}$ 分别是两种介质的折射率,$\theta_{1}$、$\theta_{2}$ 分别是入射光线、折射光线与界面法线的夹角,分别叫做入射角和折射角。 要求折射光线的方向,就需要解出 $\sin\theta_{2}$ 来。根据上面的公式可知 $\sin\theta_{2} = \frac{n_{1}}{n_{2}} \cdot \sin\theta_{1}$ 我们可以将折射光线的向量,分解为一个垂直向量和一个平行向量。计算出这两个向量,然后相加,即可
Rust 光线追踪 11: 折射
-
Moeif
- This Week In Moeif 24这周跑步了四天,还可以,下周继续。我发现跑步的时候可以捋清一些事情,这周主要跑 2.5 公里,然后走 2.5 公里,整体感觉还是挺舒适的,下个周看看是否可以加大一点跑步里程。 这周输出了4篇博客和公众号,Rust光线追踪系列以及后续的博客,会同步到掘金这个平台上。 这周把产品页面也搭建好了,更新了 moeif.com 这个域名。 项目进度 游戏码农:那些打工的日子 这周开始写游戏逻辑了,已经确定了主要玩法界面的逻辑。这周把之前的Lua代码全删了,想了想,还是全用C#来写了,逻辑上不会有什么功能性的更新,如果加功能,加玩法模块,那就直接大版本更新,用C#的开发和调试效率也会更高一些。 本周电影 最后的决斗 The Last Duel (2021) 本周书籍 《KK三部曲》(阅读中) 《游戏设计艺术》(阅读中) 下周初步计划 游戏码农逻辑编写
This Week In Moeif 24
-
Moeif

- Rust 光线追踪 10: 材质在前面的文章中,我们渲染出来的图片使用的是漫反射的材质。不同的材质,可以简单理解为对于光线的影响不同,这里的影响包括如何吸收,如何散射等。在这一节,我们将加入另一种材质,金属材质。 最终的渲染图如下
Rust 光线追踪 10: 材质
在前面的文章中,我们渲染出来的图片使用的是漫反射的材质。不同的材质,可以简单理解为对于光线的影响不同,这里的影响包括如何吸收,如何散射等。在这一节,我们将加入另一种材质,金属材质。
最终的渲染图如下
编译 Apple Silicon 版本 Aseprite
编译苹果 M1 芯片版本的 Aseprite,步骤如下
-
Moeif
- Rust 光线追踪 09: 理想散射上一节生成的图看起来很暗,有一个问题是因为有些物体反射的光线,会在 t = 0 时再次击中自己,而由于浮点数精度的问题,这些值可能是 0.00000001 或 -0.0000001 之类的任意接近0的浮点数,所以我们 hit 函数的 t_min 参数,需要忽略掉 0 附近的一小部分范围,防止物体发出的光线再次与自己相交。这样也就避免了阴影痤疮(Shadow ance)的产生。 修改 main.rs 中 ray_color 函数中的 word.hit(),改为 if let Some(hit_record) = world.hit(r, 0.001, f64::INFINITY),也就是 t_min 参数传值 0.001。 cargo run --release > diffuse_random_in_sphere.ppm 生成图如下 可以看到,已经比上一节生成的图亮了很多。 我们上一节使用的漫反射光线散射的方法,是在球体内部生成一个随机的点。然后,这样生成的向量,有很大的概率会和法线方向相近,并且及小概率会沿着入射方向反射回去。然而,真正的理想散射(Lambertian 反射)后
Rust 光线追踪 09: 理想散射
-
Moeif
- Rust 光线追踪 08: 漫反射和伽马校正漫反射的通俗理解是,当一个光线打到某一个物体的某一个点上,这条光线一部分会被吸收,一部分会被随机的反射出去,而反射出去的光线,又可能会打到另一个物体面上的一个点,然后又会被吸收,以及随机的反射出去。现实中的光线可能会无限递归下去,但是我们在程序中实现,不可能无限递归,会设置一个反射次数,达到了那个次数,就停止。
Rust 光线追踪 08: 漫反射和伽马校正
漫反射的通俗理解是,当一个光线打到某一个物体的某一个点上,这条光线一部分会被吸收,一部分会被随机的反射出去,而反射出去的光线,又可能会打到另一个物体面上的一个点,然后又会被吸收,以及随机的反射出去。现实中的光线可能会无限递归下去,但是我们在程序中实现,不可能无限递归,会设置一个反射次数,达到了那个次数,就停止。
-
Moeif
- This Week In Moeif 23这个周主要在做夜莺号的记忆这个项目,30号要交付一个版本,到今天为止,所有的逻辑已经搞完了,明天修一下问题基本上就可以了。这个周继续输出了三篇关于Rust及光线追踪的博客以及公众号和知乎,关注和阅读的人也在增加,下个周继续。
This Week In Moeif 23
这个周主要在做夜莺号的记忆这个项目,30号要交付一个版本,到今天为止,所有的逻辑已经搞完了,明天修一下问题基本上就可以了。这个周继续输出了三篇关于Rust及光线追踪的博客以及公众号和知乎,关注和阅读的人也在增加,下个周继续。
-
Moeif
- Rust 光线追踪 07: 抗锯齿和相机抽象将上一节生成的图放大来看,可以看到球体的边缘与存在着很明显的锯齿,这一节我们首先将相机的代码进行抽象,写在一个 Camera 结构体里,然后加入抗锯齿的逻辑。
Rust 光线追踪 07: 抗锯齿和相机抽象
将上一节生成的图放大来看,可以看到球体的边缘与存在着很明显的锯齿,这一节我们首先将相机的代码进行抽象,写在一个 Camera 结构体里,然后加入抗锯齿的逻辑。
-
Moeif
- Rust 光线追踪 06: 代码抽象这一节的内容修改的比较多,我们会把前面的逻辑重新整理一下,将可光线可交互的世界物体,抽象成一个 Hittable Object,然后可以在场景中添加多个物体。也使用了 Rust 的 Trait,Vec 等。最终效果图如下
Rust 光线追踪 06: 代码抽象
这一节的内容修改的比较多,我们会把前面的逻辑重新整理一下,将可光线可交互的世界物体,抽象成一个 Hittable Object,然后可以在场景中添加多个物体。也使用了 Rust 的 Trait,Vec 等。最终效果图如下
-
Moeif
- Rust 光线追踪 05: 简化 hit_sphere 函数这一节比较简单,就是将上一节的 hit_sphere 函数进行一定的简化,直接看代码。代码中简化之前的已经注释,可以直接对比一下,不同的计算方式,最终算出来的值都是一样的。
Rust 光线追踪 05: 简化 hit_sphere 函数
这一节比较简单,就是将上一节的 hit_sphere 函数进行一定的简化,直接看代码。代码中简化之前的已经注释,可以直接对比一下,不同的计算方式,最终算出来的值都是一样的。
-
Moeif
- This Week In Moeif 2211月马上快要结束了,时间过的真快,有一点点的焦虑,但是也还好。这周开始了不断输出博客内容,可能是因为和Rust有关,阅读数量和关注数量增长了很多,后面可以考虑在每一篇文章最后加上游戏的宣传链接。看起来写博客这件事情可以长期写下去,可能前期没什么,后期积累到一定程度,不确定会发生什么。 这周上海的温度还可以,但是今天下雨了,未来两天温度下降的很多。 项目进度 游戏码农:那些打工的日子 这周主要做的事情还是各个模块的数据配置,以及界面元素的考虑,具体的UI还没有仔细考虑。专业技能相关配置、厨艺配置、外卖配置、找工作和面试相关配置、通勤配置、行为配置。 夜莺号的记忆 这个项目这周做了很多事情,工程的搭建,游戏循环的逻辑,具体的关卡的逻辑等。 本周电影 欲望号快车 Crash (1996) 毒液 本周书籍 《KK三部曲》(阅读中) 下周初步计划 继续数据配置工作 夜莺号关卡逻辑 有时间的话考虑游戏码农的UI构建