Нужна помощь в OpenGL в Android - PullRequest
0 голосов
/ 13 января 2012

Я создал 3 класса Java.

  1. тот, который имеет объект glsurfaceview и вызывает класс визуализации.
  2. это класс визуализации и вызывает класс куба.
  3. это кубclass.

Если я запускаю приложение, то на экране отображается вращающийся куб (сделал вращение в классе рендеринга), что нормально.Но я хочу контролировать направление вращения куба и для этого я установил 2 кнопки.Здесь мне нужна помощь, потому что я не знаю, чтобы заставить кнопки управлять движением куба.Я новичок в Android, так что если бы вы могли оставить какой-нибудь код для изучения, это было бы просто замечательно.

Ответы [ 2 ]

1 голос
/ 14 января 2012

Ваш класс Activity (или ваш класс, который расширяет Activity) должен выглядеть следующим образом:

public class stackoverflowTest extends Activity {

GLSurfaceView glSurface;
MyRenderer myRenderer;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    myRenderer = new MyRenderer(this);        
    //Create an instance of the Renderer with this Activity

    glSurface = (GLSurfaceView) findViewById(R.id.graphics_glsurfaceview1);
    //Set our own Renderer and hand the renderer this Activity Context

    glSurface.setEGLConfigChooser(true);

    glSurface.setRenderer(myRenderer);
    //Set the GLSurface as View to this Activity


}

/** 
* this is the method the button click calls
*/
public void changeRotationDirection(View v){

    myRenderer.changeRotationDirection();


}

}

Тогда в вашем рендерере:

public class MyRenderer implements Renderer {

private float rotationDirection = 1.0f;


public MyRenderer(Context context){
    this.context = context;
}

public void setRotationDirection(){

    if(rotationDirection==1.0f){
        rotationDirection=-1.0f;
    } else {
        rotationDirection=1.0f;
    }

}

@Override
public void onDrawFrame(GL10 gl) {
        // GL calls

        gl.glRotatef(angle, rotateDirection, 0.0f, 0.0f);

        // draw cube
        gl.glDrawArrays( etc );

    }

}

Обычно вы используете glRotatef, чтобы вращать куб перед тем, как нарисовать его. Используйте параметр -ve vales для параметра угла (первого) или параметров количества x, y, z для поворота в противоположном направлении. Используйте вызовы метода к Renderer, чтобы связаться с ним и обновить сцену. Используйте этот подход с осторожностью, поскольку у потока Renderer и потока Main / UI (откуда выполняется вызов кнопки) могут возникнуть проблемы с синхронизацией

Чтобы кнопка вызывала метод changeRotationDirection, просто добавьте android:onClick="changeRotationDirection" в макет XML (любого вида. Не обязательно должен быть просто вид кнопки). Любые методы кнопок, объявленные в макете XML, должны иметь форму public void [methodname](View [paramname]) и должны находиться в классе Activity, из которого нажата кнопка

Для более продвинутого сенсорного управления, проверьте, как предложил Эрик, а также проверьте OnTouchListeners

(Примечание: если вы используете openGL-ES 2.0 или выше (Android 2.2+), тогда используйте GLES20.glRotatef())

0 голосов
/ 13 января 2012

Возможно, вы захотите проверить пример TouchRotateActivity из SDK. Если я не ошибаюсь, он находится в папке samples / platform / api-demos.

...