2012-06-26 2 views
0

Привет всем, я пытаюсь реализовать 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. 

Любая помощь была бы принята с благодарностью! Благодарю.

ответ

0

Интересно, какой алгоритм вы реализовали. Является ли это методом лучевой кастинга к проблеме?

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

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

Это решение, как правило, является наиболее гибким и простым в реализации.

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

Имея цвет пикселя и таблицы цветов различных объектов, которые вы визуализировали, вы можете понять, что пользователь щелкнул с логической точки зрения.

Есть другие подходы к проблеме выбора объектов, это, вероятно, универсально признано самым быстрым.

Приветствия Маурицио

+0

я на самом деле понял. Это просто литье лучей и проверка пересечения с заданной плоскостью. Позднее я реализовал проверку того, насколько близки центры объектов вокруг луча, и если они достаточно близки, он выбирает этот объект. Спасибо хоть. – scssquatch

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