gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:23 24 4
gpt4 key购买 nike

我正在尝试为我正在开发的一款小游戏实现 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com