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

标签 java graphics 3d rotation projection

我正在尝试为我正在开发的一款小游戏实现 3d 图形,但相机旋转效果不佳。对于相机,我使用的是球坐标系,其中 alpha 为方位角(图片中的 theta),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) 坐标。相机是相机位置的 (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 函数使用弧度,而不是度数。在您的第一个示例中,您的调试输出显示相机测试版为 -89,但您实际上希望它为 -pi/2。

更好的是,通过根据 vector 来完成所有事情,从而完全避免所有三角函数。我发现制作游戏的编程竞赛不太可能排除使用图形库。 “没有外部资源”可能意味着 Assets 收集或“制作你自己的飞扬的小鸟”工具包。

关于java - 这个相机旋转算法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27086168/

相关文章:

java - 使用 DOM 选择节点的所有子节点

python - 同时对三个变量数组进行for循环

html - 如何使用 css3 将 svg 图像放在 3d 立方体的一侧?

java - 使用 Eclipse 和 itextpdf 时,并非所有字段都显示在 PDF 中

java - JScrollPane 中未出现多个 JTree

java - JPanel不断地用paintComponent绘制自己

java - 获取两个像素之间的所有像素

javascript - 如何在 ThreeJS 中从路径或二维数组绘制墙壁?

java - 从 JMS MessageListener 发出回滚信号

matrix - 剪切矩阵作为基本变换的组合?