在Unity3D中,如何使相互吸引的对象不会被遗忘?

在Unity3D中,如何使相互吸引的对象不会被遗忘?,unity3d,game-physics,hololens,mesh-collider,Unity3d,Game Physics,Hololens,Mesh Collider,所以我正试图制作一个程序,让一个区域内的小行星相互吸引,就像这样: 我有两个程序,一个随机生成小行星,另一个对每个物体施加重力。问题是,小行星越靠近,速度越快,直到达到弹速,施加的力使它们相互射出并消失。有没有办法让他们在接触时消除力量。我试过Rigidbody.is运动学,但这使得小行星仍然旋转,而不是像在太空中那样旋转。我会在下面发布代码,但下面是我使用的两个项目的代码。 小行星产卵器代码。我在随机比例生成器中添加了: using System.Collections; using Sy

所以我正试图制作一个程序,让一个区域内的小行星相互吸引,就像这样:

我有两个程序,一个随机生成小行星,另一个对每个物体施加重力。问题是,小行星越靠近,速度越快,直到达到弹速,施加的力使它们相互射出并消失。有没有办法让他们在接触时消除力量。我试过Rigidbody.is运动学,但这使得小行星仍然旋转,而不是像在太空中那样旋转。我会在下面发布代码,但下面是我使用的两个项目的代码。

小行星产卵器代码。我在随机比例生成器中添加了:

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

public class AsteroidFieldGenerator : MonoBehaviour
{
public Transform AsteroidPrefab;
public int fieldRadius = 50;
public int asteroidCount = 60;
public float SizeMinPercent = 1;
public float SizeMaxPercent = 100;
// Start is called before the first frame update
void Start()
{
    for (int loop = 0; loop < asteroidCount; loop++)
    {
        Instantiate(AsteroidPrefab, Random.insideUnitSphere * fieldRadius, Quaternion.identity);
        AsteroidPrefab.transform.localScale = Vector3.one * (Random.Range(SizeMinPercent, SizeMaxPercent) / 100);
    }

}

// Update is called once per frame
void Update()
{

}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类生成器:单行为
{
公共预制;
公共int fieldRadius=50;
公共计数=60;
公众持股比例=1;
公共浮动大小百分比=100;
//在第一帧更新之前调用Start
void Start()
{
for(int-loop=0;loop
应用重力的程序:

'''

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类吸引子:单行为
{
常数浮点G=667.4f;
公共静态列表吸引子;
公共刚体;
void FixedUpdate()
{
foreach(吸引子中的吸引子)
{
if(吸引子!=此)
吸引(吸引子);
}
}
void OnEnable()
{
if(吸引子==null)
吸引子=新列表();
吸引子。添加(此);
}
无效可禁用()
{
吸引子。移除(这个);
}
空洞吸引(吸引子对象)
{
刚体rbToAttract=objToAttract.rb;
矢量3方向=rb.position-rb到牵引位置;
浮动距离=方向。大小;
如果(距离==0f)
返回;
浮动力幅值=G*(径向质量*径向牵引质量)/数学功率(距离,2);
矢量3力=方向。归一化*力大小;
如果(距离==0)
力=力*0;
rbToAttract.AddForce(强制力);
}
}
''

你必须施加阻尼(阻力)力,类似于大气阻力(空气阻力)。然后系统的总能量将减少,这使得粒子更可能聚集在一起。所以基本上,运动方程应该是

F_grv[i,j,:] = G*mj*mi * (x[j,:] - x[i,:]) / norm(x[i,:] - x[j,:])^3 
F_res[i,j,:] = - R( norm(x[i,:] - x[j,:]) ) * norm(v[i,:])^a * v[i,:] 

R(u) = non-negative function that rapidly decreases when u goes away from 0, 
       and increasing rapidly when u gets very close to 0.
a is some positive number, say 1 or 2 or more. 

dx[i,:]/dt = v[i,:]
dv[i,:]/dt = (1/mi) * sum(F_grv[i,j,:] + F_res[i,j] for j=1:n)
下面是一个matlab代码,用于一个粒子绕着重心旋转,标准牛顿引力作用在其上,加上与速度相关的阻尼力:

功能重力_阻尼()
t=0;
x0=[5;1];
x_start=[-1;10];
v_start=[0.15;0.];
x=x_开始;
v=v_开始;
h=0.3;
n=700;
k0=7;
λ=2;
power1=10;
power2=2;
等等
网格化
轴([-78-312])
图(x0(1),x0(2),‘ro’;
对于k=1:n
t=t+h;
x=x+h*v/2;
v=v+h*F_grv(x-x0,1,1)+h*F_res(x-x0,v,k0,lambda,power1,power2);
x=x+h*v/2;
地块(x(1),x(2),‘bo’;
暂停(0.1)
结束
结束
函数dvdt=F_grv(x_x0,质量,gr_const)
dvdt=-gr_const*mass*(x_x0)/norm(x_x0)^3;
结束
函数dvdt=F_res(x_x0,v,k0,a,power1,power2)
dvdt=-(k_res(norm(x_x0),k0,a,power1)*norm(v)^power2)*v;
结束
函数系数=k_res(u,k0,a,幂)
系数=k0/(1+(a*u)^(功率));
结束
必须施加阻尼(阻力)力,类似于大气阻力(空气阻力)。然后系统的总能量将减少,这使得粒子更可能聚集在一起。所以基本上,运动方程应该是

F_grv[i,j,:] = G*mj*mi * (x[j,:] - x[i,:]) / norm(x[i,:] - x[j,:])^3 
F_res[i,j,:] = - R( norm(x[i,:] - x[j,:]) ) * norm(v[i,:])^a * v[i,:] 

R(u) = non-negative function that rapidly decreases when u goes away from 0, 
       and increasing rapidly when u gets very close to 0.
a is some positive number, say 1 or 2 or more. 

dx[i,:]/dt = v[i,:]
dv[i,:]/dt = (1/mi) * sum(F_grv[i,j,:] + F_res[i,j] for j=1:n)
下面是一个matlab代码,用于一个粒子绕着重心旋转,标准牛顿引力作用在其上,加上与速度相关的阻尼力:

功能重力_阻尼()
t=0;
x0=[5;1];
x_start=[-1;10];
v_start=[0.15;0.];
x=x_开始;
v=v_开始;
h=0.3;
n=700;
k0=7;
λ=2;
power1=10;
power2=2;
等等
网格化
轴([-78-312])
图(x0(1),x0(2),‘ro’;
对于k=1:n
t=t+h;
x=x+h*v/2;
v=v+h*F_grv(x-x0,1,1)+h*F_res(x-x0,v,k0,lambda,power1,power2);
x=x+h*v/2;
地块(x(1),x(2),‘bo’;
暂停(0.1)
结束
结束
函数dvdt=F_grv(x_x0,质量,gr_const)
dvdt=-gr_const*mass*(x_x0)/norm(x_x0)^3;
结束
函数dvdt=F_res(x_x0,v,k0,a,power1,power2)
dvdt=-(k_res(norm(x_x0),k0,a,power1)*norm(v)^power2)*v;
结束
函数系数=k_res(u,k0,a,幂)
系数=k0/(1+(a*u)^(功率));
结束

您可以使用
OnCollisionCenter
来检测它们何时击中。然后确定两者之间的点积,以确定它们应该飞离的角度,然后应用正确的力。不要让我使用这个-你可以使用
OnCollisionCenter
来检测它们何时击中。然后确定两者之间的点积,以确定它们应该飞离的角度,然后应用正确的力。别叫我用这个-