2011-10-07 2 views
0

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 
} 

정말 내가 얻을 수있는 모든 도움을 주셔서 감사합니다 것입니다!

+0

OpenGL에서 텍스처 매핑을 수행하는 방법을 모르는 이유가 무엇입니까? 또는 꼭지점의 텍스처 좌표를 계산하는 데 도움이 필요합니까? – Rocketmagnet

+0

텍스쳐 매핑에 대해서는 전혀 모른다. 처음 시도해 본다. 그것에 대해 조금 읽었지만 내 코드에 맞게 만드는 방법을 알아낼 수 없었습니다. – Ambrose

+1

간단한 쿼드를 먼저 텍스처 매핑하는 것이 좋습니다. – Rocketmagnet

답변

0

이론적으로 질감 점이라면 질감이 1 픽셀이므로 인식 할 수있는지도를 만들기 위해서는 많은 점수가 필요합니다. 내가 말할 수있는 것부터 구형을 삼각형 세트로 그리는 대신에 텍스쳐를 적용 할 수 있어야합니다. 효과적으로 이것은 얼굴을 생성해야하는 포인트를 결합하는 것입니다. GL_POINTS보다는 GL_TRIANGLES을 사용하는 것이 좋습니다. 적절한 설명은 OpenGL programming guide on points lines and polygons을 참조하십시오.

+0

그것 봐봐! – Ambrose

+0

GL_TRIANGLE_ARRAY가 아닌 것 같습니다. GL_TRIANGLE 등은 올바르게 보이지 않습니다. – Ambrose

+0

완벽하게 텍스처링 할 수 있습니다 (모든 점에 의미있는 텍스처 좌표가있는 한). 왜 가능하지 않아야합니까? 모든 점은 적어도 하나의 조각을 생성하고 텍스처 좌표를가집니다. 더 필요한 것은 무엇입니까? 물론 이것이 OP가 원하는 것은 아닐 수도 있지만, 단일 픽셀의 텍스처가 텍스처의 고전적인 의미에서 그렇게 많은 의미를 가지지 않는다고해서 그것이 가능하지 않다는 것을 의미하지는 않습니다. OpenGL 파이프 라인은 가능한 것을 정의합니다. –