Articles of 物理

可视化BoxCast

我试图find一种方式来可视化,并从编辑器编辑Physics2D.BoxCast。 我写了下面的方法来可视化BoxCast,并在编辑器中进行编辑: public Rect Box; private void OnDrawGizmos() { Gizmos.color = Color.magenta; Gizmos.matrix = Matrix4x4.TRS(transform.position + (Vector3) Box.position, transform.rotation, Vector3.one); Gizmos.DrawWireCube(Vector2.zero, Box.size); } private void Update() { var hits = Physics2D.BoxCastAll(transform.position + (Vector3) Box.position, Box.size, transform.eulerAngles.z, Vector2.right, 0, 1 << LayerMask.NameToLayer("Player")); foreach (var hit in hits) Debug.Log(hit.transform.name); } 它工作正常,但是当我编辑对象旋转时,我得到这个问题: http : //imgur.com/a/mjgXE 我可以很容易地修复它,只是把transform.position,而不是transform.position +(Vector3)Box.Position。 但是如果我这样做,我将无法编辑Raycast的位置。 […]

解决球体碰撞之间的旋转问题

我开发了一个碰撞检测器来返回碰撞数据,如碰撞正常,碰撞点,相互穿透等。 现在我正在开发一个碰撞求解器。 碰撞求解器正确计算碰撞后的线性运动,但不能计算碰撞后的旋转。 这是解决问题的图像 为了计算碰撞后的速度,我给每个物体施加一个impulse ,这个脉冲能够正确计算线性运动。 现在,要计算旋转变化,我需要应用下面的公式 ImpulsiveTorque = RelativePoint.cross(Impulse); RotationChange = InverseInertiaTensorWorld.transform(ImpulsiveTorque); 问题是ImpulsiveTorque很小,以产生可见的旋转变化。 以下对应于我的球形球碰撞检测器 sphereAndSphere : function(one, two){ var oneToTwo = one.position.sub(two.position); var oneToTwoLength = oneToTwo.length(); if (oneToTwoLength < 0 || oneToTwoLength > one.radius + two.radius){ return -1; } var normal = oneToTwo.divideByScalar(oneToTwoLength); var data = new Collision(); data.normal = normal; data.point = one.position.add(oneToTwo.multiplyByScalar(0.5)); […]

多边形圆碰撞algorithm不起作用

编辑:更新的代码和video 我一直在研究我的碰撞检测系统的最后一个部分 – 多边形 – 圆形碰撞方法。 我几乎在那里,但有一些小问题,似乎popup与它。 我将解释我所看到的一些事情,但是看下面这个简短的video可能更容易: https://1drv.ms/v/s!AjUDP95TjAMqje8AVA0LpPfeszVYoA 有三件事我看到: 当坡度下降的时候有一点颠簸(我猜我只需要平滑一点运动调整 在绕过某些角落时,调整距离得到错误计算,结果是: 一点多余的距离 大量的多余的距离 下面是我的代码的主要组成部分,很高兴更新post,并添加任何其他相关的代码块,使需要。 任何援助与此将不胜感激。 谢谢! 物理世界更新方法: IEnumerable<PhysicsFixtureBase> results = this.physicsTree.Query(fixture); foreach (PhysicsFixtureBase otherFixture in results) { Vector3 adjustment = Vector3.Zero; if (fixture.Body != otherFixture.Body && fixture.Intersects(otherFixture, out adjustment)) { this.OnContact(fixture, otherFixture); body.SetVelocity(Vector3.Zero); body.MovePosition3D(adjustment); } } 主要交叉点方法: public static bool Intersects(PhysicsCircleFixture circle, PhysicsPolygonFixture otherPolygon, […]

我的deltatime有什么问题?

我有这个简单的结构,应该计算2帧之间的时间差异: struct Clock { public: Clock() {}; ~Clock() {}; double CalculateDifference() { previousFrame = currentFrame; currentFrame = SDL_GetPerformanceCounter(); deltaTime = (double)((currentFrame – previousFrame) * 1000 / SDL_GetPerformanceFrequency()); return deltaTime; } private: uint64_t currentFrame = SDL_GetPerformanceCounter(); uint64_t previousFrame = 0; double deltaTime = 0.0; }; 这就是我在游戏循环中使用它的方式: DeltaTime = clock.CalculateDifference() * 0.001; // *0.001 to convert from […]

Raycast没有碰撞对撞机

我在一个立方体上有一个胶囊的简单的raycast: bool hit = Physics.Raycast (transform.position, Vector3.down, jumpSettings.groundJumpDistanceCheck, jumpSettings.layerMask); print(hit); 当我的layerMask是8(terrain)时,我已经在我的cube上设置了我的图层,我的groundJumpDistanceCheck是2.然后我的hit是false 。 当我的groundJumpDistanceCheck设置为无穷大。 然后我的hit仍然是错误的 。 但是,当我删除距离参数: bool hit = Physics.Raycast (transform.position, Vector3.down, /* jumpSettings.groundJumpDistanceCheck, */ jumpSettings.layerMask); print(hit); 然后hit返回true 。 这对我来说很奇怪,据我所知,当你排除距离参数时,默认情况下应该是无穷大。 但是当我明确地把Infinity当作距离的时候,它返回false 。 我也使用下面的代码试图debugging我的问题,使用所需的距离2f Debug.DrawRay(transform.position, Vector3.down * jumpSettings.groundJumpDistanceCheck, Color.red, 60f); 正如你所看到的那样,射线确实拦截了立方体。 我需要reycast返回真正的距离2f 。

IntersectMovingAABBAABB奇怪的行为

我正在使用“ Realtime Collision Detection ”一书中的IntersectMovingAABBAABB实现,我遇到了一些问题。 当我有两个相邻的AABB(不接触),A是静止的,B在上下移动时,我得到的结果是有碰撞。 显然这是错误的。 _______ _______ | | | | | A | | B | B moving up/down |_______| |_______| 我已经多次重新检查过我的代码,以确保我拥有与本书中相同的内容。 通过代码,我意识到,当直线向上或向下移动时,对于X或Z轴, v[i] < 0和v[i] > 0永远不会是真的。 因此,不会检查这些轴上的交点。 我发现这很奇怪,我想知道我是否错过了一些东西,或者这个代码简直太糟糕了。 这里是我的实现供参考: public static bool IntersectMovingAABBAABB(AABB a, AABB b, Vector3 va, Vector3 vb, out float first, out float last, out BlockFace face) { […]

预测施加力时刚体的path

我正在用某种迷你高尔夫游戏来学习3D游戏开发。 到目前为止,它运行良好:我有一个球体,我正在使用它的AddForce上的RigidBody以期望的方向启动它。 我想添加的一个function是显示预测线的预测线,预测球的轨迹。 就像告诉玩家,如果他使用这个方向和这个力量,球就会沿着这条路线,在这里碰撞,反弹,并最终在那里等等。 我知道如何使用线条渲染器,但我不知道如何计算从中绘制线条的点的数组。 它必须实时更新,玩家可以随时快速改变潜在的方向和力量 – 必须考虑到有各种不同的物体的摩擦/摩擦等。 这似乎很多工作。 唯一发生在我身上的是使用虚拟的不可见的球,这些球将会使用潜在的方向/力量不断的发射,然后logging他们的路线,但是我需要找出一些办法让他们“更快地移动”,这样我就可以立即获得点数组。 什么是我最好的办法呢?

在Phaser中旋转一组物体

我想制作一个游戏,让敌人产卵,飞向玩家的船只,并坚持到一边。 玩家可以旋转船只,卡住的敌人将随之旋转。 现在我有这个工作的方式,船和敌人都是一个群体和碰撞组的一部分, 当一个敌人与这艘船相撞时,它将离开它的旧群和碰撞群并join这艘船。 玩家随后可以旋转船队,包括卡住的敌人。 但从那里,事情变得怪异。 如果将船舶向左旋转90度,然后将敌人粘到其右边缘,则敌人消失并出现在船的顶部边缘。 试着将另一个敌人粘到右边的同一点上,然后它也会传送到圆圈的顶部,与那里的敌人相撞。 另外,被“卡住”的敌人不会与那些没有的敌人相撞。 如果我把所有东西都移动到一个碰撞组中,旋转船上的敌人就会在屏幕上reflection,而不是在物理上reflection。 你可以绕着你所喜欢的方向旋转这艘船,附着在它上面的敌人会围绕它旋转,但是没有被卡住的敌人就好像它们没有移动一样。 我怎样才能让一组物理团体像一个身体一样旋转,并与游戏世界中的其他物体发生碰撞? 代码在下面; 在这里尝试一下 。 var game = new Phaser.Game("100%", "100%", Phaser.AUTO, '', { preload: preload, create: create, update: update, render: render }); var debug = false; var ship, enemy, enemies, shipCollisionGroup, enemyCollisionGroup, spawnEnemy; function preload() { game.load.image('ship', 'simple-ship.svg'); game.load.image('enemy', 'square-enemy.svg'); } function create() { […]

只在一个轴上减去速度

我真的很慢摄取这​​个! 我有一个刚体的游戏对象。 现在我通过添加一个速度添加到y轴。 但之后,我想把它归零。 但是,如何? 我的问题是,我也使用速度来指导我的游戏对象 using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class PlayerController : MonoBehaviour { [Header("Movement")] [SerializeField] private float speed; [SerializeField] private float steeringPower; [SerializeField] private float jumpHeigt; [Header("Physics")] [SerializeField] private float gravity; private Rigidbody rigid; void Start () { rigid = GetComponent<Rigidbody> (); } void Update () { if (Input.GetKeyDown(KeyCode.UpArrow)) […]

旋转方向

我无法理解,在我施加力量之后,我应该旋转我的物体的哪个方向(顺时针或逆时针)。 所以,我有矩形ABCD(A(1,1); B(-1,1); C(-1,-1); D(1,-1)),并且我施加力V(1,1)到顶点D.当然它应该逆时针旋转,但是我应该用什么样的algorithm来定义它呢? 我认为我已经定义了对象速度和方向,旋转速度,但是我不能用方向来处理。