【问题标题】:Rotate the 3D Model from one axis opengl从一个轴opengl旋转3D模型
【发布时间】:2013-09-10 14:54:10
【问题描述】:

我想从模型的左侧旋转 3D 模型。以下是我的代码,但它不起作用。

我目前的结果:https://www.dropbox.com/s/xesh2cszzg36eau/MOV_0009.mp4?m

我的预期结果:www.dropbox.com/s/ozt7beo4gz5q293/demo2__A.avi

private class Renderer implements GLSurfaceView.Renderer {
    public Renderer() {
        setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        getHolder().setFormat(PixelFormat.TRANSLUCENT);
        setZOrderOnTop(true);
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f,0.0f,0.0f, 0.0f);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glShadeModel(GL10.GL_SMOOTH);
    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {
        mViewWidth = (float)w;
        mViewHeight = (float)h;
        gl.glViewport(0,0,w,h);

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, 45, mViewWidth/mViewHeight, 0.1f, 100f);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glDisable(GL10.GL_DITHER); 

        gl.glMatrixMode(GL10.GL_MODELVIEW); //making sure OpenGL currently in model view
        gl.glLoadIdentity();                //clear the model view matrix to identity matrix

        if(mOrigin != null && mRotate != null) {
            if(isDoubleClick) {
                isDoubleClick = false;
                gl.glRotatef(mRotate.z, 0, 0, 1);
            } else {
                gl.glTranslatef(mOrigin.x, mOrigin.y, -10.0f + mOrigin.z);
                gl.glRotatef(mRotate.x, 1f, 0f, 0f);
                gl.glRotatef(mRotate.y, 0f, 1f, 0f);
                gl.glRotatef(mRotate.z, 0f, 0f, 1f);
            }
        }

        if(mModel != null) {
            mModel.draw(gl, mContext);
            if(!RendererView.textureFileName.equals(""))
                mModel.bindTextures(mContext, gl);
        }

        if(isPictureTake) {
            w = getWidth();
            h = getHeight();
            b = new int[w*(y+h)];
            bt = new int[w*h];

            IntBuffer ib = IntBuffer.wrap(b);
            ib.position(0);
            gl.glReadPixels(0, 0, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);
            createBitmapFromGLSurface(mContext);
            isPictureTake = false;
        }
    }
}

在 GLSurfaceView 上双击左、右、下、上时执行以下代码

if(mRotate != null && !AddProductsActivity.optionFlag) {
    if (col == 0 && row == 1 && mRotate.z >= 135) {
        mRotationAxis = Z_AXIS;
        mRotate.z = mRotate.z - 10; //Left Movement
        isDoubleClick = true;
    }
    else if (col == 1 && row == 0 && mRotate.x >= 45) {
        mRotationAxis = X_AXIS;
        mRotate.x = mRotate.x - 10; //Top Movement
        isDoubleClick = true;
    }
    else if (col == 1 && row == 2 && mRotate.x <= 135) {
        mRotationAxis = X_AXIS; //Bottom Movement
        mRotate.x = mRotate.x + 10;
        isDoubleClick = true;
    }
    else if (col == 2 && row == 1 && mRotate.z <= 225) {
        mRotationAxis = Z_AXIS;
        mRotate.z = mRotate.z + 10;  //Right Movement
        isDoubleClick = true;
    }
}

【问题讨论】:

    标签: android opengl-es 3d


    【解决方案1】:

    与此非常相似:Opengl rotation at a point

    您已经围绕正确的轴旋转,只是围绕错误的枢轴。您想将要旋转的点平移到原点,然后应用旋转,然后再次平移回来。

    所以要围绕点 x,y 旋转...

    translate(-x, -y)
    rotate(...)
    translate(x, y)
    
    drawMyObject()
    

    创建一个绘制 3 条 r/g/b 线的函数 drawAxes() 对确定变换顺序非常有帮助,并且可以让您在每次变换后“看到”原本不可见的原点、方向和比例。

    EDIT 忘记是安卓了,抱歉。也许试试这个:What is the easiest way to draw line using OpenGL-ES (android)

    忽略以下内容,除非桌面 OpenGL:

    void drawAxes()
    {
        glBegin(GL_LINES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 0.0f, 0.0f);
        glVertex3f(1.0f, 0.0f, 0.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(0.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 0.0f, 1.0f);
        glEnd();
    }
    

    【讨论】:

    • 我使用的是 3D,所以我有 x、y、z。让我知道我应该在translate(-x, -y) 中使用什么值。最初x = 0,y = 0,z = 6。你能举个例子来绘制轴3 rgb
    • 3D 也一样,只有 3 个坐标。唯一的区别是您可以选择沿轴的任何点作为轴心。只需使用 translate(-x, -y, -z) 等。
    • 我使用了这个gl.glTranslatef(-mOrigin.x, -mOrigin.y, -mOrigin.z); gl.glRotatef(mRotate.x, 0f, 1f, 0f); gl.glRotatef(mRotate.y, 0f, 0f, 1f); gl.glRotatef(mRotate.z, 0f, 0f, 1f); gl.glTranslatef(mOrigin.x, mOrigin.y, mOrigin.z);,但仍然遇到同样的问题。 dropbox.com/s/xesh2cszzg36eau/MOV_0009.mp4?m
    • 回复有点晚,但是在您的轮换调用之前和之后调用 drawAxes(上面提到的)会显示枢轴点。我唯一的猜测是 mOrigin 不是您要旋转的点。
    • 我没有绘制 3 条 r/g/b 行的代码行。请帮我解决这个问题
    猜你喜欢
    • 2021-06-24
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多