这个相机旋转算法有什么问题?

时间:2014-11-23 06:12:44

标签: java graphics 3d rotation projection

我正在尝试为我正在进行的小型游戏实现3D图形,并且相机旋转工作不正常。对于相机,我使用的是球面坐标系,alpha为方位角(图中的θ),beta为90 - 极角(图中90-phi):

enter image description here

xy平面中的视觉或具有相对小的z坐标值的对象似乎是有序的。但是,当查看z轴时,对象会变形。这是一个从(0,0,0)在(0,0,500)处查看半径为100的球体的示例:

enter image description here

以下是从(0,0,0)(500,0,0)处查看相同球体的示例:

enter image description here

我几乎可以肯定投影算法很好,并且相机旋转很复杂。这是我用于相机旋转算法的代码。 distance()方法返回从一个坐标到另一个坐标的距离。 point是我试图旋转的点的(x,y,z)坐标。 camera是摄像机位置的(x,y,z)坐标。 alpha是方位角,beta是90 - 极角。最终,我希望旋转点使其相对于相机系统定位。

point.x -= camera.x;
point.y -= camera.y;
point.z -= camera.z;

double alpha = Math.atan2(point.y, point.x) - cameraAlpha;
double beta = Math.atan2(point.z, Math.sqrt(point.x * point.x + point.y * point.y)) - cameraBeta;

point = new Coordinate(point.distance(new Coordinate(0, 0, 0)) * Math.cos(alpha) * Math.cos(beta), point.distance(new Coordinate(0, 0, 0)) * Math.sin(alpha) * Math.cos(beta), point.distance(new Coordinate(0, 0, 0)) * Math.sin(beta));

投影算法的其余部分模拟眼睛中的镜头如何运作。由于y和z是对称的,我怀疑这部分是问题。 750是我正在绘制的小程序的高度和宽度。

if (point.x < 0){

    return null;

}else{

    return new Point(375 + (int) (point.y * 750 / point.x), 375 + (int) (point.z * 750 / point.x));

}

到目前为止,我花了好几个小时试图解决这个问题,但无济于事。我非常感谢能帮助我的人!感谢所有阅读此内容的人。

1 个答案:

答案 0 :(得分:0)

Java Math函数使用弧度,而不是度。在第一个示例中,您的调试输出显示相机beta为-89,但实际上您希望它为-pi / 2.

更好的是,通过根据向量完成所有操作,完全避免所有三角函数。我发现制作游戏的编程竞赛不太可能排除使用图形库。 “没有外部资源”可能意味着资产收集或“制作你自己的飞鸟”套件。