Как отобразить небесную сферу? - PullRequest
1 голос
/ 12 июня 2011

Мне нужно расположить сферу неба в трехмерном пространстве прямо там, где находится камера.

Я настроил камеру следующим образом:

public void onSurfaceChanged(GL10 glUnused, int width, int height) {
    // Ignore the passed-in GL10 interface, and use the GLES20
    // class's static methods instead.
    GLES20.glViewport(0, 0, width, height);
    float ratio = (float) width / height;
    Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 1000);
}

...
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
...

Сфера имеет диаметр 100 единиц, а ее центр находится в (0; 0; 0).

Способ рисования сферы:

private void drawSphere() {
    //Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    mTriangleVerticesSphere.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVerticesSphere);
    mTriangleVerticesSphere.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
    GLES20.glEnableVertexAttribArray(maPositionHandle);
    GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVerticesSphere);
    GLES20.glEnableVertexAttribArray(maTextureHandle);

    Matrix.setRotateM(mMMatrix, 0, jitterX, 1.0f, 0, 0);
    Matrix.rotateM(mMMatrix, 0, angleYaw + jitterY, 0, 1.0f, 0);
    Matrix.scaleM(mMMatrix, 0, 0.01f, 0.01f, 0.01f);
    Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);

    GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numPolysSphere);
}

Этот код отображает сферу. Отбор задних поверхностей отключен, и я вижу обе стороны сферы (текстура имеет прозрачные части). Чтобы отобразить сферу прямо в положении камеры, я пытаюсь переместить камеру. Но если я раскомментирую Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, 0f, 0f, 0f, 0f, 1.0f, 0.0f) в начале drawSphere(), это ничего не отобразит. Может быть, это как-то связано с обтравочными плоскостями? Пожалуйста, приведите пример, как правильно расположить сферу.

Ответы [ 2 ]

1 голос
/ 14 июня 2011

ОК, поэтому я разобрался, как это сделать.
1. Посмотрите под правильным углом.
3. Нарисуйте сферу неба.
2. Очистите Z-буфер.
3. Переместите камеру.
4. Нарисуйте остальное.

1 голос
/ 12 июня 2011

Я думаю, что вы больше хотите сделать что-то вроде

Matrix.setLookAtM(mvMatrix, 0, 0, 0, 10, 0, 0, 0, 0, 1, 0);

, если я не ошибаюсь, opengl не знает, в какую сторону смотрит

, и ваш запрос тоже ищет, 0,0) в направлении (0,0,0) при ориентации в направлении (0,1,0,0)

...