2016-01-03 2 views
0

Я делаю 2d игру, используя opengl в android. У меня есть квадратный текстурированный спрайт, который я намерен использовать в качестве прыгающего шара. Проблема, с которой я столкнулся, касается перевода спрайта. Я использую единственную модельную матрицу как униформу моего вершинного шейдера. Я обновляю эту матрицу перед визуализацией каждого из спрайтов. Является ли это правильным методом?перевод сделан неправильно в opengl

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

Вот функция обновления класса спрайтов: -

public Ball(int textureID) { 
    texture = textureID; 
    //Stores location of the center of the ball 
    location = new Vector(300,350); 
    //The velocity of ball 
    speed = new Vector(0, 0); 
    //gravity acceleration 
    accel = new Vector(0, 2); 
    //Geometry of ball 
    rect = new Geometry.Rectangle(new Geometry.Point(location.getI() - RADIUS,location.getJ() - RADIUS, 0), 2*RADIUS, 2*RADIUS); 
    //Builder class to create vertex coordinates 
    builder = new ObjectBuilder(ObjectBuilder.RECTANGLE2D, true); 
    builder.generateData(rect, 0); 
    //Vertex Array holds the coordinates 
    vertexArray = new VertexArray(builder.vertexData); 
} 

public void update(float[] modelMatrix) { 
    Matrix.setIdentityM(modelMatrix, 0); 
    location.addVector(speed); 
    Matrix.translateM(modelMatrix, 0, speed.getI(), speed.getJ(), 0); 
    accel.setJ(1); 
    speed.addVector(accel); 
    accel.setI(-(0.3f * speed.getI())); 
} 

Мой Vertex шейдер: -

uniform mat4 u_Matrix; 
uniform mat4 u_ModelMatrix; 

attribute vec4 a_Position; 
attribute vec2 a_TextureCoordinates; 

varying vec2 v_TextureCoordinates; 

void main() { 
v_TextureCoordinates = a_TextureCoordinates; 
gl_Position = u_Matrix * u_ModelMatrix * a_Position; 
} 

Мой OnDrawFrame Функция: -

public void onDrawFrame(GL10 gl) {  
    textureShaderProgram.useProgram(); 
    ball.update(modelMatrix); 
    textureShaderProgram.setUniforms(projectionMatrix, modelMatrix); 
    ball.bindData(textureShaderProgram); 
    ball.render(); 
} 

ответ

0

Ваша функция обновления в неправильно. Вы переводите modelMatrix по скорости, а не по местоположению.

Matrix.translateM(modelMatrix, 0, speed.getI(), speed.getJ(), 0); 

Вы, вероятно, хотите что-то вроде:

Matrix.translateM(modelMatrix, 0, location.getI(), location.getJ(), 0); 

вашу скорость функций поясню как место теперь, которое увеличивается каждое обновление:

accel.setJ(1); 
speed.addVector(accel); 
accel.setI(-(0.3f * speed.getI())); 

speed первоначально (0, 0) и увеличивается на accel каждое обновление, которое всегда будет (0, 1) как -(0.3f * 0) = 0.

Поэтому ваш объект перемещается с постоянной скоростью (0, 1).

+0

Спасибо, это решило мою проблему. Btw - мой метод перевода объекта прямо ?? Я передаю эту матрицу модели в форму перед каждым рендерингом объекта. – AribAlam

+0

Должен ли я предоставить каждому объекту собственную матрицу модели или просто изменить его можно сделать – AribAlam

+0

Это правильный способ сделать это. Вы можете просто изменить эту матрицу каждый раз (однако вы все равно отправляете ее как униформу в шейдер при каждом ее изменении), однако я всегда предпочитаю хранить модельную матрицу для каждого объекта. – Reigertje

Смежные вопросы