太阳系模拟器物理集成问题(虚幻引擎4,C+;+;) 所以我用C++ C++在一个大学项目中制作了这个非真实引擎4的太阳系模拟器,但是,我是C++和UE4的新手,我数学很差,所以我需要一些帮助。我现在想用Euler积分器来获得一些基本的物理知识,让月球绕地球运行,然后继续使用Velocity Verlet方法,以这种方式构建整个太阳系。然而,到目前为止,即使是欧拉积分也不起作用。这是Moon.cpp中的代码 //Declare the masses float MMass = 109.456; float EMass = 1845.833; //New velocities float NewMVelX = 0.0; float NewMVelY = 0.0; float NewMVelZ = 0.0; //Distance float DistanceX = 0.0; float DistanceY = 0.0; float DistanceZ = 0.0; //Earth's velocity float EVelocityX = 0.0; float EVelocityY = 0.0; float EVelocityZ = 0.0; //Moon's base velocity float MVelocityX = 0.1; float MVelocityY = 0.0; float MVelocityZ = 0.0; //Moon's acceleration float MForceX = 0.0; float MForceY = 0.0; float MForceZ = 0.0; //New position float MPositionX = 0.0; float MPositionY = 0.0; float MPositionZ = 0.0; // Called every frame void AMoon::Tick(float DeltaTime) { Super::Tick(DeltaTime); //Get Earth Location FVector EPosition = FVector(0.0, 0.0, 0.0); //Get Moon Location FVector MPosition = GetActorLocation(); //Get the distance between the 2 bodies DistanceX = (MPosition.X - EPosition.X) / 100; DistanceY = (MPosition.Y - EPosition.Y) / 100; //DistanceZ = MPosition.Z - EPosition.Z / 100; //Get the acceleration/force for every axis MForceX = G * MMass * EMass / (DistanceX * DistanceX); MForceY = G * MMass * EMass / (DistanceY * DistanceY); //MForceZ = G * MMass * EMass / (DistanceZ * DistanceZ); //Get the new velocity NewMVelX = MVelocityX + MForceX; NewMVelY = MVelocityY + MForceY; //NewMVelZ = MVelocityZ + MForceZ * DeltaTime; //Get the new location MPositionX = (MPosition.X) + NewMVelX; MPositionY = (MPosition.Y) + NewMVelY; //MPositionZ = MPosition.Z * (MVelocityZ + NewMVelZ) * 0.5 * DeltaTime; //Set the new velocity on the old one MVelocityX = NewMVelX; MVelocityY = NewMVelY; //MVelocityZ = NewMVelZ; //Assign the new location FVector NewMPosition = FVector(MPositionX, MPositionY, MPositionZ); //Set the new location SetActorLocation(NewMPosition); }

太阳系模拟器物理集成问题(虚幻引擎4,C+;+;) 所以我用C++ C++在一个大学项目中制作了这个非真实引擎4的太阳系模拟器,但是,我是C++和UE4的新手,我数学很差,所以我需要一些帮助。我现在想用Euler积分器来获得一些基本的物理知识,让月球绕地球运行,然后继续使用Velocity Verlet方法,以这种方式构建整个太阳系。然而,到目前为止,即使是欧拉积分也不起作用。这是Moon.cpp中的代码 //Declare the masses float MMass = 109.456; float EMass = 1845.833; //New velocities float NewMVelX = 0.0; float NewMVelY = 0.0; float NewMVelZ = 0.0; //Distance float DistanceX = 0.0; float DistanceY = 0.0; float DistanceZ = 0.0; //Earth's velocity float EVelocityX = 0.0; float EVelocityY = 0.0; float EVelocityZ = 0.0; //Moon's base velocity float MVelocityX = 0.1; float MVelocityY = 0.0; float MVelocityZ = 0.0; //Moon's acceleration float MForceX = 0.0; float MForceY = 0.0; float MForceZ = 0.0; //New position float MPositionX = 0.0; float MPositionY = 0.0; float MPositionZ = 0.0; // Called every frame void AMoon::Tick(float DeltaTime) { Super::Tick(DeltaTime); //Get Earth Location FVector EPosition = FVector(0.0, 0.0, 0.0); //Get Moon Location FVector MPosition = GetActorLocation(); //Get the distance between the 2 bodies DistanceX = (MPosition.X - EPosition.X) / 100; DistanceY = (MPosition.Y - EPosition.Y) / 100; //DistanceZ = MPosition.Z - EPosition.Z / 100; //Get the acceleration/force for every axis MForceX = G * MMass * EMass / (DistanceX * DistanceX); MForceY = G * MMass * EMass / (DistanceY * DistanceY); //MForceZ = G * MMass * EMass / (DistanceZ * DistanceZ); //Get the new velocity NewMVelX = MVelocityX + MForceX; NewMVelY = MVelocityY + MForceY; //NewMVelZ = MVelocityZ + MForceZ * DeltaTime; //Get the new location MPositionX = (MPosition.X) + NewMVelX; MPositionY = (MPosition.Y) + NewMVelY; //MPositionZ = MPosition.Z * (MVelocityZ + NewMVelZ) * 0.5 * DeltaTime; //Set the new velocity on the old one MVelocityX = NewMVelX; MVelocityY = NewMVelY; //MVelocityZ = NewMVelZ; //Assign the new location FVector NewMPosition = FVector(MPositionX, MPositionY, MPositionZ); //Set the new location SetActorLocation(NewMPosition); },c++,math,physics,astronomy,orbital-mechanics,C++,Math,Physics,Astronomy,Orbital Mechanics,这些值可能不正确,我只是在进行测试。我根据谷歌和多个网站上的不同信息编写了这段代码,但在这一点上我很困惑。现在发生的是,月球只是开始朝一个方向运行,而且从未停止过。我知道我的问题是地球的力/加速度/实际重力,它应该拉着月球,而不是把它推开。但不管怎样,如果有人知道我做错了什么,我会非常感激你能说些什么!感谢力取决于欧几里德旋转不变距离。因此使用 distance = sqrt(distanceX²+distanceY²+distanceZ²) force = - G*Emass*Mmass/d

这些值可能不正确,我只是在进行测试。我根据谷歌和多个网站上的不同信息编写了这段代码,但在这一点上我很困惑。现在发生的是,月球只是开始朝一个方向运行,而且从未停止过。我知道我的问题是地球的力/加速度/实际重力,它应该拉着月球,而不是把它推开。但不管怎样,如果有人知道我做错了什么,我会非常感激你能说些什么!感谢

力取决于欧几里德旋转不变距离。因此使用

distance = sqrt(distanceX²+distanceY²+distanceZ²)

force = - G*Emass*Mmass/distance²

forceX = force * X/distance
forceY = force * Y/distance
forceZ = force * Z/distance
速度的时间步进也是错误的,应该是错误的

velocityX += forceX/Mmass * deltaTime
velocityY += forceY/Mmass * deltaTime
velocityZ += forceZ/Mmass * deltaTime
当然,位置更新也包含时间步长

positionX += velocityX * deltaTime
....
看,这里的问题和你的非常相似。顺便说一句,我会将
/100
更改为
/100.0
/100.0f
,只是为了感觉更好,因为有些编译器将此类操作转换为整数。。。