2016-02-14 5 views
0

во-первых, я действительно новым для OpenGL на androidand Я все еще ищу, хотя курсы онлайнAndroid OpenGL перемещения объекта Ontouch

Я пытаюсь сделать просто appthat имеет sequre в середине экрана и на ощупь она движется к сенсорному событию координатные это мой взгляд sureface

public class MyGLSurfaceView extends GLSurfaceView { 

private final MyGLRenderer mRenderer; 

public MyGLSurfaceView(Context context) { 
    super(context); 

    // Set the Renderer for drawing on the GLSurfaceView 
    mRenderer = new MyGLRenderer(); 
    setRenderer(mRenderer); 

    // Render the view only when there is a change in the drawing data 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 


@Override 
public boolean onTouchEvent(MotionEvent e) 
{ 
    float x =e.getX(); 
    float y =e.getY(); 

    if(e.getAction()==MotionEvent.ACTION_MOVE) 
    { 
     mRenderer.setLoc(x,y); 
     requestRender(); 
    } 
    return true; 
} 

}

и это меня рендерер класс

public class MyGLRenderer implements GLSurfaceView.Renderer { 

private float mAngle; 

public PVector pos; 
public Rectangle r; 
public Square sq; 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    // Set the background frame color 
    gl.glClearColor(1f, 1f, 1f, 1.0f); 

    pos=new PVector(); 
    r=new Rectangle(0.5f,0.4f); 
    sq=new Square(0.3f); 
} 

@Override 
public void onDrawFrame(GL10 gl) { 

    // Draw background color 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // Set GL_MODELVIEW transformation mode 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); // reset the matrix to its default state 

    // When using GL_MODELVIEW, you must set the view point 
    GLU.gluLookAt(gl, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

    gl.glTranslatef(pos.x,pos.y,0f); 

    //r.draw(gl); 
    sq.draw(gl); 

}//rend 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // Adjust the viewport based on geometry changes 
    // such as screen rotations 
    gl.glViewport(0, 0, width, height); 

    // make adjustments for screen ratio 
    float ratio = (float) width/height; 
    gl.glMatrixMode(GL10.GL_PROJECTION);  // set matrix to projection mode 
    gl.glLoadIdentity();      // reset the matrix to its default state 
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix 
} 

/** 
* Returns the rotation angle of the triangle shape (mTriangle). 
* 
* @return - A float representing the rotation angle. 
*/ 
public float getAngle() { 
    return mAngle; 
} 

/** 
* Sets the rotation angle of the triangle shape (mTriangle). 
*/ 
public void setAngle(float angle) { 
    mAngle = angle; 
} 

public void setLoc(float x,float y) 
{ 
    pos.x=x; pos.y=y; 
} 

}

ответ

0

Задавая вопрос, вы должны добавить, что ваш текущий результат и то, что это ваш ожидаемый результат.

С коротким взглядом на ваш код я ожидал бы, что квадрат будет нарисован правильно, пока вы не коснетесь экрана, после которого он полностью исчезнет (если вы на самом деле не нажмете верхнюю левую часть экрана).

Если это так, ваша проблема заключается только в том, что вы не преобразуете координаты касания в систему координат openGL. Система координат openGL по умолчанию находится в диапазоне [-1,1] по всей оси, но вы можете изменить ее (как и вы) с помощью матриц. 2 наиболее распространенными являются glFrustum и glOrtho оба из них принимают 4 граничные координаты, которые левые, правые, нижние и верхние, которые представляют, какое значение соответствует соответствующей границе вида.

Так, например, чтобы вычислить x от касания, вы должны сначала нормализовать его, чтобы увидеть, какую часть экрана вы нажали relativeX = touch.x/view.size.width, тогда это будет представлять координату в openGL, так что вы делаете glX = left + (right-left)*relativeX. Аналогично для вертикальной координаты.

Но в вашем случае было бы лучше использовать 2D и использовать glOrtho при использовании координат вида. Это означает замену вызова усеченного кома с этим и установка left=.0, right=viewWidth, top=.0, bottom=viewHeight. Теперь у вас будет такая же система координат в openGL, что и в представлении. Вам нужно будет увеличить квадратный размер, чтобы увидеть его, так как на данный момент он очень мал. Также вы должны удалить lookAt и просто использовать личность + перевести.

+0

и жаль, что я не написал свой результат, не был новичком –