我正在制作一款使用整个星球作为地图的游戏。我已经使用这种技术对球形行星进行了镶嵌,现在正在添加相机控制。
球体的维度为 1 到 -1,因此球体上的每个点也是一个归一化向量。在任何时候,构成球体的六边形图块之一是“选定”图块。然后,玩家可以使用 d-pad 将选择移动到相邻的图块。他们还可以使用模拟摇杆独立旋转相机
我需要对选定的瓷砖和相机做两件事。首先,我需要能够将选择切换到离相机最近的图块。其次,我需要将相机放在突出显示的瓷砖上
球体位于原点,相机位于点 (0,0,1)。图形引擎只允许我围绕 X 和 Y 轴旋转相机,所以为了解决第一个问题,我使用四元数围绕 x 和 y 轴旋转点 (0,0,1) 以找到点相机所在的 3D 空间:
private Quaternion quat = new Quaternion(0,0,0,0);
private double[] output = new double[4];
private double[] cam = new double[3];
private double camX = 0;
private double camY = 0;
private double camZ = 1;
private double[] getCamPosition(){
quat.setAxisAngle(1, 0, 0, Math.toRadians(-graphicsEngine.getRotationX()));
quat.RotateVector(camX, camY, camZ, output);
cam[0] = output[0];
cam[1] = output[1];
cam[2] = output[2];
quat.setAxisAngle(0, 1, 0, Math.toRadians(-graphicsEngine.getRotationY()));
quat.RotateVector(cam[0], cam[1], cam[2], output);
cam[0] = output[0];
cam[1] = output[1];
cam[2] = output[2];
return cam;
}
然后我比较每个图块的质心与相机位置之间的距离,并取最接近新选择的图块的图块。
但是,为了解决第二个问题,我想做相反的事情。我想取质心(已经是归一化向量的形式),并找出围绕 X 的旋转和围绕 Y 的旋转,以使相机以它为中心
目前,我将相机旋转回(0,0,1),然后在(0,0,1)和质心之间获取X轴和Y轴的角度,并使用它来旋转相机第二次:
private double[] outputArray = new double[2];
/**
* Cam is always (0,0,1)
*/
public void centreOnSelected(double camX, double camY, double camZ){
selectedTile.getCentroidAngles(outputArray);
outputArray[0] -= Math.atan2(camZ, camY);
outputArray[1] -= Math.atan2(camX, camZ);
// this determines if the centroid is pointing away from the camera
// I.e. is on the far side of the sphere to the camera point (0,0,1)
if(!selected.getCentroidDirectionY(camX, camZ)){
outputArray[0] = -Math.PI - outputArray[0];
}
graphicsEngine.rotateCam(Math.toDegrees(outputArray[0]), Math.toDegrees(outputArray[1]));
}
在selected
(瓷砖类)
void getCentroidAngles(double[] outputArray){
outputArray[0] = Math.atan2(centroidZ, centroidY);
outputArray[1] = Math.atan2(centroidX, centroidZ);
}
问题是这不起作用,(x 轴似乎总是不在),我很确定这与获取角度和进行旋转的数学有关
注意:图形引擎首先绕 X 轴旋转,然后绕 Y 轴旋转:
gl.glRotatef(mRotateX, 1, 0, 0);
gl.glRotatef(mRotateY, 0, 1, 0);
质心都在正确的位置,并且相机肯定会旋转正确的量,所以我确定问题不在于图形引擎。这也不是将相机重新定位回(0,0,1),因为我已经通过逐步执行程序检查了它的工作原理
我还制作了一个视频来说明这个问题:
http://www.youtube.com/watch?v=Uvka7ifZMlE
这已经困扰了我好几天了,因此非常感谢任何帮助解决此问题!
谢谢詹姆斯