2011-06-29 26 views
1

私はAndroid OpenGL-ESでレンダリングしたポイントクラウドを持っています。私はそれを正しく翻訳することができますが、私がそれを回転させると、私はそれを望みのように動作させることができません。私はそれをポイントクラウドの中心(私はこの3Dポイントを持っている)について回転させたいが、それをどうやって行うのか分からない。Android OpenGL ES:任意軸に対する回転?

public void onDrawFrame(GL10 gl) { 
    // Clears the screen and depth buffer. 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    // Replace the current matrix with the identity matrix 
    gl.glLoadIdentity(); 
    // Translates 4 units into the screen. 

    GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, 
         centerX, centerY, centerZ, 
         upX, upY, upZ); 

    // rotate 
    gl.glRotatef(_xAngle, 1f, 0f, 0f); 
    gl.glRotatef(_yAngle, 0f, 1f, 0f); 
    gl.glRotatef(_zAngle, 0f, 0f, 1f); 

    gl.glTranslatef(_xTranslate, _yTranslate, _zTranslate); 

    // Draw things 
    ptCloud.draw(gl); 
    aBox.draw(gl); 
} 

ユーザーの操作に応答して_translate変数と_angle変数を変更し、OpenGlがそれらに作用します。私の視点が設定された直後に私は私のprCloudで描画ルーチンを実行することがわかります。

:ここ
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // Sets the current view port to the new size. 
    gl.glViewport(0, 0, width, height); 
    // Select the projection matrix 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    // Reset the projection matrix 
    gl.glLoadIdentity(); 
    // Calculate the aspect ratio of the window 
    GLU.gluPerspective(gl, 45.0f, (float) width/(float) height, 0.001f, 
      1000000.0f); 

    // Select the modelview matrix 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    // Reset the modelview matrix 
    gl.glLoadIdentity(); 
} 

は私のルックアットデフォルト変数です:私はわからないので、それは何も影響を与える場合

public void draw(GL10 gl) { 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glPointSize(0.5f); 
    gl.glDrawArrays(GL10.GL_POINTS, 0, numVertices); 
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
} 

と同様に表面を作成する方法を:私はことを紹介します

private float eyeX = 20; 
private float eyeY = -150; 
private float eyeZ = 60; 
private float centerX = 0; 
private float centerY = 0; 
private float centerZ = 0; 
private float upX = 0; 
private float upY = 0; 
private float upZ = 1; 

ポイントは(0,0,0)から(120,180,38)の範囲になるようにスケールされています。私はまた、全体のモデルがランダムに提供される目の位置を見つける方法を知りません最大ポイント値...

私はどのように私が期待するだろう回転誰かが推測できますか?

答えて

2

翻訳後に回転してください!

変換は、あなたが指示した順序で機能します。あなたが翻訳する前に回転すると、翻訳は回転などの影響を受けます。回転する前に翻訳すると回転は回転前に翻訳され、オブジェクトの中央になります。

は、詳細については以下のページを参照してください。

http://www.3dcodingtutorial.com/Basic-OpenGL-functions/Translate-and-Rotate-functions.html

http://www.swiftless.com/tutorials/opengl/rotation.html

http://www.opengl.org/resources/faq/technical/transformations.htm

http://www.falloutsoftware.com/tutorials/gl/gl5.htm

+0

実は、これは私がポイントに対してそれを回転させることができます(0,0,0 )。任意の点(ポイントクラウドの中心のような)に対してどのように回転させるのですか? – RedLeader

+0

..入手します。回転前のポイントに翻訳します。回転する。その点の否定に翻訳してください。 – RedLeader

+0

@RedLeader別のオプションは、変換を実行する前にglPushMatrixを実行してから、グラフィックスの状態を元に戻した時の状態に戻したときに、プッシュマトリックスと言っていたので、ポイントのネガを翻訳する必要はありません –

関連する問題