简易弹簧质点系统实现
弹簧质点系统(Mass-Spring System)弹簧质点系统算是最简单的一种物理模型,它假设所有物体除了质点,便是连接质点的弹簧。在这种情况下,我们需要分析的力非常简单,基本上只用考虑重力以及弹簧力即可。公式则如下图所示。
代码地址: https://github.com/WeebOwO/MassSpringSystem
具体实现整体的结构如下面的伪代码所示,我们在主循环里面首先处理一下各种事件,然后物理引擎往前步进一段时间,最后提交给渲染器进行渲染。
12345# main loopwhile True: process_event() engine.step() render()
而具体到这个engine.step()函数,我们所做的事情则是计算每个点的受力,并根据受力计算出对应的速度,加速度,以及对应的位移。
1234# engine.step()def step(): calclate_force() # 计算力 solve() # 在这里求解各种各样的速度,并根据自定义delta time进行迭代
从更为专业的术语上解释的话, ...
光线追踪中的辐射度量学
为什么要引入辐射度量学?在传统的Whitted style ray tracing中,我们的Shading方法本质上还是一个基于经验公式的Phong或者Blinn-Phong光照模型,而并没有真正的基于物理去考虑光以及对应能量应该如何表述。所以为了能够使得Ray Tracer生成高质量图片,我们必须要借助一些成熟的数学物理体系来对光的能量进行描述。辐射度量学(Radiometry)便是一个非常理想的工具。
Radiometry provides a set of ideas and mathematical tools to describe light propagation and reflection. —Pbrtv3 5.4
相关单位定义与解释首先引入一个最基本的关于辐射能量(Radiant Energy)的定义,我们用符号$Q[J=Joule]$来进行表述,他的单位则是我们自初中物理就非常熟悉的焦耳,不过在计算机图形领域,我们很少直接使用$Q$,因为这个能量很明显是和时间相关的一个量,一个物体接受光照的时间越长,其接受到的能量自然就越高。而在刨除了时间长短这影响后,我们 ...
Unreal中的碰撞响应
虚幻中的碰撞响应总的来看,虚幻中的碰撞响应可以分为两大类,即Object Response和Trace Response。其中Object Response就是我们常见的世界中物体与物体的之间的碰撞,而Trace Response则是指与LineTrace这类射线相应, 也就是决定该物体会不会响应场景中的射线检测。更进一步用官方文档的话来总结的话就是:
碰撞响应和追踪响应构成了虚幻引擎5在运行时处理碰撞和光线投射的基础。能够碰撞的每个对象都有对象类型和一系列响应,用来定义它与所有其他对象类型交互的方式。当碰撞或重叠事件发生时,涉及的两个(或全部)对象都会发出或受到阻挡、重叠或忽略的作用。
追踪响应 的原理基本相同,唯一的区别是追踪(光线投射)本身可以定义为一种追踪响应类型,因此Actor可以根据其追踪响应阻挡或忽略。
其中Object Response负责的交互类型如下:
WorldStatic: 应用于不移动的任意Actor。
WorldDynamic: WorldDynamic用于受到动画或代码的影响而移动的Actor类型。
Pawn:任何由玩家控制的实体的类型都应为Pawn ...
Compile Loop!
编译时计算C++的一大好处就是可以在编译时进行一些非常有意思的操作。虽然频繁的编译时计算会显著的增加编译时间,但是同样的也会减小运行时负担。当然前面这个只不过是一方面的说辞,我使用模板或者constexpr这些特性纯粹是因为这样看起来比较有趣。最近我就从Bisqwit的一个视频中学到了一个将循环转到编译时的一个小技巧。故水个博客记录一下。
所有的测试代码可以在这里找到。
1234constexpr int iter_times = 10;for (size_t i = 0; i < iter_times; ++i) { do_something(i);}
上面的这段代码是一段稀松平常的循环,我们利用for语句进行了10次循环,每次循环都去执行do_something()这个函数。首先我们先考虑怎么把这个东西用编译时循环进行展开。我们所使用的到工具叫做std::index_sequence以及std::make_index_sequence,具体的代码如下所示。
123constexpr int iter_times = 10;[&]<std ...
Parallel Algorithms in STL
概述C++17引入了STL算法的并行化,作为一个Cpper,还是要小小的把玩一下,看看到底该怎么使用这个新特性,并且了解一下背后的实现原理。整体的测试代码可以在这里找到。
如何使用让我们以std::sort来作为一个小例子来介绍怎么将其并行化。
通常来讲如果要对一个序列进行排序的话,我们大概率会写出以下benchmark程序。
12345678for (int i = 0; i < iterationCount; ++i) { // testSize = 1'000'000; vector<double> sorted(doubles); const auto startTime = high_resolution_clock::now(); sort(sorted.begin(), sorted.end()); const auto endTime = high_resolution_clock::now(); print_results("Serial", sorted, startTime, endT ...
Concept!
Concept简介谈及C++20,众多人都说这是能匹敌C++11的更新,而在20的众多更新中,Concept,Module,Corutine,Range被称为Big4,而今天文中主角便是Concept。
简单来说,Concept是用来限制模板中类型参数的一个语法糖,在C++20以前,如果我们想对模板参数的类型做一些限制,就得用一种叫做SFINAE的模板编程技巧,我对这个并没有太深入的理解,但是看到模板参数里面一段长长的enable_if,我还是深感其可怕。但是到了C++20,我们就可以有非常漂亮简洁的写法了(Concept:无所谓,我会出手)。
不过首先先推荐一下这个视频吧,算是我C++20的启蒙,How C++20 Changes the Way We Write Code。下面所举的例子也是视频中的例子,你可以在这里找到我写的测试代码。
关于Concept的一百种语法以及一个小例子先考虑这么一个需求,我们需要判断一个数是不是2的幂,我们可以写出以下代码。
12345template <typename T>bool is_power_of_2(T target) ...
Chandler Carruth Talk 总结
简介Chandler Carruth算是我在CppCon上面最喜欢的一个老哥,他现在是在google的llvm组做编译器相关的工作,他的talk幽默风趣,并且喜欢说一些性能优化相关的东西,作为一个cpper,我是属于听见优化就走不动道的那类人,所以他的这些视频我都觉得收益良多。故尝试对他这几年在CppCon上的会议上的视频做一个简单的总结,顺便重新学习一下,毕竟常言道,温故而知新。(顺便一提,之前挺火的那个Carbon Language也是由他上台讲的)
CppCon 2014 Efficiency with Algorithms, Performance with Data Structures视频地址:https://www.youtube.com/watch?v=fHNmRkzxHWs&t=1488s
这个演讲是他目前为止在CppCon上播放量最高的一期。其主旨主要是强调两点:
Efficiency with Algorithms
Performance with Data Structures
Carruth在这里把Efficiency解释如下:
Improvi ...
重新回归Hexo!
在折腾了一天后,我从博客园重新回归到Hexo之中,没想到用来用去还是这个简单的静态博客最适合我,并且这次我花了点软妹币买了一个5年份的域名,希望这点支出能成为接下来更新博客的动力。
总的来看,我的博客主要关注以下几个方面:
游戏开发
个人项目以及学习记录
计算机基础知识
算法竞赛
好,那第一篇博客就先水写到这里吧,加油啊我!!