Привет всем, я пытаюсь реализовать 3D-подборку в своей программе, и она отлично работает, если я не перехожу от источника. Это совершенно точно. Но если я отложу модельную матрицу от начала координат (глаз зрения будет все еще на 0,0,0), то векторы комплектования по-прежнему выводятся из исходного местоположения. Он должен все же рисовать из глазной матрицы зрения (0,0,0), но это не так. Вот некоторые из моего кода, чтобы узнать, можете ли вы узнать, почему ..3D Picking OpenGL ES 2.0 после перевода матрицы модели
Vector3d near = unProject(x, y, 0, mMVPMatrix, this.width, this.height);
Vector3d far = unProject(x, y, 1, mMVPMatrix, this.width, this.height);
Vector3d pickingRay = far.subtract(near);
//pickingRay.z *= -1;
Vector3d normal = new Vector3d(0,0,1);
if (normal.dot(pickingRay) != 0 && pickingRay.z < 0)
{
float t = (-5f-normal.dot(mCamera.eye))/(normal.dot(pickingRay));
pickingRay = mCamera.eye.add(pickingRay.scale(t));
addObject(pickingRay.x, pickingRay.y, pickingRay.z+.5f, Shape.BOX);
//a line for the picking vector for debugging
PrimProperties a = new PrimProperties(); //new prim properties for size and center
Prim result = null;
result = new Line(a, mCamera.eye, far);//new line object for seeing look at vector
result.createVertices();
objects.add(result);
}
public static Vector3d unProject(
float winx, float winy, float winz,
float[] resultantMatrix,
float width, float height)
{
winy = height-winy;
float[] m = new float[16],
in = new float[4],
out = new float[4];
Matrix.invertM(m, 0, resultantMatrix, 0);
in[0] = (winx/width) * 2 - 1;
in[1] = (winy/height) * 2 - 1;
in[2] = 2 * winz - 1;
in[3] = 1;
Matrix.multiplyMV(out, 0, m, 0, in, 0);
if (out[3]==0)
return null;
out[3] = 1/out[3];
return new Vector3d(out[0] * out[3], out[1] * out[3], out[2] * out[3]);
}
Matrix.translateM(mModelMatrix, 0, this.diffX, this.diffY, 0); //i use this to move the model matrix based on pinch zooming stuff.
Любая помощь была бы принята с благодарностью! Благодарю.
я на самом деле понял. Это просто литье лучей и проверка пересечения с заданной плоскостью. Позднее я реализовал проверку того, насколько близки центры объектов вокруг луча, и если они достаточно близки, он выбирает этот объект. Спасибо хоть. – scssquatch