1.Box2d源码阅读(2):从GJK到CCD
2.程序员的形状相似形状相浪漫,2022跨年烟花代码(Python)
3.UE5 ModelingMode & GeometryScript源码学习(一)
4.PyTorch 源码分析(三):torch.nn.Norm类算子
5.C语言爱心代码,源码源码C语言爱心代码大全
6.MMDet——DETR源码解读
Box2d源码阅读(2):从GJK到CCD
GJK算法在Box2D中的应用
Box2D中的GJK算法整合了Voronoi区域算法与重心坐标原理,旨在计算两个形状之间的源码源码最短距离。为了使查询更加通用,形状相似形状相Box2D使用了封装的源码源码视屏易语言源码通用输入输出对象,通过b2distanceproxy来传递顶点和形状半径。形状相似形状相当需要查询两个形状间的源码源码距离时,通过m_buffer进行特殊处理,形状相似形状相以适应链状形状。源码源码
在GJK算法中,形状相似形状相单纯形作为关键数据结构,源码源码其定义包含了索引信息以标识顶点来源于两个形状。形状相似形状相在封装一层单纯形后,源码源码我们开始探索单纯形中的形状相似形状相一些辅助函数,如solve2和solve3,这些函数用于更新单纯形的顶点。它们分别负责查找在已形成的线段或三角形上,距离原点直线距离最短的点。通过重心坐标方法计算a1和a2系数,求解p点在w1和w2之间的位置。
在两个形状之间距离求解过程中,函数通过一系列步骤实现。首先,定义了所需的电子阅读源码公式和变量,利用p点与线段垂直的性质求解a1和a2系数。通过行列式方法求解方程组,得到p点在w1和w2之间的坐标。类似地,solve3函数也利用公式进行求解。
对于TOI(Time of Impact)的实现,Box2D通过三重for循环驱动来计算两个形状在运动过程中的撞击时间,以及快速运动中在一次tick内互相穿越的情况。首先,使用sweep功能表示形状在指定时间后的location和rotation信息。接着,通过b2SeparationFunction查找两个形状之间的距离。在求解TOI时,函数通过三重循环结合二分法与割线法进行逼近,找到(t1, t2)范围内满足条件的时间。
尽管代码实现和示例存在细微差异,Box2D的GJK算法与TOI实现的核心逻辑保持一致,展示了通过优化查询和计算过程,高效地处理物理引擎中形状间的距离与碰撞检测问题。
程序员的浪漫,跨年烟花代码(Python)
跨年倒计时啦
今天分享用python实现一场烟花秀
感兴趣的小伙伴,提前收藏起来,一定要看到最后!
话不多说
1.首先制作一个绚丽的溯源码50夜空
制作夜空,其实就是设置画布。夜晚的天空月明如水,星光攒动,绚丽至极。采用turtle库绘制夜空景象费时费力。月亮、繁星等景色并非本文重点。因此,选用背景来实现夜空效果,如下图。
(星空)
(月亮)
照片选用完毕后,用代码制作夜空,具体如下。
运行后,效果如下图所示。
2.接下来制作一个炮竹
燃放烟花从点燃炮竹开始,炮竹上升至一定高度后引擎点燃,烟花炸裂。接下来绘制炮竹,形状采用长方形,利用画笔的形状‘square’。具体代码如下。
注意,最后的打乱顺序源码代码
3.来制作烟花
制作烟花是本文重点。
烟花可看作由形状相似的图形聚集而成。原理是,将形状相似的同类图形聚集,短时间内向四周炸开。类似炮竹制作,利用turtle画笔形状作为烟花基本形状,代码如下。
烟花在Python中被定义为一组形状相同的画笔列表firworks。
炮竹与烟花制作完毕,让二者协同工作,即炮竹上升至一定高度后,烟花聚集并迅速炸开。具体代码如下。
以上代码为无限循环,每次循环炮竹上升,到达一定高度后烟花聚集并迅速炸开。运行效果如下。
调整代码,加入函数让烟花形状随机变化,并加入以下代码。
让烟花炸完后炮竹随机换位置。
运行后结果如下:
需要源码的小伙伴戳↓↓↓(添加时备注烟花)无偿分享!
UE5 ModelingMode & GeometryScript源码学习(一)
前言
ModelingMode是虚幻引擎5.0后的新增功能,用于直接在引擎中进行3D建模,5.4.147内核源码无需外接工具,实现快速原型设计和特定需求的模型创建。GeometryScript是用于通过编程方式创建和操控3D几何体的系统,支持蓝图或Python脚本,提供灵活控制能力。
本文主要围绕ModelingMode与GeometryScript源码学习展开,涵盖DMC简介、查找感兴趣功能源码、动态网格到静态网格的代码介绍。
起因
在虚幻4中,通过RuntimeMeshComponent或ProceduralMeshComponent组件实现简单模型的程序化生成。动态网格组件(DynamicMeshComponent)在UE5中提供了额外功能,如三角面级别处理、转换为StaticMesh/Volume、烘焙贴图和编辑UV等。
将动态网格对象转换为静态网格对象时,发现官方文档对DMC与PMC对比信息不直接涉及此转换。通过搜索发现,DynamicMesh对象转换为StaticMesh对象的代码位于Source/Runtime/MeshConversion目录下的UE::Modeling::CreateMeshObject函数中。
在UE::Modeling::CreateMeshObject函数内,使用UEditorModelingObjectsCreationAPI对象进行动态网格到静态网格的转换,通过HasMoveVariants()函数接受右值引用参数。UEditorModelingObjectsCreationAPI::CreateMeshObject函数进一步处理转换参数,UE::Modeling::CreateStaticMeshAsset函数负责创建完整的静态网格资产。
总结转换流程,DynamicMesh对象首先收集世界、变换、资产名称和材质信息,通过FCreateMeshObjectParams对象传递给UE::Modeling::CreateMeshObject函数,该函数调用UE::Modeling::CreateStaticMeshAsset函数创建静态网格资产。
转换为静态网格后,程序创建了一个静态网格Actor和组件。此过程涉及静态网格属性设置,最终返回FCreateMeshObjectResult对象表示转换成功。
转换静态网格为Volume、动态网格同样在相关函数中实现。
在Modeling Mode中添加基础形状涉及UInteractiveToolManager::DeactivateToolInternal函数,当接受基础形状时,调用UAddPrimitiveTool::GenerateAsset函数,根据面板选择的输出类型创建模型。
最后,UAddPrimitiveTool::Setup函数创建PreviewMesh对象,UAddPrimitiveTool::UpdatePreviewMesh()函数中通过UAddPrimitiveTool::GenerateMesh生成网格数据填充FDynamicMesh3对象,进而更新到PreviewMesh中。
文章总结了Modeling Mode与GeometryScript源码的学习路径,从动态网格到静态网格的转换、基础形状添加到输出类型对应函数,提供了一条完整的流程概述。
PyTorch 源码分析(三):torch.nn.Norm类算子
PyTorch源码详解(三):torch.nn.Norm类算子深入解析
Norm类算子在PyTorch中扮演着关键角色,它们包括BN(BatchNorm)、LayerNorm和InstanceNorm。1. BN/LayerNorm/InstanceNorm详解
BatchNorm(BN)的核心功能是对每个通道(C通道)的数据进行标准化,确保数据在每个批次后保持一致的尺度。它通过学习得到的gamma和beta参数进行缩放和平移,保持输入和输出形状一致,同时让数据分布更加稳定。 gamma和beta作为动态调整权重的参数,它们在BN的学习过程中起到至关重要的作用。2. Norm算子源码分析
继承关系:Norm类在PyTorch中具有清晰的继承结构,子类如BatchNorm和InstanceNorm分别继承了其特有的功能。
BN与InstanceNorm实现:在Python代码中,BatchNorm和InstanceNorm的实例化和计算逻辑都包含对输入数据的2D转换,即将其分割为M*N的矩阵。
计算过程:在计算过程中,首先计算每个通道的均值和方差,这是这些标准化方法的基础步骤。
C++侧的源码洞察
C++实现中,对于BatchNorm和LayerNorm,代码着重于处理数据的标准化操作,同时确保线程安全,通过高效的数据视图和线程视图处理来提高性能。C语言爱心代码,C语言爱心代码大全
探索C语言的魅力,让我们以一种独特的方式表达爱意。在编程的世界里,用代码编织情感,可以创造出令人瞩目的艺术品。下面是几个基础的C语言爱心代码展示,让你一窥C语言的美学。
首先,让我们从简单的图案开始。一个简单的爱心图案可以用以下代码实现:
c
#include
int main() {
int i, j;
for (i = 0; i <= 5; i++) {
for (j = 0; j <= 5; j++) {
if ((i + j == 5) || (i - j == 3) || (i == j))
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
这段代码通过控制打印星号(*)和空格的输出,形成了一个心形图案。你可以在编译器上运行这段代码,亲眼见证爱心的诞生。
接下来,我们尝试更复杂一点的动态爱心代码。一个动态爱心可以随着输入参数的变化而变化大小和位置。下面是一个简单的动态爱心实现示例:
c
#include
int main() {
int i, j, n;
printf("请输入爱心的大小: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if ((i + j == n - 1) || (i - j == n - 1) || (i == j))
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
通过输入不同的数值,这个动态爱心可以展现出不同的大小和形状,增添更多的趣味性。
以上展示了几个基础和简单的C语言爱心代码。如果你对C语言充满热情,不妨继续探索更多可能,将爱意以代码的形式传达给世界。从这些代码出发,你可以不断尝试和改进,创造出更多独特的作品。
如果想获取更多C语言爱心源代码,可以访问以下链接:
docs.qq.com/doc/DV0hOY3...
MMDet——DETR源码解读
DETR,作为目标检测领域的里程碑式工作,首次全面采用Transformer架构,实现了端到端的目标检测任务,堪称Transformer在该领域的开创之作。其核心创新在于引入了object query,将目标信息以查询形式输入Transformer的解码器。object query首先通过自注意力机制学习对象特征,确保每个query关注独特的对象信息。接着,它与经过自注意力处理的图像特征进行交叉注意力,提取目标特征,最终得到包含对象信息的query,通过全连接层(FFN)输出bbox和类别信息。 深入理解DETR前,首先要明确两个关键点:一是模型结构原理,二是MMDet配置解读。DETR模型主要包括Backbone(如ResNet,常规但非重点)、Transformer的编码器和解码器、以及head部分。在MMDet配置文件中,model部分区分了Backbone和bbox_head。 在MMDet的单阶段目标检测训练中,forward_single()函数在mmdet/models/dense_heads/detr_head.py中负责除Backbone外的前向计算,代码展示有助于理解。DETR的前向过程涉及的主要变量形状可以参考代码中的打印,但需注意由于随机裁剪,不同batch的形状可能会有所变化。 Transformer部分在mmdet/models/utils/transformer.py中,N代表特征图的宽度和高度的乘积,这里提供了详细的代码解读。若对Transformer的mask有疑问,可以参考相关文章深入理解。