I saw a lot of picking code opengl-es, but nothing worked. Can someone give me what am I missing?
My code is (from tutorials/forums)
Vec3 far = Camera.getPosition();
Vec3 near = Shared.opengl().getPickingRay(ev.getX(), ev.getY(), 0);
Vec3 direction = far.sub(near);
direction.normalize();
Log.e("direction", direction.x+" "+direction.y+" "+direction.z);
Ray mouseRay = new Ray(near, direction);
for (int n=0; n<ObjectFactory.objects.size(); n++) {
if (ObjectFactory.objects.get(n)!=null) {
IObject obj = ObjectFactory.objects.get(n);
float discriminant, b;
float radius=0.1f;
b = -mouseRay.getOrigin().dot(mouseRay.getDirection());
discriminant = b * b - mouseRay.getOrigin().dot(mouseRay.getOrigin()) + radius*radius;
discriminant = FloatMath.sqrt(discriminant);
double x1 = b - discriminant;
double x2 = b + discriminant;
Log.e("asd", obj.getName() + " "+discriminant+" "+x1+" "+x2);
}
}
my camera vectors:
//cam
Vec3 position =new Vec3(-obj.getPosX()+x, obj.getPosZ()-0.3f, obj.getPosY()+z);
Vec3 direction =new Vec3(-obj.getPosX(), obj.getPosZ(), obj.getPosY());
Vec3 up =new Vec3(0.0f, -1.0f, 0.0f);
Camera.set(position, direction, up);
and my picking code:
public Vec3 getPickingRay(float mouseX, float mouseY, float mouseZ) {
int[] viewport = getViewport();
float[] modelview = getModelView();
float[] projection = getProjection();
float winX, winY;
float[] position = new float[4];
winX = (float)mouseX;
winY = (float)Shared.screen.width - (float)mouseY;
GLU.gluUnProject(winX, winY, mouseZ, modelview, 0, projection, 0, viewport, 0, position, 0);
return new Vec3(position[0], position[1], position[2]);
}
My camera moving all the time in 3d space. and my actors/modells moving too. my camera is following one actor/modell and the user can move the camera on a circle on this model.
How can I change the above code to working?