重构物理Entity架构,支持更多的形状

news2024/12/24 21:06:24

上一节实战如何编译BEPUphysicsint源码到自己的项目, 如何整合物理引擎与Unity图形渲染。本节来从新调整设计,让物理的Entity基本操作与物理的形状分离,支持更多的物理形状,支持物理entity与Unity物体位移与旋转同步。主要分成以下3个部分:

1: 设计PhyBaseEntity,让所有具体形状的Entity都继承自它;

2: 同步物理Entity与Unity节点的位移与旋转;

3: 编写其它的形状的物理Entity;

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

PhyBaseEntity 设计

上一节课我们设计的PhyBoxEntity主要包含了两个部分,一个是Entity的物理形状的创建(这个与具体的形状有关),一个是物理Entity的基本功能,如位置,旋转同步,給Entity线性速度等。而且其它的形状的物理Entity,除了形状创建会不一样,其它基本一样,所以我们调整一下设计,把PhyBoxEntity与物理形状相关的代码放到PhyBoxEntity里面,与形状无关的物理Entity的基本功能,我们放到PhyBaseEntity里面,然后让具体的形状在扩展的时候继承PhyBaseEntity即可。合计架构如图所示:

接下来我们把上一节课的PhyBoxEntity与形状无关的数据与功能提取到PhyBaseEntity,PhyBoxEntity只保留形状相关的代码。与形状无关的数据部分:

public class PhyBaseEntity : MonoBehaviour {
    protected BEPUphysics.Entities.Entity phyEntity = null;
    protected Vector3 center = Vector3.zero;
    [SerializeField]
    protected float mass = 1;

    protected bool isTrigger = false;
    protected PhysicMaterial phyMat = null;
    
    [SerializeField]
    protected bool isStatic = false;
}

phyEntity: 用的是所有Entity形状的基类,这样可以指向不同子类的具体实例,其它数据都是物理Entity通用的,都写道PhyBaseEntity里面。

同步物理Entity与Unity节点的位移与旋转

同时PhyBaseEntity实现了物理Entity与Unity节点同步的功能增加了位置+旋转。如代码所示:

public void AddSelfToPhyWorld() { 
        if(this.phyEntity == null) {
            return;
        }

        BEPUPhyMgr.Instance.space.Add(this.phyEntity);
    }

    public void SyncPhyTransformWithUnityTransform() {
        if (this.phyEntity == null) {
            return;
        }


        // 位置
        Vector3 unityPos = this.transform.position;
        unityPos += this.center;
        this.phyEntity.position = ConversionHelper.MathConverter.Convert(unityPos);
        // end

        // 旋转
        Quaternion rot = this.transform.rotation;
        this.phyEntity.orientation = ConversionHelper.MathConverter.Convert(rot);
        // end
    }

    public void SyncUnityTransformWithPhyTransform() {
        if (this.phyEntity == null) {
            return;
        }

        // 位置
        BEPUutilities.Vector3 pos = this.phyEntity.position;
        Vector3 unityPosition = ConversionHelper.MathConverter.Convert(pos);
        unityPosition -= this.center;
        this.transform.position = unityPosition;
        // end 

        // 旋转
        BEPUutilities.Quaternion rot = this.phyEntity.orientation;
        Quaternion r = ConversionHelper.MathConverter.Convert(rot);
        this.transform.rotation = r;
        // end
    }

    // 同步物理entity的位置到transform;
    void LateUpdate() {
        if (this.phyEntity == null || this.isStatic) {
            return;
        }

        this.SyncUnityTransformWithPhyTransform();
    }

接口SyncUnityTransformWithPhyTransform: 从物理Entity同步到Unity节点

接口SyncPhyTransformWithUnityTransform: 从Unity节点同步到物理Entity

再来看调整后的PhyBoxEntity,就很简单了:

[RequireComponent(typeof(BoxCollider))]
public class PhyBoxEntity : PhyBaseEntity {
    
    void Start() {
        BoxCollider box = this.gameObject.GetComponent<BoxCollider>();
        float width = box.size.x;
        float height = box.size.y;
        float length = box.size.z;
        
        this.center = box.center;
        this.phyMat = box.material;
        this.isTrigger = box.isTrigger;


        if (this.isStatic) {
            this.phyEntity = new BEPUphysics.Entities.Prefabs.Box(BEPUutilities.Vector3.Zero, (FixMath.NET.Fix64)width, (FixMath.NET.Fix64)height, (FixMath.NET.Fix64)length);
        }
        else {
            this.phyEntity = new BEPUphysics.Entities.Prefabs.Box(BEPUutilities.Vector3.Zero, (FixMath.NET.Fix64)width, (FixMath.NET.Fix64)height, (FixMath.NET.Fix64)length, (FixMath.NET.Fix64)this.mass);
        }

        this.AddSelfToPhyWorld();
        this.SyncPhyTransformWithUnityTransform();
    }

   
}

根据BoxCollider的数据创建Box的物理Entity, 同步到Unity节点的位置与旋转,并加入到物理世界。

编写其它形状的物理Entity

经过上面的调整以后,我们就很快的编写其它的形状,比如实现PhySphereEntity,

[RequireComponent(typeof(SphereCollider))]
public class PhySphereEntity : PhyBaseEntity
{
    // Start is called before the first frame update
    void Start() {
        SphereCollider sphere = this.gameObject.GetComponent<SphereCollider>();

        float radius = sphere.radius;

        this.center = sphere.center;
        this.phyMat = sphere.material;
        this.isTrigger = sphere.isTrigger;

        if (this.isStatic) {
            this.phyEntity = new BEPUphysics.Entities.Prefabs.Sphere(BEPUutilities.Vector3.Zero, (FixMath.NET.Fix64)radius);
        }
        else {
            this.phyEntity = new BEPUphysics.Entities.Prefabs.Sphere(BEPUutilities.Vector3.Zero, (FixMath.NET.Fix64)radius, (FixMath.NET.Fix64)this.mass);
        }

        this.AddSelfToPhyWorld();
        this.SyncPhyTransformWithUnityTransform();
    }
}

继承自PhyBaseEntity,同时根据SphereCollider组件来创建形状。

后续我们要給物理Entity线性速度,角速度都把接口写到PhyBaseEntity里面。

今天的物理Entity的设计调整就到这里了,关注我们,可以获取Unity BEPUphysint3D实战源码。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学到一招!PyCharm连接MySQL竟如此简单!

在 PyCharm 中是可以通过内置的工具来连接、操作数据库的&#xff0c;并且对于市面上大多数主流数据库都是支持的。 连接 MySQL 首先打开 PyCharm &#xff0c;点击菜单栏的 View --> Tool Windows --> Database 或者直接点击 PyCharm 右侧的 Database 然后就会在 PyCh…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.6 矩形、圆角矩形

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1mg411J7u5 本节讲解如何绘制矩形、圆角矩形 1. 相关的 API 直接查看官方的帮助文档&#xff0c;可以看到有多个重载的方法用于绘制矩形、圆角矩形 1.1 矩形 // 带 F 表示参数为浮点数&#x…

【电商】电商系统---合同管理

说一下合同管理部分&#xff0c;希望对大家有帮助&#xff0c;如果大家觉得简单可以直接略过&#xff0c;谢谢&#xff01; 合同分类 合同主要分为采购类合同、销售类合同、其他合同。 采购合同和销售合同分别与采购订单和销售订单建立对应关系&#xff0c;通过采购订单和销售…

ChatGDP:人类未来世界的主宰

先简单介绍一下今天的主角——ChatGPT。 ChatGPT是一款由OpenAI开发的聊天机器人&#xff0c;它具有出色的自然语言处理能力&#xff0c;能够与人类进行真实的对话。它的核心技术是GPT-3语言模型&#xff0c;能够自动学习语言特征&#xff0c;并进行语义理解、文本生成等任务。…

HCL与Pipe、Autoit和MobaXterm的组合使用

我们平时做实验一般会用到真机或者是模拟器&#xff0c;因为我主要接触的都是一些H3C的产品和技术&#xff0c;所以模拟器用HCL会多一些。为了呈现出相对好一些的视觉效果&#xff0c;我一般会使用MobaXterm工具进行命令操作&#xff0c;所以大家看到的回显一般是这样的&#x…

哈工大视听觉信号处理——听觉部分报告——一种智能家居命令词识别系统的设计

题 目 听觉部分 专 业 软件工程 学   号 120L0219XX 班   级 2037101 姓 名 李启明 报 告 日 期 2022.12.20 一、基频 &#xff08;一&#xff…

肝了一周总结的SpringBoot常用注解大全,一目了然~

平时使用SpringBoot开发项目&#xff0c;少不了要使用到它的注解。这些注解让我们摆脱了繁琐的传统Spring XML配置&#xff0c;让我们开发项目更加高效&#xff0c;今天我们就来聊聊SpringBoot中常用的注解&#xff01; SpringBoot实战电商项目mall&#xff08;50kstar&#xf…

《c专家编程》读书笔记

《c专家编程》第一章 C&#xff1a;穿越时空的迷雾第二章 这不是Bug&#xff0c;而是语言特性gets实验第三章 分析C语言的声明const实验第四章 令人震惊的事实&#xff1a;数组和指针并不相同指针与数组实验第五章 对链接的思考简单静态库动态库实验第六章 运动的诗章&#xff…

python-(6-5-3)爬虫---修改代码

文章目录一 事件背景二 系统给的代码三 改进措施四 改进后的代码一 事件背景 本篇主要是生活分享。 公司研究了一个比较好玩的人工智能狗&#xff0c;我就想偷懒让它帮我写个代码&#xff0c;得到的漂亮小姐姐的照片&#xff0c;然后它还真的给我把代码弄出来了。 二 系统给的…

​九州一轨通过注册:计划募资6.57亿 京投公司为大股东

雷递网 雷建平 12月19日北京九州一轨环境科技股份有限公司(简称&#xff1a;“九州一轨”&#xff09;日前通过注册&#xff0c;准备在科创板上市。九州一轨计划募资6.57亿元&#xff0c;其中&#xff0c;2.79亿元用于噪声与振动综合控制产研基地建设项目&#xff0c;1.43亿元用…

[附源码]计算机毕业设计Python飞越青少儿兴趣培训机构管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

我的一周年创作纪念日

机缘 第一次写文章的时候&#xff0c;CSDN还是我平时课程设计的救星&#xff1b;第一次写文章的时候&#xff0c;还不知道有什么拿得出手、可以和大家分享的&#xff1b;第一次写文章的时候&#xff0c;幻想着自己一觉醒来就坐拥10w粉丝&#xff0c;哈哈哈。感谢自己曾经冒出的…

【实践】推荐、搜索、广告多业务多场景统一预估引擎实践与思考

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点《底层逻辑》高清配图‍基于深度学习的个性化推荐系统实时化改造与升级.pdf推荐技术在vivo互联网商业化业务中的实践.pdf推荐系统基本问题及系统优化…

元认知神经网络与在线序贯学习(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 文章包含用于实现自适应识别和控制的在线顺序学习算法、元认知神经网络和前馈神经网络的代码。这些方法也用于解决分类和时间序…

[附源码]计算机毕业设计Node.js仓库管理系统(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【docker】CMD和ENTRYPOINT的区别

1、测试cmd #编写 dockerfile 文件 [rootkuangshen docekrfile]# vim dockerfile-cmd-test FROM centos CMD ["ls","-a"] #构建镜像 [rootkuangshen dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest . #run运行&#xff0c;发现我们的ls -a …

你为什么一定要学Python?

我们为什么要学习Python&#xff1f; 在农业社会时&#xff0c;我们要学习驾驭马、驴、牛&#xff0c;让它们为我们出力、干活。 在工业社会时&#xff0c;我们要学会驾驭各种机器、火车、轮船、飞机、机床等等。 今天&#xff0c;我们要让机器听我们的指挥&#xff0c;我们就…

Python图像处理【5】图像扭曲/逆扭曲

图像扭曲/逆扭曲0. 前言1. 使用 scikit-image warp() 函数执行图像变换1.1 scikit-image warp() 函数原理1.2 利用 warp() 函数实现图像变换2. 漩涡变换详解2.1 旋涡变换原理2.2 使用 scikit-image warp() 实现旋涡变换2.3 使用 scipy.ndimage 实现漩涡变换3. 使用 scikit-imag…

3ds Max:加强型文本

3ds Max 中的加强型文本 TextPlus工具能够实现非常多的功能。在 3ds Max 中&#xff0c;加强型文本也是标准基本体。新建加强型文本后&#xff0c;可以看到其相关参数&#xff0c;在下方可以更改文本的内容外观。插值Interpolation步数Steps用来控制文本图形线段间的端点数&…

[附源码]计算机毕业设计Python高校流浪动物领养网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…