自己动手写2D物理引擎-初级篇(1)

2D游戏开发 - SkyGameEngine2d 引擎架构 | 目录结构 | 引擎入口点 2D游戏开发 - SkyGameEngine2d 引擎架构 | 目录结构 | 引擎入口点一、引擎架构二、引擎目录2.1 src目录介绍三、项目目录四、引擎框架入口点分析4.1 main.cpp 分析4.2 GameAppDelegate.cpp 分析 SkyGameEngine2d - 探索 简洁 易用 ,一款适合游戏入门学习的2d游戏引擎 项目地址 https://gitee.com/xfco... 阅读详情

第一章 框架设计

总体的类如下图所表示。
在这里插入图片描述
Shape作为形状基类。存储了与形状有关的物理量

class Shape
{
public:
	float I = 0.0f, invI = 0.0f;//转动惯量和逆
};

Rectangle和Circle派生于Shape,存储了实际的形状信息。

class Rectangle :public Shape
{
public:
	//存储矩形的长宽
	agl::vec2f r;
};

class Circle :public Shape
{
public:
	float r;
};

PhyAttr中存放的是各种物理属性,这些属性是不限于任何物体都有的属性。

namespace phy2d
{
	class PhyAttr
	{
	public:
		PhyAttr()
		{
			velocity = agl::vec2f(0.0f);
			position = agl::vec2f(0.0f);
			force = agl::vec2f(0.0f);
		}
		agl::vec2f velocity;//速度
		agl::vec2f position;//位置
		float rotation = 0.0f;//旋转角度
		float angularVelocity = 0.0f;//角速度
		agl::vec2f force;//力
		float torque = 0.0f;//转矩
		float friction = 0.0f;//摩擦力
		float mass = 0.0f, invMass = 0.0f;//质量和逆
		~PhyAttr() {}
	};
};

PhyObj是PhyRect与PhyCircle的父类,其主要作用是做为基类指针,支持动态类型使用,分别继承了形状和物理特性,组成了有物理特性的形状。

namespace phy2d
{
	class PhyObj {};
	class PhyRect :public PhyObj,public Rectangle, public PhyAttr
	{
	public:
	};

	class PhyCircle :public PhyObj, public Circle, public PhyAttr
	{
	public:
	};
};

World中负责整个物理世界的运行,存储物体和碰撞信息。协调整个物理引擎的流程。

namespace phy2d
{
	class World
	{
		//存储物体
		std::vector<PhyObj*> objects;
		//存储碰撞信息
		std::unordered_map<std::tuple<PhyObj*, PhyObj*>, Contact> collisions;
	public:
	};
}

Contact是存储碰撞信息的结构体,Impulse是存储冲量的,因为我们要实现冲量累积方法,所以碰撞信息中保留上一次的冲量信息。Driver是存储两个物体指针和其碰撞信息的结构体,这个结构是存放碰撞后结果的直接结构体,并且其中要有计算两个物体冲量变化的能力。

namespace phy2d
{
	class Impulse
	{
	public:
		//正面和侧面的动量
		float ImpulseNormal;
		float ImpulseSide;
	};
	//碰撞信息
	class Contact
	{
	public:
		Contact() {}
		agl::vec2f position;//碰撞点位置
		agl::vec2f normal;//分离轴方向
		//agl::vec2f r1, r2;//半径//现场算
		float separation;//最小相交距离
	};

	class Driver
	{
	public:
		//碰撞信息列表
		std::vector<Contact> contacts;
		//碰撞物体
		PhyObj *a, *b;
		//运动执行函数
		void ApplyImpulse()
		{
			//计算好必要的值

			//由于之前的冲量计算是在连个形状相交情况下计算,
			//所以一旦两个物体分开,计算将不会连续
			//循环迭代
		}
	};
}

还有一些数学计算,向量计算的类,这些类可以自己写,也可以用现成的比如GLM,这里就使用自己写的向量矩阵计算库了。

C语言实现极简物理引擎(二):小球弹性碰撞 本博客展示了如何在Dev-C++环境下使用C语言在控制台上开发一个简易物理引擎,模拟了小球的自由落体和弹性碰撞。教程着重于基本编程技巧和文本动画的实现,适合C语言初学者。 阅读详情

相关推荐

Unity Physics2D 2d物理引擎游戏 笔记

Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。动力学刚体不受重力和力的影响,而受用户的控制,需要使用类似Rigidbody2D.MovePosition、Rigidbody2D.MoveRotation的方法。它于静态刚体一样,只与动态刚体会发生碰撞。我们做的是像素游戏,每一个像素都是宝贵的,一定要把抗锯齿关闭,否则画面就糊了。

游戏人生 3053

Cocos2D-HTML5开源2D游戏引擎www.maiziedu.com

Cocos2D-HTML5是基于HTML5规范集的Cocos2D引擎的分支,于2012年5月发布。Cocos2D-HTML5的作者林顺将在本文中介绍Cocos2D-HTML5的框架、API、跨平台能力以及强大的性能。Cocos2D-HTML5是Cocos2D系列引擎随着互联网技术演进而产生的一个分支。该分支基于HTML5规范集,目标是可对游戏进行跨平台部署。Cocos2D-HTML5采用MIT开源

coco510的专栏 1292

Unity 2D物理引擎实战:从刚体、碰撞器到弹射机制完整实现

在游戏开发中,物理引擎是实现真实交互的核心技术,它通过模拟现实世界的物理规律,为游戏对象赋予运动、碰撞和力学反馈。其基本原理基于牛顿力学,通过刚体、碰撞器、关节等组件构建物体的物理属性,并利用力与速度的计算驱动物体运动。这一技术对于提升游戏的真实感和玩家沉浸感具有重要价值,广泛应用于平台跳跃、射击、解谜等多种游戏类型。特别是在2D物理游戏中,刚体作为物体的“物理灵魂”,定义了其质量、阻尼等属性;碰撞器则决定了物体的形状和碰撞边界;而弹簧关节等连接器能模拟橡皮筋等弹性效果。本文以热门的“愤怒的小鸟”弹射机制为

weixin_29012765的博客 319

基于cocos2d-x引擎的游戏框架设计

转自:http://www.linuxde.net/2012/03/8817.html

MyDriverC 707

Godot物理引擎实战:从2D输入到3D物理的飞镖投掷模拟

物理模拟是游戏开发中实现真实交互与沉浸感的核心技术,其原理基于牛顿力学,通过刚体动力学计算物体的运动与碰撞。在游戏引擎中,物理系统将抽象的物理定律转化为可编程的组件与参数,为游戏对象赋予质量、速度、力与扭矩等属性,从而创造出符合直觉的动态行为。这项技术的价值在于,它能让开发者高效地构建复杂、可信的物理交互,而无需从零实现底层算法,极大地提升了开发效率与效果上限。在众多应用场景中,模拟投掷、射击等基于力与运动的交互尤为典型,它要求精准地将玩家的2D输入(如鼠标拖拽)映射为3D世界中的物理参数。本文以Godot

weixin_31306591的博客 299

Scratch中构建简易2D物理引擎:从重力弹跳到碰撞检测

物理引擎是模拟真实世界物体运动、碰撞与重力效果的核心组件,广泛应用于游戏开发和互动动画。其基本原理基于牛顿力学,通过计算物体的位置、速度与加速度,并在每一帧进行更新,从而实现连续、真实的运动模拟。在技术实现上,物理引擎的核心价值在于为虚拟世界提供符合直觉的动力学反馈,极大地增强了交互体验的真实感与沉浸感。常见的应用场景包括平台跳跃游戏、弹球模拟、以及各类需要物体自然交互的动画项目。本文将以图形化编程平台Scratch为例,深入讲解如何手动实现一个包含**刚体动力学**与**碰撞检测**的简易2D物理引擎,涵

weixin_33721344的博客 403

自己动手写二维物理引擎(一)

这一篇,继续之前的想法,开始写物理引擎的代码。由于pygame不能同时打开多个窗口,我决定换Qt来显示窗口。

Admibrill的博客 768

Unity 2D足球游戏开发实战:从物理引擎到AI对手的完整实现

在游戏开发中,物理引擎是实现真实交互体验的核心技术,它通过刚体、碰撞体和物理材质等组件模拟物体的运动与碰撞。Unity内置的Physics 2D系统基于Box2D,为开发者提供了高效稳定的物理模拟能力,尤其适用于体育竞技类游戏的开发。掌握物理参数调整,如质量、阻尼和摩擦力,能显著提升游戏手感。结合有限状态机(FSM)管理角色行为,可以构建出具备基础决策能力的AI对手。针对性能优化,需关注物理计算与渲染批次,对于WebGL平台,采用Addressable资源系统能有效解决初始化缓慢的问题。本文以2D足球游戏为

weixin_30444105的博客 419

java做物理引擎_不使用物理引擎,自己动手做真实物理的模拟投篮游戏

最近打算做一个2D投篮游戏,由于对于BOX2D等物理引擎并不熟悉,加之一开始低估了游戏所需要的碰撞检测复杂度,认为仅仅涉及4面墙,篮球,篮板,篮筐,篮网的碰撞检测并不复杂。因此决定自己实现所需要的碰撞检测。结果实际开始做时磕磕碰碰遇到了许多问题。1、如何实现像素级碰撞检测。as3原生的hitTestObject只能检测矩形,对于圆形等其他形状就不适用了;打算用hitTestPoint来检测篮球与篮...

weixin_30334225的博客 977

Unity 2D Tilemap碰撞优化:Composite Collider 2D实战配置指南

在2D游戏开发中,碰撞检测是物理系统的核心基础,它决定了角色与环境的交互精度和流畅度。其原理是通过几何形状的重叠计算来判断物体间的接触,直接影响游戏的物理手感和性能表现。对于使用Tilemap构建的2D关卡,默认的独立瓦片碰撞体在性能与稳定性上存在瓶颈。通过引入Composite Collider 2D(复合碰撞体)技术,可以将大量零散的碰撞体合并为连续的整体,大幅降低物理引擎的计算开销,从而提升游戏运行效率。这一优化技术尤其适用于平台跳跃、类银河恶魔城等对碰撞精度要求高的2D游戏场景。本文将以Unity引

weixin_29016315的博客 315

Unity 2D大地图性能优化:从Polygon Collider到Tilemap Collider的完整迁移指南

在2D游戏开发中,碰撞检测是物理引擎的核心功能之一,它负责处理游戏对象之间的交互与边界判定。传统方案中,开发者常为每个精灵单独添加Polygon Collider 2D,这种离散碰撞体管理方式在对象数量增多时,会导致物理引擎的宽相位与窄相位检测计算量呈指数级增长,成为性能瓶颈。而Tilemap Collider 2D则代表了基于网格的批量处理范式,它将碰撞信息数据驱动地存储在瓦片资源中,通过统一网格表达大幅减少物理引擎需管理的碰撞体数量。这种技术转变尤其适用于开放世界RPG、策略游戏等拥有复杂地形的2D项目

weixin_29001683的博客 273

Unity 2D物理引擎实战:从零实现AABB碰撞系统与空间划分

碰撞检测是游戏开发中的核心技术,它决定了游戏对象之间的交互逻辑与物理反馈。其基本原理是通过几何计算判断物体是否相交,而AABB(轴对齐包围盒)因其计算高效、实现简单,成为2D游戏中最常用的碰撞形状之一。掌握AABB碰撞系统不仅能提升对物理模拟底层原理的理解,更能为特定游戏风格(如像素风、休闲游戏)提供高度可控、性能优化的解决方案,实现超越通用物理引擎的定制化效果。本文基于Unity引擎,深入探讨了AABB碰撞检测的核心算法、高效的空间划分策略(如空间哈希)以及碰撞响应处理,旨在帮助开发者构建轻量、可控的2D

weixin_30675247的博客 360

Godot物理引擎性能优化实战:从架构原理到移动端调优

物理引擎是现代游戏开发中的核心技术模块,负责模拟物体运动、碰撞检测与响应等基础物理行为。其核心原理基于牛顿力学,通过离散时间步长迭代计算力、速度与位置关系,实现逼真的交互效果。在游戏开发中,物理引擎的技术价值在于为角色移动、物体交互、环境反馈提供了标准化解决方案,极大提升了开发效率与沉浸感。然而,随着场景复杂度提升,物理计算可能成为性能瓶颈,尤其在移动端等资源受限平台。本文聚焦Godot引擎,深入探讨如何通过优化碰撞检测、刚体管理及代码策略,有效提升物理模拟性能,确保游戏流畅运行。文中将结合碰撞形状优化、对

weixin_29013129的博客 329

不使用物理引擎,自己动手做真实物理的模拟投篮游戏

最近打算做一个2D投篮游戏,由于对于BOX2D等物理引擎并不熟悉,加之一开始低估了游戏所需要的碰撞检测复杂度,认为仅仅涉及4面墙,篮球,篮板,篮筐,篮网的碰撞检测并不复杂。因此决定自己实现所需要的碰撞检测。结果实际开始做时磕磕碰碰遇到了许多问题。 1、如何实现像素级碰撞检测。 as3原生的hitTestObject只能检测矩形,对于圆形等其他形状就不适用了;打算用hitTe...

weixin_30577801的博客 416

零基础微信理财通基金实操指南(2026版)

先活下来:保证不亏大钱,再想赚钱慢慢变富:年化10%,7年翻倍,这已经很好了开始比完美重要:今天先存100元到零钱通,就是最好的开始现在打开微信,进入理财通,完成第一步风险测评吧!有任何问题可以随时问,我会用最通俗的方式解释。

老韩的Linux云计算架构师进阶之路 1688

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

Godot 2D物理碰撞实战:用FlappyBird案例解析RigidBody2D与StaticBody2D

在2D游戏开发中,物理碰撞是实现游戏交互的核心基础。其原理是通过物理引擎为游戏对象赋予刚体属性,并利用碰撞形状定义其物理边界,从而实现对象间的力学检测与响应。这项技术的价值在于能够高效、真实地模拟物体间的相互作用,极大简化了复杂交互逻辑的开发。在平台跳跃、物理解谜、动作射击等游戏类型中,精准的碰撞检测是保障游戏可玩性和手感的关键。本文以经典游戏FlappyBird为案例,深入剖析Godot引擎中RigidBody2D(动态刚体)与StaticBody2D(静态刚体)的协作机制。通过配置碰撞层与遮罩,开发者可

weixin_29967445的博客 338

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 356

SpriteJS物理引擎集成:Matter.js与精灵交互终极指南

SpriteJS是一个跨平台的高性能图形系统,它为开发者提供了强大的2D和3D渲染能力。本文将重点介绍如何将Matter.js物理引擎与SpriteJS精灵系统完美集成,创建出令人惊叹的交互式图形应用。🎯 ## 为什么选择SpriteJS与Matter.js集成? SpriteJS作为高性能图形系统,结合Matter.js强大的物理引擎,可以轻松实现真实的物理效果。无论是游戏开发、数据可视化

gitblog_01154的博客 941

未隔离电源设备使用usb转串口调试导致串口模块爆炸烧坏事故记录

这个事就发生在前两天,我们公司的wifi模块被客户用到了咖啡机上,客户寄了一台整机给我们协助调试,还送了几包咖啡豆,本想着还能打个咖啡喝一喝的,但就在咖啡机刚寄过来第一天,就出事了。而这个事故的发生,竟然仅仅是因为同事接了个串口模块到电脑调试打印导致的。谁也想不到,这个3.3V的供电的wifi模块居然还有这么大的威力。直接将usb转TTL串口模块的转换芯片给爆开了,咖啡机也给弄坏了,据同事描述当时情况就只见到一片火光和一声巨响,状况比较惨烈,所幸的是笔记本电脑没有烧坏,但是直接给崩蓝屏了。 ...

fangye945a的博客 6192

WPS Office 2019 For Linux二次开发全流程:从源码下载到Demo运行

本文详细介绍了在Linux环境下进行WPS Office 2019 C++二次开发的全流程,涵盖从开发环境准备、源码获取、核心依赖(Qt与WPS)安装配置,到最终编译运行官方Demo的完整步骤。文章重点解析了环境搭建中的常见问题与解决方案,旨在帮助开发者快速上手WPS二次开发。

weixin_29001423的博客 390

Unity 2D物理游戏开发实战:从零复刻经典《黄金矿工》

在游戏开发领域,物理引擎是实现真实交互与动态效果的核心技术。Unity引擎内置的Box2D物理系统,通过刚体、碰撞体和关节等组件,为开发者提供了模拟真实物理行为的强大工具。其技术价值在于,开发者无需手动编写复杂的物理公式,即可高效实现碰撞检测、重力模拟和物体运动,极大地提升了开发效率与游戏的真实感。这一技术广泛应用于2D平台跳跃、弹球、捕鱼及抓取类游戏中,为玩家带来沉浸式的操作体验。本文以经典游戏《黄金矿工》为蓝本,深入剖析如何运用Unity的物理系统,特别是Rigidbody2D和HingeJoint2D

weixin_32570803的博客 244

MounRiver Studio(MRS)使用技巧:添加头文件目录;增加代码分组

MounRiver Studio(MRS)使用技巧:添加头文件目录

cheng___yi的博客 1809

Python Pygame复刻《登山赛车》:从零实现2D游戏物理引擎与存档系统

游戏开发的核心在于将数学、物理原理转化为可交互的虚拟体验,其中物理引擎负责模拟现实世界的运动规律,如重力、碰撞与摩擦力,是赋予游戏角色真实动态反馈的技术基石。通过代码实现这些基础物理力,开发者能深入理解运动学与动力学的工程应用价值,从而构建出从平台跳跃到赛车模拟等多种游戏场景。本文以复刻经典游戏《登山赛车》为实践案例,具体演示如何运用Python和Pygame库,从车辆受力分析、地形程序生成等底层模块开始,逐步搭建一个包含完整物理交互和JSON数据持久化的2D游戏项目,尤其聚焦于碰撞检测、柏林噪声地形等关键

weixin_30835649的博客 346

结构力学仿真软件:STAAD.Pro:结构抗震设计与STAAD.Pro应用_2024-08-10_11-49-29.Tex

STAAD.Pro是一款广泛应用于结构工程领域的仿真软件,由Bentley Systems开发。它能够进行结构分析和设计,支持多种结构类型,包括桥梁、建筑物、塔架等。STAAD.Pro提供了强大的建模工具,用户可以轻松创建复杂的结构模型,并进行静态和动态分析。软件还支持多种载荷组合,包括地震载荷,以及提供详细的报告和图纸输出,便于工程师进行设计和审查。STAAD.Pro是一款广泛应用于结构工程设计的软件,其界面直观,功能强大,能够进行结构分析与设计。菜单栏。

977

华为OD机试 - 矩形绘制 - 数组、坐标偏移(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除。 当新绘制的矩形与已有图形重叠时,对图形取并集; 当新擦除的矩形与已有图形重叠时,对图形取差集。 给定一系列绘制和擦除操作,计算最终图形的面积。第一行为操作数N,接下来的N行格式为:d x1

学Java,找哪吒 835
上一篇: 自己动手写2D物理引擎-初级篇(0)
下一篇: 389找不同---位运算
ARTELE
博客等级 码龄12年 148粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值