我正在尝试为我正在开发的小游戏实现3D图形,但摄像机旋转效果不太对。对于摄像机,我使用球坐标系,其中alpha是方位角(图片中的theta),beta是90度减去极角(图片中的90 - phi):
在xy平面或z坐标较小的对象视野看起来似乎很好,但是当看向z轴时,物体会变形。这是一个例子,以(0, 0, 500)为中心观察半径为100的球体:
另一个例子,以(0, 0, 500)为中心观察半径为100的球体,从(0, 0, 0)观察:
我几乎可以确定投影算法没有问题,应该是摄像机的旋转出了问题。下面是我用于摄像机旋转算法的代码。distance()方法返回从一个坐标到另一个坐标的距离。point是我要旋转的点(x, y, z)坐标,camera是摄像机位置的(x, y, z)坐标,alpha是方位角,beta是90度减去极角。最终,我希望点被旋转以便相对于摄像机系统定位。
在xy平面或z坐标较小的对象视野看起来似乎很好,但是当看向z轴时,物体会变形。这是一个例子,以(0, 0, 500)为中心观察半径为100的球体:
另一个例子,以(0, 0, 500)为中心观察半径为100的球体,从(0, 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));
}
我已经花了好几个小时来解决这个问题,但一直没有成功。非常感谢任何能帮助我的人!感谢所有阅读这篇文章的人。