使用Orca查看MSI安装包

样本信息:https://app.any.run/tasks/c1d2b5ec-ac4d-4394-929f-181a93316892/

Orca是Windows SDK自带的一个MSI安装包解析工具,默认没有安装,需要手动安装一下,安装包在SDK的目录下C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\Orca.Msi

在这里插入图片描述

在这里插入图片描述

ORCA算法是一种用于多智能体路径规划的算法,它可以避免智能体之间的碰撞。在Unity中,可以使用Dots框架来实现ORCA算法。 首先,需要在Unity中安装Dots框架并创建一个新的Dots项目。然后,在项目中创建一个新的C#脚本,命名为“ORCA.cs”。 在ORCA类中,我们需要定义一些变量来存储智能体的位置、速度和半径等信息。以下是一个示例变量列表: ``` public struct Agent { public float2 position; public float2 velocity; public float radius; } public Agent[] agents; ``` 接下来,我们需要实现ORCA算法的主要逻辑。我们首先需要计算每个智能体的速度障碍物,这些速度障碍物可以帮助我们避免碰撞。以下是一个示例函数: ``` private void ComputeVelocityObstacles() { for (int i = 0; i < agents.Length; i++) { for (int j = 0; j < agents.Length; j++) { if (i == j) continue; float2 relativePosition = agents[j].position - agents[i].position; float2 relativeVelocity = agents[i].velocity - agents[j].velocity; float radiusSum = agents[i].radius + agents[j].radius; float s = relativePosition.dot(relativeVelocity) / relativeVelocity.LengthSquared; float squaredDistance = relativePosition.LengthSquared - s * s; float radiusSquared = radiusSum * radiusSum; if (s < 0 && squaredDistance > radiusSquared) { // No collision is possible continue; } float2 w = relativeVelocity - s * relativePosition / relativePosition.Length; float wLengthSquared = w.LengthSquared; float dotProduct = w.dot(relativePosition); if (dotProduct < 0 && dotProduct * dotProduct > radiusSquared * wLengthSquared) { // No collision is possible continue; } float leg = Mathf.Sqrt(wLengthSquared - radiusSquared); float2 velocityObstacle1 = (leg * relativePosition - radiusSquared * w) / wLengthSquared; float2 velocityObstacle2 = (-leg * relativePosition - radiusSquared * w) / wLengthSquared; agents[i].velocityObstacles.Add(velocityObstacle1); agents[i].velocityObstacles.Add(velocityObstacle2); } } } ``` 在计算完每个智能体的速度障碍物后,我们需要使用这些障碍物来计算每个智能体的新速度。以下是一个示例函数: ``` private void ComputeNewVelocities() { for (int i = 0; i < agents.Length; i++) { float2 preferredVelocity = agents[i].preferredVelocity; float2 obstacleVelocity = float2.zero; for (int j = 0; j < agents[i].velocityObstacles.Count; j++) { if (agents[i].velocityObstacles[j].dot(preferredVelocity - agents[i].velocityObstacles[j]) > 0) { obstacleVelocity += agents[i].velocityObstacles[j]; } } agents[i].velocity = preferredVelocity + obstacleVelocity; } } ``` 最后,我们需要在Update函数中调用这些函数来更新每个智能体的速度和位置。以下是一个示例Update函数: ``` void Update() { ComputeVelocityObstacles(); ComputeNewVelocities(); for (int i = 0; i < agents.Length; i++) { agents[i].position += agents[i].velocity * Time.deltaTime; } } ``` 以上是一个基本的ORCA算法实现,你可以根据自己的需求对其进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值