Opengl三角形旋转,顶点修改

时间:2014-02-13 06:26:42

标签: android button rotation geometry redraw

在我提出问题之前,我想为我笨拙的英语道歉,因为我是外国人。

我想制作一个可以在按钮点击时旋转视图的应用程序。我在按钮点击时修改三角形顶点。

操作完成后,我希望重绘已修改顶点的三角形,但三角形不会改变。

我收到button has changed vertex of triangle的日志消息,但三角形没有改变。

我需要帮助的人。

这是我的代码: -

  

方法pos_change / sign_changed / plus和minus是对三角形顶点旋转的修改

private int delx = 0;
private int dely = 0;
public  float vertices[] =  { delx, dely, 
                        delx, dely, 
                        delx, dely};
public static float pvertices[] = { 0.0f, 0.8f ,0.8f , -0.8f , -0.8f , -0.8f};

private String[] Status = {"up","right","down","left"};
private String now_Status = Status[0];
int Status_Stack =0;
int change =0;

public drawtri(){
    array_Plus();
    mVertexBuffer = getFloatBufferFromFloatArray(vertices);
}

public void draw(GL10 gl){
    gl.glFrontFace(GL10.GL_CW);
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, mVertexBuffer);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vertices.length/2);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

public void Matrix_Change(char a){

    switch(a){
    //right
    case 'R' :
        if(now_Status=="up" ){
            array_Minus();
            array_Pos_Change();
            Status_Stack++;
            now_Status= Status[Status_Stack];
            array_Plus();
        }
        else if(now_Status=="right"){
            array_Minus();
            array_Pos_Change();
            array_Sign_Change();
            now_Status= Status[++Status_Stack];
            array_Plus();
        }
        else if(now_Status=="down"){
            array_Minus();
            array_Pos_Change();
            now_Status= Status[++Status_Stack];
            array_Plus();
        }
        else if(now_Status=="left"){
            array_Minus();
            array_Pos_Change();
            array_Sign_Change();
            Status_Stack=0;
            now_Status= Status[Status_Stack];
            array_Plus();
        }
    //left              
    case 'L':
        if(now_Status=="up"){
            array_Minus();
            array_Pos_Change();
            array_Sign_Change();
            Status_Stack=3;
            now_Status= Status[Status_Stack];
            array_Plus();
        }
        else if(now_Status=="left"){
            array_Minus();
            array_Pos_Change();
            now_Status= Status[--Status_Stack];
            array_Plus();
        }
        else if(now_Status=="down"){
            array_Minus();
            array_Pos_Change();
            array_Sign_Change();
            now_Status= Status[--Status_Stack];
            array_Plus();
        }
        else if(now_Status=="right"){
            array_Minus();
            array_Pos_Change();
            now_Status= Status[--Status_Stack];
            array_Plus();
        }
        break;
    }
}
public void array_Pos_Change(){
    float buffer;
    buffer = pvertices[0];
    pvertices[0] = pvertices[1];
    pvertices[1] = buffer;
    buffer = pvertices[5];
    pvertices[5] = pvertices[2];
    pvertices[2] = buffer;
    buffer = pvertices[3];
    pvertices[3] = pvertices[4];
    pvertices[4] = buffer;
}

public void array_Sign_Change(){
    for(int i = 0; i<6 ; i++) pvertices[i] *= -1;
}

public void array_Minus(){
    for(int i=0; i<6; i++) vertices[i]-=pvertices[i];
}

public void array_Plus(){
    for(int i=0; i<6; i++) vertices[i]+=pvertices[i];
}

这就是按钮代码:

left.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            drawtri.Matrix_Change('L');

        }
    });

    right.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            drawtri.Matrix_Change('R');

        }
    });

该代码位于onDrawFrame

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity(); 
    GLU.gluLookAt(gl, View_Pos_x, View_Pos_y,height,View_Pos_x, View_Pos_y, 0, 0, +1,0);

    draw_Obj(gl);
}

1 个答案:

答案 0 :(得分:0)

大笑我解决我的问题只是简单的问题

我绘制使用浮动缓冲区的数组。

我想绘制实时,这意味着我点击按钮并重绘新的顶点

所以..我有很多很多很多男人都会不会想到我的问题

答案是构造函数。构造函数是在类

中只有一个构建的方法

是的,顶点已更改但缓冲区未更改!!

    public void draw(GL10 gl){
    array_Plus();
    mVertexBuffer = getFloatBufferFromFloatArray(vertices);
    gl.glFrontFace(GL10.GL_CW);
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, mVertexBuffer);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vertices.length/2);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    //mVertexBuffer.clear();
    array_Minus();
}

ㅁ 并删除构造函数(默认)

我对我的问题感到惭愧,但我知道在美国或我的国家有哪些问题与我相同

所以我发布了勇敢的

ps.sorry for my awkward english