У меня есть следующий метод, который называют, когда пользователь нажимает позицию по экрану:
public void setup(int xi, int yi){
int f = 0;
PerspectiveCamera camera = new PerspectiveCamera();
camera.setViewport(320, 508);
camera.update();
Ray touch = camera.getPickRay(xi, yi);
while(f < GLCamTest.array.length){
//Vertex 1
float x1 = GLCamTest.array[f];
f++;
float y1 = GLCamTest.array[f];
f++;
float z1 = GLCamTest.array[f];
f++;
//Vertex 2
float x2 = GLCamTest.array[f];
f++;
float y2 = GLCamTest.array[f];
f++;
float z2 = GLCamTest.array[f];
f++;
//Vertex 3
float x4 = GLCamTest.array[f];
f++;
float y4 = GLCamTest.array[f];
f++;
float z4 = GLCamTest.array[f];
f++;
//Vertex 4
float x5 = GLCamTest.array[f];
f++;
float y5 = GLCamTest.array[f];
f++;
float z5 = GLCamTest.array[f];
f++;
Intersector sect = new Intersector();
float z3 = 10;
//Mid-point formula
float x3 = (x2+x4)/2;
float y3 = (y2+y4)/2;
//Triangle one is (x1,y1), (x2,y2), (x3, y3)
//Triangle two is (x4, y4), (x5, y5), (x3, y3)
//Now, I have my 2 tri-angles I need for the
// Polygon test..
Vector3 t1 = new Vector3(x1,y1,z1);
Vector3 t2 = new Vector3(x2,y2,z2);
Vector3 t3 = new Vector3(x3,y3,z3);
Vector3 t4 = new Vector3(x4,y4,z4);
Vector3 t5 = new Vector3(x5,y5,z5);
if(sect.intersectRayTriangle(touch, t1, t2, t3, t4)
== true){
System.out.println("TOUCHED AN OBJECT!!");
if (f <= 12){
System.out.println("SQUARE 1");
} else if(f <= 24 && f >=13){
System.out.println("SQUARE 2");
} else if(f <= 36 && f >= 25){
System.out.println("SQUARE 3");
}
}
if(sect.intersectRayTriangle(touch, t4, t5, t3, t1)
== true){
System.out.println("TOUCHED AN OBJECT!!");
if (f <= 12){
System.out.println("SQUARE 1");
} else if(f <= 24 && f >=13){
System.out.println("SQUARE 2");
} else if(f <= 36 && f >= 25){
System.out.println("SQUARE 3");
}
}else{
System.out.println("NO TOUCH");
}
}
f = 0;
}
В основном класс берет в экранных co-порядках, которые были нажаты, настраивает область просмотра и все матрицы, это затем генерирует Луч. После того как луч сгенерирован, он берет каждую вершину и вставляет его его собственное Vector3
это затем тестирует, делает луч, пересекают любую из точек. В методе говорится, что луч пересекается "SQUARE2"
в определенные точки на экране независимо, если существует объект там или нет.. почему? что могло вызывать это? Как я фиксирую его?
править:
Это совершает нападки, если оператор "SQUARE2" каждый раз, когда это думает, что "находит" объект. Это только находит пересечение, когда я поразил "середину" экрана (это - то, где объекты могли быть оттянуты), но Это только показывает пересечение для первого если оператор на левой стороне середины экрана и второго для правой стороны середины экрана
Так, например, это только думает, что затронуло, квадратные 2 в точках отметили X, где Прямоугольник является экраном телефонов.
_________
| |
| |
|X X|
| |
|_______|
Другие методы, в которые я звоню для трассировки лучей, расположены в другом проекте.. http://code.google.com/p/libgdx/source/browse/#svn/trunk/gdx/src/com/badlogic/gdx/math (Папка Graphics имеет Перспективную Камеру, которая содержит getPickRay();
и Intersector
содержит другой).
edit2: кажется, что это берет правильное местоположение, где объекты МОГЛИ быть всего лишь, они в настоящее время не могут происходить из-за мира, вращающегося, таким образом, это, кажется, просто имеет проблемы с мировым вращением.. Вот то, как я поворачиваю мир...
public void onDrawFrame(GL10 gl) {
onDrawFrameCounter++;
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
bindCameraTexture(gl);
float bear = Global.bearing;
gl.glLoadIdentity();
gl.glNormal3f(0,0,1);
gl.glRotatef(bear, 0, 1, 0);
int e = 0;
for(int q=0; q < Global.cubes;q++){
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, e, 4);
e = e+4;
}
}
Как я скорректировал бы свой код так, чтобы он распознал, когда объекты будут НА САМОМ ДЕЛЕ на экране?
поверните камеру - то, что ваш класс камеры не поддерживает - а затем используйте его метод setMatrices вместо
gl.glLoadIdentity();
gl.glNormal3f(0,0,1);
gl.glRotatef(bear, 0, 1, 0);
- > Вам нужна камера лучшего класса