普通视图

发现新文章,点击刷新页面。
昨天以前Moeif

Gameplay 01 游戏开发中的平滑移动

2022年1月6日 20:11
这篇博客,聊一聊在游戏开发中,控制角色或者其他物体的平滑移动。现实中,一个物体,从静止加速到匀速运动状态,或者从匀速运动状态变为静止状态,都会有一个过程。就像人走路,或者汽车开动。 一个物体在运动状态下,会有一个速度变量,也就是我们期望的速度。而从静止到运动状态的过程,会有一个加速度。 而游戏开发中,要做到一个物体平滑的运动,也就是模拟出这个从静止,通过加速度,达到期望速度的过程。 游戏是按帧运行的,在初始的时候,目标运动速度为0,随着每一帧的流逝,目标速度会不断累加一帧中的加速度,当累加到期望速度时,则会以期望速度来运动。 代码如下,这里是在 Unity 中实现的,但是原理对于所有游戏引擎通用 using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovingSphere : MonoBehaviour { // 用户设定最大期望速度 [SerializeField, Range(0f, 100f)] private float maxSpeed = 10f; // 用户设定最大加速度 [SerializeField, Range(0f, 100f)] private float maxAcceleration = 10f; // 当前的运动速度 private Vector3 velocity; // Update is called once per frame void Update() { // 通过读取用户输入,来确定期望速度向量(向量包含了大小和方向) Vector2 playerInput; playerInput.x = Input.GetAxis("Horizontal"); playerInput.y = Input.GetAxis("Vertical"); Vector3 desiredVelocity = new Vector3(playerInput.x, playerInput.y, 0.

This Week In Moeif 28

2022年1月2日 23:11
现在已经 2022 年了,本来想跨年夜去外滩,看了一下新闻,好像也没什么活动,就在家里待着了。这个周又开始运动了,跑步加跳绳,保持健康。这周是单调的一周。这周还把博客使用 Cloudflare 加速了,能明显感觉也访问速度的提升。 项目进度 游戏码农:那些打工的日子 这周完成了外卖和自己做饭界面的UI及逻辑,下周开始添加学习内容的模块。这周的内容比较单调,好像也没做什么特别的事情。软件著作权还没有下来,这次真是好慢。 本周电影 寂静之海 고요의 바다 (2021) 本周书籍 《愿你迷路到我身旁》(阅读中) 下周初步计划 继续逻辑编写

This Week In Moeif 27

2021年12月26日 23:11

又是一周结束了,时间过的好快啊。这周在焦虑和烦躁中度过。上海也开启了冬天模式,很冷,还没有取暖设备,买了一个取暖器,也做不到整屋加热,不过还好距离过年也就剩一个多月了,可以回北方了。好像已经两个周没有出去跑步了…

Rust 光线追踪 12: 正交相机

2021年12月8日 23:01
正交相机所看到的东西大小,与远近无关,只与正交相机的视野(FOV)有关。FOV越大,能看到的世界范围就大,也就是能看到更多的东西,而FOV越小,能看到的世界范围就越小,也就是只能看到较少的东西。 由于FOV越小,看到的范围就越小,从而,相机的上下界,所发出的射线,所能覆盖的范围,就小。也就是相当于所有的射线,都集中在世界中一个小范围,从这个小范围中取得颜色,填充画布(最后渲染的图片),所以看到的东西就大。而如果FOV很大,射线所能覆盖的世界范围就大,用这个大范围来填充画布,自然同一个物体就会看起来小。 可以想象一个两个盒子,一个大的,假设口径是50厘米,扣在一把键盘上,可以扣住整个键盘,相当于摄像机看到了整个键盘。而将一个1厘米口径的盒子,扣在键盘上,可能只能覆盖其中一个键,也就是相机只能看到这一个键范围的东西。但最后都会将扣到的东西填充到画布上,所以,就相当于FOV越小,看到的东西就越大。 添加相机FOV逻辑 在本文中,相机的FOV,我们使用角度来表示,上图中,$\theta$ 就是相机的开口大小,而 $h = \tan(\frac{\theta}{2})$,$2 * h$就是视口的高度,而视口的宽度,通过自定义的宽高比,来动态计算出来。 下面修改 camera.rs 的代码,添加 fov 和 宽高比。 // src/camera.rs impl Camera { pub fn new(vfov: f64, aspect_ratio: f64) -> Self { let theta = vfov * std::f64::consts::PI / 180.0; let h = (theta / 2.0).tan(); let viewport_height = 2.0 * h; let viewport_width = aspect_ratio * viewport_height; let focal_length = 1.0; let origin = Vec3::zero(); let horizontal = Vec3::new(viewport_width, 0.0, 0.

Rust 光线追踪 11: 折射

2021年12月7日 15:01
关于折射的实现,可以使用斯涅尔定律。当光波从一种介质传播到另一种介质时,如果两种介质拥有不同的折射率,那么光线就会发生折射现象。例如光线从空气中进入水中,或者从空气中进入玻璃中。 下面涉及到的公式,也可以不用理解推导过程,只要拿来用就行。 斯涅尔定律 斯涅尔定律表明,当光波从介质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}$ 我们可以将折射光线的向量,分解为一个垂直向量和一个平行向量。计算出这两个向量,然后相加,即可得到最终的折射向量。 $ 垂直向量 = \frac{n_{1}}{n_{2}}(入射向量 + \cos\theta_{1}*法向量)$ $ 平行向量 = - \sqrt{1 - |垂直向量|^2 * 法向量}$ 由于,两个向量的点乘与其夹角的 cos 值有关,也就是 $ a \cdot b = |a||b|\cos\theta $ ,如果 a 和 b 都是单位向量,那么可得到 $a \cdot b = \cos\theta$ 根据上面的规则,可以使用新的方式来表示垂直向量 $ 垂直向量 = \frac{n_{1}}{n_{2}}(入射向量 + (-入射向量 \cdot 法向量) * 法向量) $ 综上,可以使用代码来实现折射逻辑,在 vec3.rs 中添加一个新的函数 refract

Rust 光线追踪 08: 漫反射和伽马校正

2021年11月30日 13:50

漫反射的通俗理解是,当一个光线打到某一个物体的某一个点上,这条光线一部分会被吸收,一部分会被随机的反射出去,而反射出去的光线,又可能会打到另一个物体面上的一个点,然后又会被吸收,以及随机的反射出去。现实中的光线可能会无限递归下去,但是我们在程序中实现,不可能无限递归,会设置一个反射次数,达到了那个次数,就停止。

This Week In Moeif 22

2021年11月21日 19:55
11月马上快要结束了,时间过的真快,有一点点的焦虑,但是也还好。这周开始了不断输出博客内容,可能是因为和Rust有关,阅读数量和关注数量增长了很多,后面可以考虑在每一篇文章最后加上游戏的宣传链接。看起来写博客这件事情可以长期写下去,可能前期没什么,后期积累到一定程度,不确定会发生什么。 这周上海的温度还可以,但是今天下雨了,未来两天温度下降的很多。 项目进度 游戏码农:那些打工的日子 这周主要做的事情还是各个模块的数据配置,以及界面元素的考虑,具体的UI还没有仔细考虑。专业技能相关配置、厨艺配置、外卖配置、找工作和面试相关配置、通勤配置、行为配置。 夜莺号的记忆 这个项目这周做了很多事情,工程的搭建,游戏循环的逻辑,具体的关卡的逻辑等。 本周电影 欲望号快车 Crash (1996) 毒液 本周书籍 《KK三部曲》(阅读中) 下周初步计划 继续数据配置工作 夜莺号关卡逻辑 有时间的话考虑游戏码农的UI构建

Rust 光线追踪 03: 渲染一个圆

2021年11月20日 22:10
下面的公式有点多,只是把原教程中的公式详细展开了,一步一步来,很简单,相信我。 给定一个点,判断一个点是否在一个半径为 $R$ 的圆或者圆外、圆内,我们可以使用下面的公式来判断。这里假设圆心在 $(0,0,0)$ 点,半径为 $R$ 如果一个点 $(x, y, z)$ 在圆上,则 $x^2 + y^2 + z^2 = R^2$ 如果一个点 $(x, y, z)$ 在圆内,则 $x^2 + y^2 + z^2 < R^2$ 如果一个点 $(x, y, z)$ 在圆外,则 $x^2 + y^2 + z^2 > R^2$ 假设圆心在点 $C = (C_x, C_y, C_z)$,半径为 r,则根据上面的第一个公式,可以得到 $(x - C_x)^2 + (y - C_y)^2 + (z - C_z)^2 = r^2$ 我们可以将点 $(x, y, z)$ 使用之前的 Vec3 向量表示,例如设 $点P = (x, y, z)$,则可以将上面的公式,换一种表达形式,也就是

Rust 光线追踪 01: 输出PPM

2021年11月18日 17:30

这个系列的博客是使用 Rust 来实现 《Ray Tracing in One Weekend》相关的内容,我们把整本书拆开,来分篇实现,这们可以进一步降低难度。PPM是一个简单的图片格式,它将RGB的颜色使用 ASCII 的形式记录在文件中。

This Week In Moeif 21

2021年11月15日 20:06

这周的周记,拖到了周一才写。昨天周日,一天没干活,晚上的时候把博客从Hexo迁移到了Hugo,因为Hugo有更像样的主题。这个周小Q回家了,我一个人在上海,还是按原来的节奏开发,还在继续推进游戏码农项目,但是推的有点吃力,感觉好多东西没有想明白。

This Week In Moeif 20

2021年11月7日 16:06

今天上海的天气开始大幅度降温了,现在外面开始下雨了,刚刚看完了一部电影《幸福终点站》,一开始想从里面寻找一下关于时间线的灵感,但是看着看着,就沉浸到剧情里了。

This Week In Moeif 19

2021年10月31日 20:37

这周买了滑板,现在每天下午 4:00 左右会出去跑步或玩会滑板。下午出去运动,没有以前晚上出去时那种任务的负重感,更像是放松一下。现在的状态还好,时间上算是比较自由,唯一的问题是还没有什么收入。之前一直关注的一个虚拟货币 GEEKCASH 这个月上线了,但是没有奇迹出现,这个慢慢等吧,只要不归0,就还有希望。

❌
❌