繁体   English   中英

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

[英]What is wrong with this camera rotation algorithm?

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

在此输入图像描述

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

在此输入图像描述

这是一个从(0,0,0)在(500,0,0)处查看相同球体的示例:

在此输入图像描述

我几乎可以肯定,投影算法很好,并且相机旋转很复杂。 这是我用于相机旋转算法的代码。 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));

}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM