首页 > 编程语言 >en造数据结构与算法C# 群组行为优化 和 头鸟控制

en造数据结构与算法C# 群组行为优化 和 头鸟控制

时间:2024-09-20 15:23:48浏览次数:3  
标签:头鸟 alignmentForce en 群组 Vector3 separationForce zero birdNeighbors public

实现:

1.给鸟类随机播放随机动画使得每一只鸟扇翅膀的频率都不尽相同

2.可以自行添加权重,并在最后 sumForce = separationForce + cohesionForce + alignmentForce;分别乘上相应权重,这样鸟就能快速飞行和转向辣

using System.Collections.Generic;
using UnityEngine;
using System.Collections;

public class BoidsCode1 : MonoBehaviour {
    Rigidbody rb;
    //鸟群存储线性表
    public List<GameObject> birdNeighbors = new List<GameObject>();

    //separation分离  alignment对齐 cohesion凝聚
    public Vector3 separationForce = Vector3.zero;
    public Vector3 alignmentForce = Vector3.zero;
    public Vector3 cohesionForce = Vector3.zero;
    //平均位置,鸟群朝向
    public Vector3 averagePosition = Vector3.zero;
    public Vector3 birdForward = Vector3.zero;
    //鸟群速度
    public Vector3 birdVelocity = Vector3.zero;
    //总力
    public Vector3 sumForce;

    //检测间隔
    public float checkInterval = 0.2f;
    //检测距离
    public float checkDistance = 2;
    //分离力最大值
    public float maxSeparationForce = 1.0f;

    private void Awake() {
        rb = GetComponent<Rigidbody>();
    }

    private void Start() {
        InvokeRepeating("CalcForce", 0, checkInterval);
    }

    //计算函数
    private void CalcForce() {
        //清空邻居鸟的列表
        birdNeighbors.Clear();
        //检测到范围内所有的鸟
        Collider[] colliders = Physics.OverlapSphere(transform.position, checkDistance);
        foreach (Collider collider in colliders) {
            if (collider != null && collider.gameObject != this.gameObject) {
                //添加到列表里面
                birdNeighbors.Add(collider.gameObject);
            }
        }

        //平均点位置为0
        averagePosition = Vector3.zero;

        //朝向设置为0
        birdForward = Vector3.zero;
        birdVelocity = Vector3.zero;

        separationForce = Vector3.zero; //分离力重设
        cohesionForce = Vector3.zero; //凝聚力重设
        alignmentForce = Vector3.zero; //对齐力重设

        foreach (GameObject bird in birdNeighbors) {
            //设定分离力的方向
            Vector3 spForceDirection = (this.transform.position - bird.transform.position);
            if (spForceDirection.magnitude > 0) {
                separationForce += spForceDirection.normalized / spForceDirection.sqrMagnitude;
            }
            //得到鸟群位置(加起来的和)
            averagePosition += bird.transform.position;
            //得到鸟群的方向和速度
            birdForward += bird.transform.forward;
            birdVelocity += bird.GetComponent<Rigidbody>().velocity;
        }

        //限制分离力的最大值
        if (separationForce.magnitude > maxSeparationForce) {
            separationForce = separationForce.normalized * maxSeparationForce;
        }

        //计算平均位置
        if (birdNeighbors.Count > 0) {
            averagePosition /= birdNeighbors.Count;
        }

        //设定凝聚力的方向
        Vector3 cohesionDirection = (averagePosition - transform.position).normalized;
        if (cohesionDirection.magnitude > 0) {
            cohesionForce += cohesionDirection;
        }

        //求取平均速度
        if (birdNeighbors.Count > 0) {
            alignmentForce = birdVelocity / birdNeighbors.Count;
        }

        施加分离力
        //rb.AddForce(separationForce, ForceMode.VelocityChange);
        施加凝聚力
        //rb.AddForce(cohesionForce, ForceMode.VelocityChange);
        施加对齐力
        //rb.AddForce(alignmentForce, ForceMode.VelocityChange);
        sumForce = separationForce + cohesionForce + alignmentForce;
     
        rb.AddForce(sumForce,ForceMode.Force);
        // 仅当当前鸟不是头鸟时,才设置朝向
        if (birdForward.magnitude > 0 && !gameObject.CompareTag("Leader")) {
            this.transform.forward = birdForward.normalized;
        }
        给予一只鸟速度平均速度
        //if (alignmentForce.magnitude > 0) {
        //    this.GetComponent<Rigidbody>().velocity = alignmentForce;
        //}
    }
}

标签:头鸟,alignmentForce,en,群组,Vector3,separationForce,zero,birdNeighbors,public
From: https://blog.csdn.net/2301_77947509/article/details/142364737

相关文章

  • xtop:multi_driven_net与incomplete_timing_cell fail reason 分析
    我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口xtop做时序收敛时报告failreason&#x......
  • torch.distributed.DistNetworkError: The server socket has failed to listen on an
    解决方案是在torchrun中添加参数--master_port改变masterport。且注意这个参数一定要加在要跑的文件即src/entry_point/train.py之前,否则会被忽略。引用:https://juejin.cn/post/7260668104752775228我的代码是:torchrun--nproc_per_node1--master_port29501-mtraining.......
  • 携手阿里云CEN:共创SD-WAN融合广域网
    2024云栖大会在9月19日举行的阿里云云栖大会上,犀思云作为SD-WAN领域的杰出代表及阿里云的SD-WAN重要合作伙伴,携手阿里云共同推出了创新的企业上云方案——FusionWAN智连阿里云解决方案。这一创新方案不仅彰显了犀思云在SD-WAN技术领域的深厚积累,更体现了双方在推动企业数字化转型......
  • 香橙派5Pro+虚拟机Ubuntu18.04交叉编译+Opencv4.7
    1.基础工具安装①Ubuntu虚拟机下交叉编译工具链安装香橙派5Pro为Arm64位架构,因此需要安装g++-aarch64-linux-gnu以及gcc-aarch64-linux-gnu(有其它交叉编译器,本文以此编译器为例)更新软件源sudoaptupdatesudoaptupgrate点击查看交叉编译工具链安装apt-cachesearcha......
  • RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体
    RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验1.RAGflow简介最近更新:2024-09-13增加知识库问答搜索模式。2024-09-09在Agent中加入医疗问诊模板。2024-08-22支持用RAG技术实现从自然语言到SQL语句的转换。2024-08-02支持Gr......
  • 兼收并蓄 TypeScript - 类: generics
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-类:generics示例如下:class\generics.ts{//Generics-泛型//泛型的简单示例functioncreateArray<T>(length:number,value:T):Array<T>{letresu......
  • 兼收并蓄 TypeScript - 进阶: iterator, generator
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-进阶:iterator,generator示例如下:advanced\iterator_generator.ts{/***iterator-迭代器(可迭代对象有Array,TypedArray,Map,Set,String)*next()-迭代到......
  • 图像生成大模型imagen
    Imagen是由谷歌研究团队开发的一种先进的图像生成大模型。它基于文本描述生成高质量的图像,是人工智能在生成视觉内容方面的一大突破。Imagen的主要特点包括:1.高分辨率和高质量:Imagen生成的图像具有高分辨率和高质量,细节丰富,能够准确反映输入文本的描述。2.多样性:能够生......
  • 兼收并蓄 TypeScript - 类: enum
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-类:enum示例如下:class\enum.ts{//简单枚举enumStatus{ok,error};console.log(Status["ok"],Status["error"]);//01console.log(Status[0],Status......
  • 高效数据移动指南 | 如何快速实现数据库 Oracle 到 Dameng 的数据同步?
    在现代企业中,数据无处不在,贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同,还是实时应用的数据同步,数据的一致性和及时性都至关重要。在数字化转型的过程中,如何确保不同系统、地域、设备之间的数据同步,成为了企业面临的重要挑战。本专题将基于实践经验,从......