我在J2ME工作,我的gameloop执行以下操作:
public void run() {
Graphics g = this.getGraphics();
while (running) {
long diff = System.currentTimeMillis() - lastLoop;
lastLoop = System.currentTimeMillis();
input();
this.level.doLogic();
render(g, diff);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
stop(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以它只是一个基本的游戏循环,该doLogic()函数调用场景中角色的所有逻辑函数并render(g, diff)调用场景animateChar中每个角色的animChar函数,然后,Character类中的函数设置屏幕中的所有内容,如下所示:
protected void animChar(long diff) {
this.checkGravity();
this.move((int) ((diff * this.dx) / 1000), (int) ((diff * this.dy) / 1000));
if (this.acumFrame > this.framerate) {
this.nextFrame();
this.acumFrame = 0;
} else {
this.acumFrame += diff; …Run Code Online (Sandbox Code Playgroud) 我正在尝试用C++实验2D物理引擎.到目前为止,似乎最受欢迎的是Box2D.不幸的是,Box2D是一个严格的身体物理引擎,并不能真正帮助我想要尝试的东西.
我希望能够定义一个具有多个由弹簧连接的顶点的形状,这样当这个形状与刚性或其他非刚性形状碰撞时,它的形状将是灵活的.
现在我试图想办法在Box2D中只使用刚体来做这个,但似乎总有缺陷:
那么用C++做这种物理的最佳方法是什么?优选地,不必编写整个物理引擎.也许我只是错过了Box2D的一个功能.也许这不是正确的选择.那么什么是正确的选择?
重要提示:这个问题与"PhysX" 完全没有关系,"PhysX"是一个计算机游戏物理系统(对于街机游戏中的物理学有用,如球类游戏等); PhysX是Unity3D和其他游戏引擎内置的系统; PhysX在这里完全无关紧要.
////////////////////更新(先读到底部)/////////////////////
我一直在记录值并搜索确切问题的位置,我想我找到了它.我的代码中有这样的东西
Velocity += Acceleration * Time.deltaTime;
position += Velocity * Time.deltaTime;
Run Code Online (Sandbox Code Playgroud)
加速度就像0,0000000000000009 ..现在.当代码流动时,速度应该增加,浮动没有问题.但是在开始时,地球的初始位置是(0,0,23500f)你可以在我最后给出的图表中看到这一点.
那么现在当我将速度*timedelta(此时类似于0,00000000000000005)添加到23500的位置时,它基本上不会添加它.位置仍然是(0,0,23500)不像(0,0,23500.00000000000005),因此地球不移动,因此加速度不会改变.
如果我将地球的初始位置设置为0,0,0并且仍然将加速度设置为0.0000000000000000009以使其位置为(0,0,23500)然后"ADDS"速度*timedelta.它变得类似于(0,0,000000000000000000005)并且继续增加.当float为0时,添加这么小的值没有问题.但是如果浮点数类似于23500,那么它就不会增加小值.
我不知道这是完全统一的问题还是c#的漂浮.
这就是为什么我不能让它与小值一起工作.如果我能克服这一点,我的问题将得到解决.
////////////////////////////////////////////////// /////////////////////////////
我一直在开发n体植物以模拟我们的太阳系,因此我一直在收集数据以使其尽可能逼真.但是数据大小存在问题.我搜索了每一点互联网,我找不到人们如何克服这一点的单一解释.(如果是这样的话)所以我在这里尝试拍摄.
因此,为了保持行星之间的距离,半径和"质量"的比例,我创建了一个excel文件来计算所有数据.(因为有人为什么会把"地球的质量如果有"那个"半径图"在互联网上?)我将把ss作为附件.它基本上"标准化"或换句话说"缩放"行星的每个属性到给定的参考.在这种情况下,我把参考作为"地球的半径".
我团结一致,你知道,你不能在统一中使用"太大"或"太小"的价值观.所以我不得不缩小太阳能系统,"很多!"
因此,我使用牛顿万有引力定律,即F = GMm/r ^ 2,使其变得简单,我直接计算a = GM/r ^ 2,对于来自所有其他物体的给定物体.
因此,地球的"朝向太阳"的重力加速度的实际值大约是0,000006 km/s ^ 2,这在统一的工作中甚至是非常小的值,但它可以工作.然而,为了获得这个值,1我需要将地球的半径(比例)设置为6371单位,并将太阳比例设置为696,342 !,这对于将其统一起来来说太大了.
所以我说,让地球的半径为1,以统一为单位.因此,当半径改变时,一切都会改变,质量,距离......我保持行星的密度,并用新半径计算新体积的质量.所有计算都在附件中.
所以事实是,当我把地球的半径变为1时,对太阳的引力加速就像0,0000000000009那样小得可笑.当然,Unity不会使用这个值.
所以,如果我改变地球的半径,那么太阳的质量和半径变得非常大,然后再次,我无法使用它.
我不知道其他人如何解决这个问题,他们为解决这个问题做了什么,但正如我从这里看到的那样,看起来不可能对太阳系进行逼真的n体模拟.(至少统一)
所以我需要有10个代表来发布图片-_-,我会给出链接. http://berkaydursun.com/solar_system_simulator/data.PNG 另外一个目录是使用n体计算但具有UNREALISTIC值的工作实验太阳系模拟.它工作得很好,它甚至看起来有点接近真实,但不,它没有正确的比率^^你可以在这里测试它,如果你希望http://berkaydursun.com/solar_system_simulator/
编辑:WoW我几乎用"So"开始了每个段落^^
我正在制作一个涉及弹性球物理的程序.我已经计算出所有与墙壁和静止物体发生碰撞的数学计算,但我无法弄清楚当两个移动的球碰撞时会发生什么.我有质量和速度(x和y速度准确,但每个球的速度和它们的方向都会这样做)并且想要那些公式.记住 - 这是一个完全弹性的碰撞 - 所以没有旋转球等.
多年来使用各种游戏物理引擎进行开发,我注意到在同一台机器上,我观察到在运行之间的物理模拟中有很多不同的结果.最近,Unity引擎执行此操作,即使物理是按照设定的时间间隔计算的(FixedUpdate) - 据我所知,它应该完全独立于帧速率.
我之前在游戏论坛上问了这个问题,并被告知这是由于混乱运动:看到双摆.但是,如果起始条件得到精确控制,即使双摆也是确定性的,对吗?在同一台机器上,不应该浮点数学表现方式相同吗?
据我所知,有与浮点运算精度问题,但我明白这些问题(如概括这里)不上的问题,同样的硬件 -没有浮点误差还是确定性?我错过了什么?
tl; dr:如果在同一台机器上运行模拟,使用相同的浮点数学(?),模拟是否应该是确定性的?
非常感谢您的宝贵时间.
我知道这个问题肯定已经好几次解决了,如果你知道它们的存在,请赐教.谢谢.
快速简介:我想从3轴加速度计计算这3个轴中每一个的重力分量.我使用了2轴自由体图来计算出世界XZ,YZ和XY轴上的加速度计的重力分量.但是解决方案似乎略有偏差,对于极端情况只有1个加速度计轴暴露于重力时是可以接受的,但对于45度的俯仰和滚动,总的幅度大于重力(由Xa ^ 2 + Ya ^获得) 2 + Za ^ 2 = g ^ 2; Xa,Ya和Za是其X,Y和Z轴上的加速度计读数.
更多细节:该设备是Nexus One,除了3轴加速度计外,还有一个用于方位角,俯仰和滚转的磁场传感器.
在世界的轴上(Z与重力方向相同,X或Y指向北极,不要认为这很重要吗?),我认为我的设备在YZ轴上有一个间距(P),和XZ轴上的辊(R).由此我使用简单的触发得到:Sin(R)= Ax/Gxz Cos(R)= Az/Gxz Tan(R)= Ax/Az
还有另一组音高,P.
现在我将重力定义为在世界轴上有3个分量,Gxz只能在XZ轴上测量,Gyz用于YZ,Gxy用于XY轴.Gxz ^ 2 + Gyz ^ 2 + Gxy ^ 2 = 2*G ^ 2 2G是因为重力在该定义中有效地包括两次.
哦,XY轴产生更具异国情调的东西......如果需要,我会解释.
从这些方程式我得到了Az的公式,并删除了tan操作,因为我不知道如何处理tan90计算(它是无穷大?).
所以我的问题是,任何人都知道我是否正确/错误或能够指出我正确的方向?
谢谢!DVD
在平面(二维)中,路径可以由(n + 1)个点(Xo,Yo),(X1,Y1),...,(Xn,Yn)的序列表示,对于任何i (整数1 <i <n-1):
Pi(vector) = [Xi-X(i-1),Yi-Y(i-1)]
Run Code Online (Sandbox Code Playgroud)
表示第i步的是具有长度Pi的向量,并且通过转向角a(i)以代数方式(不知道如何)测量向量Pi和P(i + 1)之间的方向变化的值. .
像任何角度分布(方向变化)一样,它的特征在于平均向量,该平均向量被认为是对称的并且具有角平均值Φ= o.这种分析的方法涉及数值模拟,因为代数方法似乎太复杂,我必须使用伪随机高斯发生器从正态分布获得连续值,平均值为0,标准偏差σ(0.1- 1.2)弧度来模拟路径.
因此,在每个具有长度P(恒定,即125km)的步骤之后,方向变化的值(转向角a(i))由伪随机发生器确定给定的σ值,其沿着该值是恒定的.路径.然后向下一个方向迈出一步,依此类推.
一些有用的方程:
a(i) ~ n(0,?)
?(i+1) = ?(i) + a(i)
X(i+1) = Xi + P Cos[?(i+1)]
Y(i+1) = Yi + P Sin[?(i+1)]
Run Code Online (Sandbox Code Playgroud)
其中Θi代表第i步的方向.根据伪随机均匀发生器的均匀角度分布随机选择第一步骤Θi的方向.转动角度从-Pi到Pi记录
我怎样才能看到12个500步的路径,每个路径的特征是标准变化σ的给定值在0.1到1.2弧度范围内,连续步骤之间的方向变化分布和在Mathematica中绘制它?我对Mathematica一无所知,特别是如何为这个问题编写代码.
我正在寻找一种近似在高度图上移动的流体体积的方法.我能想到的最简单的解决方案是将其近似为大量直径小(<0.1m)的非绘制球体.然后,我会在它们停下来的位置放置一个可见的平面,代表水面"水面".据我所知,没有托管物理引擎包含内置流体模拟器,因此问题.
实现将包括使用物理引擎,如JigLibX,它能够模拟球体的运动.为了确定平面的高度,我想到平均分组顶层每个球体的最大高度.
我不希望性能很好,但实时可以接近吗?如果没有,我可以使用此模拟预先烘烤流线吗?
我希望这是有道理的,我真的希望得到关于这是否可行的意见/建议,或者是否有更好的方法来解决这个问题.
感谢任何帮助,Venatu
(如果它的相关,我的目标平台是XNA 4.0,使用C#.Windows只在这个时间点,所以PhysX/Havok是模拟的可能性,但我更喜欢托管解决方案)
我有一个封闭的凸多面体,它是由一个凸多边形(面)阵列定义的,这些多边形由三维空间中的顶点数组定义.假设密度均匀,我试图找到多面体的质心.目前我用这个伪代码中的算法计算它.
public Vector3 getCentroid() {
Vector3 centroid = (0, 0, 0);
for (face in faces) {
Vector3 point = face.centroid;
point.multiply(face.area());
centroid.add(point);
}
centroid.divide(faces.size());
return centroid;
}
Run Code Online (Sandbox Code Playgroud)
这基本上取面的质心的加权平均值.我不是100%确定这是正确的,因为我无法在线找到正确的算法.如果有人可以确认我的算法或引用我一个正确的算法我会很感激.
谢谢.
[编辑]
所以这是我用来查找质心的实际Java代码.它将多面体分解为会聚在多面体内任意点上的金字塔.金字塔质心的加权平均值基于以下公式.
C all = SUM 所有金字塔(C 金字塔*体积金字塔)/体积全部
这里是(大量注释的代码):
// Compute the average of the facial centroids.
// This gives an arbitrary point inside the polyhedron.
Vector3 avgPoint = new Vector3(0, 0, 0);
for (int i = 0; i < faces.size(); i++) {
avgPoint.add(faces.get(i).centroid); …Run Code Online (Sandbox Code Playgroud) 我正在使用JBox2D编写Java程序.我需要找到两个纹理之间的确切碰撞点,如果它们碰撞的话.
我有代码来确定是否发生了碰撞,并且显然可以调用碰撞对象ID来确定哪些纹理发生碰撞.
我似乎无法弄清楚如何抓住碰撞本身的实际坐标.我阅读了文档,但它非常复杂,并没有直接解决这个问题.
这是我的代码:
import org.jbox2d.callbacks.ContactImpulse;
import org.jbox2d.callbacks.ContactListener;
import org.jbox2d.collision.Manifold;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Fixture;
import org.jbox2d.dynamics.contacts.Contact;
public class MyContactListener implements ContactListener{
//When they start to collide
public void beginContact(Contact c) {
System.out.println("CONTACT");
Fixture fa = c.getFixtureA();
Fixture fb = c.getFixtureB();
Vec2 posA = fa.getBody().getPosition();
Vec2 posB = fb.getBody().getPosition();
}
public void endContact(Contact c) {
}
public void preSolve(Contact c, Manifold m) {}
public void postSolve(Contact c, ContactImpulse ci){}
}
Run Code Online (Sandbox Code Playgroud)