Android 如何在openGL Es第一次绘制对象时确定相机的坐标

Android 如何在openGL Es第一次绘制对象时确定相机的坐标,android,opengl-es,3d,Android,Opengl Es,3d,我从blender加载了一个模型,我试图在openGL中加载它,但它显示了一个黑色窗口。我猜我的相机放错位置了,所以我什么也看不见。问题是我不知道把相机放在哪里,也不知道把投影矩阵放在哪里 我的渲染器的代码: public RocketArrowRenderer(Context context) { mContext = context; Resources res = mContext.getResources(); InputStrea

我从blender加载了一个模型,我试图在openGL中加载它,但它显示了一个黑色窗口。我猜我的相机放错位置了,所以我什么也看不见。问题是我不知道把相机放在哪里,也不知道把投影矩阵放在哪里

我的渲染器的代码:

public RocketArrowRenderer(Context context)
    {
        mContext = context;
        Resources res = mContext.getResources();
        InputStream inputStream = res.openRawResource(R.raw.rocket_obj);

        Obj obj = null;
        try {
            obj = ObjUtils.convertToRenderable(ObjReader.read(inputStream));
        } catch (IOException e) {
            e.printStackTrace();
        }

        IntBuffer indices = ObjData.getFaceVertexIndices(obj);
        mVertices = ObjData.getVertices(obj);
        //FloatBuffer texCoords = ObjData.getTexCoords(obj, 2);
        //FloatBuffer normals = ObjData.getNormals(obj);

    }

    @Override
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);

        Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
        int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);

        if (vertexShaderHandle != 0)
        {
            GLES20.glShaderSource(vertexShaderHandle, vertexShader);
            GLES20.glCompileShader(vertexShaderHandle);
            final int[] compileStatus = new int[1];
            GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
            if (compileStatus[0] == 0)
            {
                GLES20.glDeleteShader(vertexShaderHandle);
                vertexShaderHandle = 0;
            }

        }

        if (vertexShaderHandle == 0)
        {
            throw new RuntimeException("Error creating vertex shader.");
        }

        // Load in the vertex shader.
        int fragmentShaderHandle = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        if(fragmentShader != null){
            GLES20.glShaderSource(fragmentShaderHandle, fragmentShader);
            GLES20.glCompileShader(fragmentShaderHandle);
            final int[] compileStatus2 = new int[1];
            GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus2, 0);
            if(compileStatus2[0] == 0){
                GLES20.glDeleteShader(fragmentShaderHandle);
                fragmentShaderHandle = 0;
            }
        }
        if(fragmentShader == null){
            throw new RuntimeException("Error creating fragment shader");
        }
        int programHandle = GLES20.glCreateProgram();

        if (programHandle != 0)
        {
            GLES20.glAttachShader(programHandle, vertexShaderHandle);

            GLES20.glAttachShader(programHandle, fragmentShaderHandle);
            GLES20.glBindAttribLocation(programHandle, 0, "a_Position");
            GLES20.glBindAttribLocation(programHandle, 1, "a_Color");
            GLES20.glLinkProgram(programHandle);
            final int[] linkStatus = new int[1];
            GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, linkStatus, 0);
            if (linkStatus[0] == 0)
            {
                GLES20.glDeleteProgram(programHandle);
                programHandle = 0;
            }
        }

        if (programHandle == 0) {
            throw new RuntimeException("Error creating program.");
        }
        mMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");
        mPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position");
        GLES20.glUseProgram(programHandle);

    }
    private float[] mProjectionMatrix = new float[16];

    @Override
    public void onSurfaceChanged(GL10 glUnused, int width, int height)
    {
        GLES20.glViewport(0, 0, width, height);
        final float ratio = (float) width / height;
        final float left = -ratio;
        final float right = ratio;
        final float bottom = -1.0f;
        final float top = 1.0f;
        final float near = 1.0f;
        final float far = 10.0f;

        Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
    }

    @Override
    public void onDrawFrame(GL10 glUnused)
    {
        AsyncTask<RocketArrowRenderer, Void, Void> handle = new AsyncTask<RocketArrowRenderer, Void, Void>() {
            @Override
            protected Void doInBackground(RocketArrowRenderer... renderers) {
                renderers[0].draw();
                return null;
            }

        };
        handle.execute(this);
    }


    public void draw() {
        GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
        Matrix.setIdentityM(mModelMatrix, 0);
        int numberOfTriangles = mVertices.position(0).remaining() / 3;
        mVertices.position(mPositionOffset);
        GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
                0, mPositionOffset);
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        //and later, in draw
        GLES20.glUniform4f(mColorHandle, 1.0f, 0.0f, 0.0f, 1.0f); 
        Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numberOfTriangles);
    }
}
公共RocketArrowRenderer(上下文)
{
mContext=上下文;
Resources res=mContext.getResources();
InputStream InputStream=res.openRawResource(R.raw.rocket_obj);
Obj Obj=null;
试一试{
obj=ObjUtils.convertToRenderable(ObjReader.read(inputStream));
}捕获(IOE异常){
e、 printStackTrace();
}
IntBuffer index=ObjData.getfacevertexins(obj);
mVertices=ObjData.getVertices(obj);
//FloatBuffer texCoords=ObjData.getTexCoords(obj,2);
//FloatBuffer normals=ObjData.getNormals(obj);
}
@凌驾
已创建表面上的公共void(GL10 glUnused,EGLConfig配置){
GLES20.glClearColor(0.5f,0.5f,0.5f,0.5f);
矩阵setLookAtM(mViewMatrix,0,eyeX,eyeY,eyeZ,lookX,lookY,lookZ,upX,upY,upZ);
int vertexShaderHandle=GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
如果(vertexShaderHandle!=0)
{
GLES20.glShaderSource(vertexShaderHandle,vertexShader);
GLES20.glCompileShader(vertexShaderHandle);
final int[]compileStatus=new int[1];
GLES20.glGetShaderiv(vertexShaderHandle,GLES20.GLU编译状态,编译状态,0);
if(compileStatus[0]==0)
{
GLES20.glDeleteShader(vertexShaderHandle);
vertexShaderHandle=0;
}
}
如果(vertexShaderHandle==0)
{
抛出新的RuntimeException(“创建顶点着色器时出错”);
}
//加载顶点着色器。
int fragmentShaderHandle=GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
if(fragmentShader!=null){
GLES20.glShaderSource(fragmentShaderHandle,fragmentShader);
GLES20.glCompileShader(fragmentShaderHandle);
final int[]compileStatus2=新int[1];
GLES20.glGetShaderiv(vertexShaderHandle,GLES20.GLU编译状态,编译状态2,0);
if(compileStatus2[0]==0){
GLES20.glDeleteShader(fragmentShaderHandle);
fragmentShaderHandle=0;
}
}
如果(fragmentShader==null){
抛出新的RuntimeException(“创建片段着色器时出错”);
}
int programHandle=GLES20.glCreateProgram();
if(programHandle!=0)
{
GLES20.glAttachShader(程序句柄,vertexShaderHandle);
GLES20.glAttachShader(程序句柄、碎片着色器句柄);
GLES20.GLBindAttriblLocation(程序句柄,0,“a_位置”);
GLES20.glBindAttribLocation(programHandle,1,“a_颜色”);
GLES20.glLinkProgram(程序句柄);
最终整数[]链接状态=新整数[1];
GLES20.glGetProgramiv(程序句柄,GLES20.GLU链接状态,链接状态,0);
如果(链接状态[0]==0)
{
GLES20.glDeleteProgram(程序句柄);
programHandle=0;
}
}
if(programHandle==0){
抛出新的RuntimeException(“创建程序时出错”);
}
mMVPMatrixHandle=GLES20.glGetUniformLocation(programHandle,“u_MVPMatrix”);
mPositionHandle=GLES20.glGetAttriblLocation(programHandle,“a_位置”);
GLES20.glUseProgram(程序句柄);
}
私有浮动[]mProjectionMatrix=新浮动[16];
@凌驾
表面上的公共空隙已更改(GL10已涂胶、整型宽度、整型高度)
{
GLES20.glViewport(0,0,宽度,高度);
最终浮动比率=(浮动)宽度/高度;
最终浮动左=-比率;
最终浮动权=比率;
最终浮底=-1.0f;
最终浮顶=1.0f;
接近的最终浮动=1.0f;
最终浮动far=10.0f;
平截头体(mProjectionMatrix,0,左,右,下,上,近,远);
}
@凌驾
公共空间框架(GL10胶合)
{
AsyncTask句柄=新建AsyncTask(){
@凌驾
受保护的Void doInBackground(RocketArrowRenderer…渲染器){
渲染器[0]。绘制();
返回null;
}
};
处理,执行(这个);
}
公众抽签(){
GLES20.glClear(GLES20.GL_深度_缓冲_位| GLES20.GL_颜色_缓冲_位);
矩阵setIdentityM(mModelMatrix,0);
int numberOfTriangles=mVertices.position(0).remaining()/3;
垂直位置(位置偏移);
GLES20.glVertexAttribute指针(mPositionHandle、mPositionDataSize、GLES20.GL_FLOAT、false、,
0,mPositionOffset);
GLES20.GlenableVertexAttributeArray(mPositionHandle);
//后来,在平局中
GLES20.glUniform4f(McColorhandle,1.0f,0.0f,0.0f,1.0f);
多矩阵(mMVPMatrix,0,mViewMatrix,0,mModelMatrix,0);
multiplyMM(mMVPMatrix,0,mProjectionMatrix,0,mMVPMatrix,0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle,1,false,mMVPMatrix,0);
GLES20.GlDrawArray(GLES20.GL_三角形,0,numberOfTriangles);
}
}

显示代码。没有它,我们怎么知道到底出了什么问题?可能有很多东西。@meowgoesdog代码已上载。。