Math 围绕栅格旋转矩形以计算视图

Math 围绕栅格旋转矩形以计算视图,math,rotation,trigonometry,game-development,cartesian,Math,Rotation,Trigonometry,Game Development,Cartesian,我有一个玩家可以在二维笛卡尔网格上旋转和移动,我需要计算在屏幕上画敌人的位置 玩家应该有一个特定的视角,即玩家面对的方向前方屏幕的大小。(还有一点落后) 我尝试了很多方法来实现这一点,但我没能解决在屏幕上计算敌人应该被吸引到哪里的问题 问题最好以图形的形式表示,绿色是视点,它是一个可以绕网格旋转和移动的矩形,点代表玩家和敌人 所以我需要计算出敌人在屏幕上相对于玩家旋转和位置的位置。如果你想要一个类似厄运的视角,你应该把观察区域想象成一个平行四边形,而不是一个矩形。想象一下,在你的角色背后是一个

我有一个玩家可以在二维笛卡尔网格上旋转和移动,我需要计算在屏幕上画敌人的位置

玩家应该有一个特定的视角,即玩家面对的方向前方屏幕的大小。(还有一点落后)

我尝试了很多方法来实现这一点,但我没能解决在屏幕上计算敌人应该被吸引到哪里的问题

问题最好以图形的形式表示,绿色是视点,它是一个可以绕网格旋转和移动的矩形,点代表玩家和敌人


所以我需要计算出敌人在屏幕上相对于玩家旋转和位置的位置。

如果你想要一个类似厄运的视角,你应该把观察区域想象成一个平行四边形,而不是一个矩形。想象一下,在你的角色背后是一个有自己位置和角度的摄影师

敌人的屏幕位置与摄像机和敌人之间的角度有关

//indicates where on the screen an enemy should be drawn.
//-1 represents the leftmost part of the screen, 
//and 1 is the rightmost.
//Anything larger or smaller is off the edge of the screen and should not be drawn.
float calculateXPosition(camera, enemy){
    //the camera man can see anything 30 degrees to the left or right of its line of sight. 
    //This number is arbitrary; adjust to your own tastes.
    frustumWidth = 60;

    //the angle between the enemy and the camera, in relation to the x axis.
    angle = atan2(enemy.y - camera.y, enemy.x - camera.x);

    //the angle of the enemy, in relation to the camera's line of sight. If the enemy is on-camera, this should be less than frustumWidth/2.
    objectiveAngle = camera.angle - angle;

    //scale down from [-frustumWidth/2, frustumWidth/2] to [-1, 1]
    return objectiveAngle / (frustrumWidth / 2);
}
这些图表显示了我在这里使用的变量所代表的内容:

角度“>

一旦你的“X位置”在[-1,1]范围内,就可以很容易地将其转换为像素坐标。例如,如果你的屏幕有500像素宽,你可以做类似于
((相机,敌人)+1)/2)*500;

编辑:

根据点的高度和与摄影机的距离,可以执行类似的操作来查找点的y坐标。 (我不确定你应该如何定义敌人和摄像机的高度——只要它们在某种程度上与笛卡尔网格的x和y维度设置的比例相匹配,任何数字都可以。)

您可以调用该方法两次,以确定敌人顶部和底部的y位置:

distanceFromCamera = sqrt((enemy.x - camera.x)^2 + (enemy.y - camera.y)^2);
topBoundary = convertToPixels(getYPosition(enemy.height, camera.height, distanceFromCamera));
bottomBoundary = convertToPixels(getYPosition(0, camera.height, distanceFromCamera));
这将给你足够的信息来正确的缩放和定位敌人的精灵


(旁白:两种方法中的平截头宽度不需要相同-事实上,如果要绘制的屏幕是矩形的,则它们应该不同。x平截头和y平截头的比率应该等于屏幕的宽度和高度的比率。)

这真是一个令人难以置信的答案,我自己肯定不会得出这样的结论,所以非常感谢。我现在将着手实现这一点。我已经成功地从中获得了X,但我也在努力获得XY@Joel,我添加了一些有关计算Y坐标的信息。
distanceFromCamera = sqrt((enemy.x - camera.x)^2 + (enemy.y - camera.y)^2);
topBoundary = convertToPixels(getYPosition(enemy.height, camera.height, distanceFromCamera));
bottomBoundary = convertToPixels(getYPosition(0, camera.height, distanceFromCamera));