gpt4 book ai didi

android - (OpenGL ES) 远离 View 中心的对象被拉伸(stretch)

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:57 38 4
gpt4 key购买 nike

所以我在 OpenGL ES 中生成了一个球体(具体来说,OpenGL ES 2.0,在 Java 中,适用于 Android)。当这个球体放置在与用于我的 View 矩阵的中心相同的位置时,它很好,但是当偏离中心时,球体会严重扭曲(见下文)。

为什么会发生这种情况,我该如何阻止它?

enter image description here

那是同一个球体。右上角的只是翻译成 x 和 y(不是 z)。

我实现 GLSurfaceView.renderer 的一些代码 fragment ,

public void onSurfaceCreated(GL10 unused, EGLConfig config) {
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);

// Both centred on (0,0,0), of radius 1.0.
outerSphere = new Sphere();
centreSphere = new Sphere();
}

public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);

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 = 100.0f;

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

public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

float eyeX = 0.0f;
float eyeY = 0.0f;
float eyeZ = 10.0f;

final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = 0.0f;

final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;

Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ,
upX, upY, upZ);

// Set identity matrix as input for translations.
Matrix.setIdentityM(outerModelMatrix, 0);

// Translate outer sphere by 5 in x and y.
Matrix.translateM(outerModelMatrix, 0, 5.0f, 5.0f, 0.0f);

// MVP matrix = Projection * View * Model.
Matrix.multiplyMM(centreMVPMatrix, 0, viewMatrix, 0, centreModelMatrix, 0);
Matrix.multiplyMM(centreMVPMatrix, 0, projectionMatrix, 0, centreMVPMatrix, 0);
Matrix.multiplyMM(outerMVPMatrix, 0, viewMatrix, 0, outerModelMatrix, 0);
Matrix.multiplyMM(outerMVPMatrix, 0, projectionMatrix, 0, outerMVPMatrix, 0);

outerSphere.draw(outerMVPMatrix);
centreSphere.draw(outerMVPMatrix);

}

我的着色器很简单,

private final static String vertexShaderCode =
"uniform mat4 u_MVPMatrix;" +
"attribute vec4 a_Position;" +
"uniform vec4 u_Color;" +
"void main() {" +
" gl_Position = u_MVPMatrix * a_Position;" +
"}";
private final static String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 u_Color;" +
"void main() {" +
" gl_FragColor = u_Color;" +
"}";

我几乎省略了 Sphere 类的所有代码,以及其他我认为不需要的东西(?),但如果需要它们,我会把它们放上去。

最佳答案

欢迎来到 perspective distortion 的世界!

更多细节:您的视野太窄,您必须调整平截头体的形状,使其更大一些。

关于android - (OpenGL ES) 远离 View 中心的对象被拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457210/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com