Текстурирование 3D-сферы (не могу найти сообщение, которое мне поможет)

#3d #geometry #textures

#3D #геометрия #Текстуры

Вопрос:

Я пытаюсь создать 3D-сферу, и в настоящее время у меня есть сфера, состоящая из точек, хотя мне нужно применить к ней текстуру, и это вызывает у меня проблемы.

Код для генерации сферы выглядит следующим образом:

     public Sphere(float radius, double step) {


    this.mRaduis = radius;
    this.mStep = step;
    sphereVertex = ByteBuffer.allocateDirect(400000)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mPoints = build();
    Log.d("ALIS CHECK!!!!!", " COUNT:"   mPoints);

}

    public void draw(GL10 gl) {
    gl.glFrontFace(GL10.GL_CW);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, sphereVertex);

    gl.glEnable(GL10.GL_TEXTURE_2D); // workaround bug 3623
    gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, sphereVertex);

    gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_POINTS, 0, mPoints);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}


private int build() {


    double dTheta = mStep * DEG;
    double dPhi = dTheta;
    int points = 0;

    for (double phi = -(Math.PI); phi <= Math.PI; phi  = dPhi) {
        // for each stage calculating the slices
        for (double theta = 0.0; theta <= (Math.PI * 2); theta  = dTheta) {
            sphereVertex.put((float) (mRaduis * Math.sin(phi) * Math
                    .cos(theta))); //y-coord
            sphereVertex.put((float) (mRaduis * Math.sin(phi) * Math
                    .sin(theta))); //z
            sphereVertex.put((float) (mRaduis * Math.cos(phi))); //x
            points  ;

        }
    }
  

и в моем классе рендеринга это выглядит так:

  public SphereRenderer(Context context) {

    mSphere = new Sphere(1, 25);

    this.context = context;

    vibrator = SphereActivity.getVibrator();
    sphereActivity = SphereActivity.getInstance();



}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    Sphere.loadTexture(gl, context, R.drawable.android);

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

}

public void onDrawFrame(GL10 gl) {

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();


    gl.glTranslatef(0.0f, 0.0f, -4.0f);

    rotateSphere(gl, startTime);


    // gl.glRotatef(xRot, 0.0f, 1.0f, 0.0f);
    // gl.glRotatef(yRot, 1.0f, 0.0f, 0.0f);
    mSphere.draw(gl);

    numFrames  ;
    long fpsElapsed = System.currentTimeMillis() - fpsStartTime;
    if (fpsElapsed > 5 * 1000) { // every 5 seconds
        float fps = (numFrames * 1000.0F) / fpsElapsed;
        Log.d("FPS", "Frames per second: "   fps   " ("   numFrames
                  " frames in "   fpsElapsed   " ms)");
        fpsStartTime = System.currentTimeMillis();
        numFrames = 0;
    }
}

public void onSurfaceChanged(GL10 gl, int width, int height) {

    startTime = System.currentTimeMillis();
    fpsStartTime = startTime;
    numFrames = 0;
    if (height == 0) {
        height = 1;
    }

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();

    // Calculate The Aspect Ratio Of The Window
    GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
            100.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW); // Select The Modelview Matrix
    gl.glLoadIdentity(); // Reset The Modelview Matrix
}
  

Я был бы очень признателен за любую помощь, которую я могу получить!

Комментарии:

1. Это потому, что вы вообще не знаете, как выполнять отображение текстур в OpenGL? Или вам нужна помощь в вычислении координат текстуры для вершин?

2. Я вообще мало что знаю о отображении текстур, когда впервые пробую. Немного читал об этом, но не смог понять, как сделать так, чтобы это соответствовало моему коду

3. Вероятно, было бы неплохо сначала попробовать сопоставить текстуры с простым квадратом.

4. Я думаю, у меня нет на это времени.. это для школьного проекта, и скоро время для сдачи, поэтому я обратился сюда 🙂

5. Я настоятельно рекомендую вам немного углубиться в основы OpenGL и компьютерной графики в целом, если вы хотите действительно понимать, что вы делаете. И если вы не хотите, то это место не www.write-my-homework.com .

Ответ №1:

Хотя теоретически вы можете текстурировать точки, один пиксель текстуры означает, что вам потребуется много точек для создания узнаваемой карты. Из того, что я могу сказать, вам нужно нарисовать свою сферу в виде набора треугольников, к которым затем можно применять текстуры. Фактически это означает просто объединение точек, которые вам нужны для создания граней. Вместо GL_POINTS того, чтобы вы, вероятно, хотели посмотреть на использование GL_TRIANGLES — см. Руководство по программированию OpenGL на линиях точек и полигонах для правильного объяснения.

Комментарии:

1. Похоже, что нет GL_TRIANGLE_ARRAY, Только GL_TRIANGLE и т. Д. Выглядит не совсем правильно

2. Вы можете идеально текстурировать точки (если каждая точка имеет значимую текстурную координату), почему это не должно быть возможным. Каждая точка создает хотя бы один фрагмент и имеет текстурную координату, что еще нужно? Но, конечно, это может быть не то, чего хочет OP, но только потому, что текстура на одном пикселе не имеет особого смысла в классическом смысле текстуры, это не значит, что это невозможно. Поскольку конвейер OpenGL определяет, что возможно.

3. Простая замена GL_POINTS на GL_TRIANGLES волшебным образом не создаст правильную поверхность. Скорее всего, вам нужно будет изменить порядок вершин, которые вы отправляете в GL, чтобы сформировать треугольники. И GL_TRIANGLE_ARRAY в любом случае это мусор.

4. Как мне изменить их порядок? / знать, какой порядок для них правильный

5. Если текстурированная точка представляет собой один пиксель текстуры, вы можете просто раскрасить их, поэтому, даже если вы можете их текстурировать, если у вас нет очень подробного облака точек, оно не будет очень узнаваемым, а также сильно отличается от моей интерпретации вопроса. Я отредактирую соответствующим образом.