第1点,说它是(0,0),我有另一个点应该在10f的距离转过来。然后我将添加度角以使其旋转。我想知道如何计算这个转折的点......
我将使用光线投射,我需要旋转光线(顺时针)来检测碰撞
答案 0 :(得分:1)
所以你说你有point1
和point2
,两者之间的距离为10f
,其中point2
将围绕point1
旋转,你想要要知道在这种分离之间某个点上的物体是否与它们相交,如下图所示:
有一些教程可以获得在互联网上旋转另一个点的数学,例如this one,因为你无法指定Vector2
的原点,翻译版本为预览链接到java中提出的代码应该类似于:
public Vector2 rotatePoint(Vector2 center, Vector2 point, float angle) {
angle = angle * MathUtils.degreesToRadians; // Convert to radians
float rotatedX = MathUtils.cos(angle) * (point.x - center.x)
- MathUtils.sin(angle) * (point.y - center.y) + center.x;
float rotatedY = MathUtils.sin(angle) * (point.x - center.x)
+ MathUtils.cos(angle) * (point.y - center.y) + center.y;
// rotated new position:
return new Vector2(rotatedX, rotatedY);
}
至于其余的代码(对象之间的交集),我想你正在寻找RayCastCallback
接口:
// initial position
Vector2 point1 = new Vector(0, 0);
// Max lenght of view
Vector2 point2 = new Vector(0, 10);
// Position of collision if occur
final Vector2 collisionPoint = new Vector();
@Override
public void render(float delta) {
//...
point2 = rotatePoint(point1, point2, 10); // rotate 10º
// to detect if object at position point1 is seeing something
world.rayCast(new RayCastCallback(){
@Override
public float reportRayFixture(Fixture fixture, Vector2 point,
Vector2 normal, float fraction) {
// what do the object saw? -> fixture
// where do the object saw it? -> point
collisionPoint.set(point);
return 0; // <- return 0 to stop raycasting
}
}, point1, point2);
//... rotation and other stuffs...
}
reportRayFixture
的返回参数包含以下文档:
为查询中找到的每个夹具调用。您可以通过返回浮点来控制光线投射的进度:返回-1:忽略此灯具并继续返回0:终止光线投射返回分数:将光线剪切到此点返回1:不要&#39 ; t剪辑光线并继续。传递给回调的Vector2实例将被重用于将来的调用,因此请复制它们!
**重点补充。
基本上它表示您可以逐个检查所有交叉点,但如果您只关心第一个交叉点,请立即返回0。当您想知道对象是否被另一个对象阻止时,这非常有用。在这种情况下,我返回0并将point
的值复制到collisionPoint
,以便您可以对此值执行任何操作。
在this video中可以找到一个非常好的例子。
希望你觉得这很有用。
答案 1 :(得分:0)
你应该考虑使用Intersector类检查你的演员的线是否与身体形状相交。
要计算“视线”线的结束,请使用 Vector2 根据您的演员轮换旋转(这实际上是您问题的答案)
应该看起来像:
Vector2 sightVector = new Vector2(10f, 0); //the 10f is actually your sight max distance
sightVector.rotate(actor.getRotation());
...
@Override
pblic void render(float delta) //it can be also act of the actor
{
sightVector.rotate(actor.getRotation());
Vector2 endOfLine = new Vector2(actor.getX() + sightVector.x, actor.getY() + sightVector.y); //here you are calculating the end of line
Polygon bodyShape = getBodyShape( theBody ); //you should create a method that will return your body shape
if( Intersector.intersectLinePolygon(new Vector2(actor.getX(), actor.getY()), endOfLine, bodyShape) )
{
//do something
}
...
}
Intersector具有检查与圆等交点的方法,因此您的身体形状不需要是多边形