私は、そのマップに惑星全体を使用するゲームを作っています。私は球状の惑星using this techniqueをテッセレーションして、今カメラコントロールで追加しています。カメラをポイントに回転
球の大きさは1から-1です。したがって、球上の各点も正規化されたベクトルになります。一度に、球を構成する六角形のタイルの1つが「選択された」タイルです。プレーヤーは、dパッドを使用して選択範囲を隣接するタイルに移動することができます。また、アナログスティックを使用してカメラを独立して回転させることもできます。
選択したタイルとカメラに関連して2つのことを行う必要があります。まず、選択範囲をカメラに最も近いタイルに切り替える必要があります。次に、ハイライトされたタイルの上にカメラを配置する必要があります。
球が原点に位置し、カメラがポイント(0,0,1)に座ります。グラフィックエンジンでは、カメラをX軸とY軸の周りで回転させることしかできないので、最初の問題を解決するために、xとy軸の周りの点(0,0,1)を回転させて
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;
}
Iは、各タイルの重心とカメラ位置の間の距離を比較し、新たに選択されたタイルであることが最も近いタイルを取る:カメラは3D空間。
しかし、第2の問題を解決するために、私はその逆をしたいと思います。重心(これは既に正規化されたベクトルの形をしています)を取り出して、Xの回りの回転とYを中心とする回転を見つけて、カメラを中央に置く必要があります。
現時点ではカメラを(0,0,1)に戻してからX軸とY軸の角度を(0,0,1)と重心の間で取得し、それを使用してカメラをもう一度回転させます:
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軸は常に外に出ているように見えます)、角度を取得して回転させる数学と関係していると確信しています。
注:グラフィックスエンジンは、その後、Yの周りのX軸、:
gl.glRotatef(mRotateX, 1, 0, 0);
gl.glRotatef(mRotateY, 0, 1, 0);
重心がすべて正しい場所にあり、カメラは間違いなく正しい量だけ回転し、ので、私はこの問題は、グラフィックスエンジンではないと確信しています。私は、これはプログラム
をステップ実行することで動作確認されてきたように、それが戻って(0,0,1)にも、カメラの再配置ではありません、私はこの問題を説明するためにビデオをも作った:
http://www.youtube.com/watch?v=Uvka7ifZMlE
これは数日間私を悩ませていますので、これを解決するための助けがあれば幸いです!
おかげ ジェームズ
面白い、ありがとう!私は周りの車輪で理解していますが、私はそれが名前を持っていたことは決して実現しませんでした(はるかに少なく、毛むくじゃらのボール定理として陽気な)。このホイール動作は、私がプレイしたコンピュータゲームでは珍しいことではなく、おそらくゲームをプレイするときにわずかなグラフィカルな迷惑になります。私はセンタリングを落とさなければならないと思うが、当面は重心にカメラを回転させる必要がある –