2016-08-05 2 views
1

私はあなたが宇宙船であり、3D空間で飛び回るJavaでOpenGLゲームを作ろうとしています。レベルのすべての敵の宇宙船。しかし、私はカメラを固定する/プレイヤーに従う方法を把握していないようです。私はこれをやりたいので、ユーザー入力を使って周りのプレーヤー(AKA:宇宙船)を動かすことができるようにして、カメラが飛び出して見えなくなります。カメラをプレイヤーに固定する方法は、プレイヤーが移動するとカメラがフォローされます。

注:私は最新のOpenGLを使用しています。 (Shaders ...)ではなく、固定機能のパイプラインです。

+2

カメラを任意の場所に向けることができれば、その任意の場所を単に「プレイヤー」にすることができます。 –

+0

私は言ったことがあります:cameraPos = playersPos。しかし、これはまだプレイヤーがスクリーンを驚かせるように思われる。 (すべてのゲームアップデート)。 – BinaryMatrix

+0

しかし、カメラは静止していても動いていますが、プレーヤーはゆっくりと後退しますか?両方の位置を印刷し、それらの値をチェックしてください。いくつかのコードがなければ、私たちは予告できます。 – Mars

答えて

0

カメラを固定したままにするには、カメラに適用したいヨーとピッチ(回転)とプレイヤーから離れた距離をコンピュータに指定する必要がありますあなたはその角度からプレーヤーを見ることができます。 https://youtu.be/PoxDDZmctnU

2

を(私は一般的なコードではなく、Javaで説明しますが、構文が翻訳しやすい) あなたが変換を使用していると仮定:ここ

は、あなたが求めている正確に何で華麗なチュートリアルですマトリックス シーン内のすべてのオブジェクトがによってレンダリングされています。一方、

B * M * P, 

B = Base (or View/Camera) matrix 
M = Model (or objects, like the enemies or the player spaceship) matrix 
P = Projection matrix 

更新サイクルでは、レンダリングサイクルの前に、プレーヤーの宇宙船モデルを更新した直後に、それに応じてベース行列を変更します。たとえば、カメラを宇宙船の後ろに置く場合は、まず宇宙船の上向きベクトル宇宙船のベクター:

/// set the offsets between the camera and the spaceship   /// 
float distCameraToShip = 2.0; 
float cameraElevation = 2.0; 
// find the ship position           /// 
Vector3 vShipTranslation = shipMatrix.GetTranslation(); 
/// or Vector3 vShipTranslation = shipMatrix * Vector3(0.0,0.0,0.0); /// 

/// calculate the camera transformation        /// 
Vector3 vCameraPos = vShipTranslation - vHeading * distCameraToShip + vShipUp * cameraElevation; 

Matrix4x4 cameraMatrix = LookAt(vCameraPos, vShipTranslation, vShipUp); 

ルックアット実装:

Vector3 vHeading = shipMatrix * Vector3(0.0,0.0,1.0); 
Vector3 vShipUp = shipMatrix * Vector3(0.0,1.0,0.0); 

は、カメラ行列宇宙船の後方に配置し、ルックアット計算を使用して、宇宙船を見を作成します

CMatrix4x4 LookAt(Vector3 vEye, Vector3 vObject, Vector3 vUp) 
{ 
Vector3 n = normalize(vEye - vObject); 
     Vector3 u = cross(vUp , n); 
     Vector3 v = cross(n , u); 

     float m[16] = { u[0], v[0], n[0], 0.0f, 
      u[1], v[1], n[1], 0.0f, 
      u[2], v[2], n[2], 0.0f, 
      (u * -1.0 * vEye) , 
      (v * -1.0 * vEye) , 
      (n * -1.0 * vEye), 
      1.0f }; 

return m; 
} 

あなたはすべてのレンダリングサイクルのため、このカメラ行列を使用し、シェーダの元にそれを渡しますとの距離を設定するよう

////// Vertex shader /// 

/// it is recommended to do the multiplication on the CPU and pass the ModelViewMatrix to the shader, here is just to example /// 
uniform mat4 u_BaseMatrix; 
uniform mat4 u_ModelMatrix; 
uniform mat4 u_ProjectionMatrix; 

in vec3 a_VerAttrib; 

void main() 
{ 
gl_Position = u_ProjectionMatrix * u_BaseMatrix * u_ModelMatrix * vec4(a_VertAttrib, 1.0); 
} 

今は、カメラの操作を開始し、それをクールな補間のすべての種類を与えることができます船の速度に応じて、カメラと船:

float distCameraToShip = 2.0 + pow(shipSpeed,2.0) * 0.1; 

あなたもそれをクールに次のような効果を与えるために時間円滑なフィルタを使用することができます。

/// dt = time diff between updating cycles, or 1/FrameRate /// 
float ct = 1.0/(1.0 + dt); 
cameraMatrix = cameraMatrix + (previousCameraMatrix - cameraMatrix) * ct; 
0123を
関連する問題