opengl glulookat деформирующий объект

Во-первых, извините, я думаю, что у меня было несколько записей с похожими проблемами, но я не смог решить свою проблему, так как я не верю, что смог правильно объяснить свою проблему, надеюсь, грубо нарисованное изображение поможет объяснить мою проблему. введите здесь описание изображения

У меня есть квадрат, движущийся по моему миру по осям x и y, объект уходит с экрана и иногда возвращается, когда он движется. Я хочу использовать гироскоп в устройстве, чтобы получить значения, которые будут использоваться для изменения направления взгляда камеры, перемещая ее в направлении x и y, чтобы попытаться найти объект, когда он движется по миру. Это текущий код, который, кажется, искажает форму квадрата, когда я перемещаю устройство.

class SquareRenderer implements GLSurfaceView.Renderer {

private int counter = 0;
private boolean mTranslucentBackground;
private Square mSquare;
private float mTransY;
private float mTransX;
private float mAngle;
private Context context;

private float xPoint = 0.0f;
private float yPoint = 0.0f;


public SquareRenderer(boolean useTranslucentBackground,Context context) {
    mTranslucentBackground = useTranslucentBackground;
    this.context=context;
    mSquare = new Square();
}

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL11.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glTranslatef(mTransX, mTransY, -10.0f);
    GLU.gluLookAt(gl, 0.0f, 0.0f, 0.0f,(float) MainActivity.azimuth , (float) MainActivity.roll, 0.0f, 0.0f, 1, 0.0f);

    mSquare.draw(gl);
    //GLU.gluLookAt(gl, 0.0f, 0.0f, 0.0f, (float) MainActivity.azimuth, (float) MainActivity.roll, 0.0f, 0.0f, 1, 0.0f);
    Random rnd = new Random();

    float maxx = 180.0f;
    float minx = -180.0f;
    float maxy = 90.0f;
    float miny = -90.0f;

    if( xPoint == 0.0f && yPoint == 0.0f){
        xPoint = rnd.nextFloat()*(maxx-minx)+minx;
        xPoint = round(xPoint,1);
        yPoint = rnd.nextFloat()*(maxy-miny)+miny;
        yPoint = round(yPoint,1);

        Log.d("XPOINT    YPOINT",xPoint +"      " +yPoint);
    }
    if(mTransX != xPoint && xPoint>mTransX) {
        mTransX += 0.1f;
        mTransX = round(mTransX,1);
    }else if(mTransX != xPoint && xPoint<mTransX){
        mTransX -= 0.1f;
        mTransX = round(mTransX,1);
    }else if(mTransX == xPoint){
        xPoint = rnd.nextFloat()*(maxx-minx)+minx;
        xPoint = round(xPoint,1);
    }
    if(mTransY != yPoint && yPoint >mTransY) {
        mTransY += 0.1f;
        mTransY = round(mTransY,1);
    }else if(mTransY != yPoint && yPoint < mTransY){
        mTransY -= 0.1f;
        mTransY = round(mTransY,1);
    }else if(mTransY == yPoint){
        yPoint = rnd.nextFloat()*(maxy-miny)+miny;
        yPoint = round(yPoint,1);
    }
}

public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);
    float ratio = (float) width / height;
    gl.glMatrixMode(GL11.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glDisable(GL11.GL_DITHER);
    gl.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_FASTEST);
    gl.glClearColor(0,0,0,0);
    gl.glEnable(GL11.GL_CULL_FACE);
    gl.glShadeModel(GL11.GL_SMOOTH);
    gl.glEnable(GL11.GL_DEPTH_TEST);
}

public static float round(float d, int decimalPlace) {
    BigDecimal bd = new BigDecimal(Float.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.floatValue();
}

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


person user3074140    schedule 21.10.2015    source источник


Ответы (1)


Почему вы до сих пор используете азимут и крен как декартовы компоненты вектора? Это полярные координаты, и их необходимо преобразовать с помощью функций тригонометрии или использовать с методами поворота матрицы.

Хотя это кажется вашей основной проблемой, я могу ошибаться. Вам нужна система того, как на самом деле идентифицировать проблему. Как насчет того, чтобы сначала добавить несколько сенсорных событий, которые включают камеру при перетаскивании, чтобы увидеть, получите ли вы ожидаемые результаты. Они должны имитировать ваши значения азимута и крена.

Что касается интеграции гироскопа с камерой, то здесь уже есть несколько ответов. Даже для Android, таких как один

person Matic Oblak    schedule 22.10.2015