2012-06-26 84 views
0

嘿,我試圖在我的程序中實現3D拾取,並且如果我不從原點移動,它會很好地工作。這是完全準確的。但是如果我將模型矩陣從原點移開(視圖矩陣仍然在0,0,0),拾取矢量仍然從原始位置繪製。它應該仍然從視圖矩陣眼(0,0,0)繪製,但事實並非如此。這裏是我的一些代碼,看看你是否可以找出原因..3D模型矩陣翻譯之後挑選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

我不知道你已經實現了哪種算法。這是對這個問題的光線投射方法嗎?

我並沒有把注意力放在代碼本身上,但是這看起來太簡單了,它是一個完全可操作的光線投射解決方案。

在我卑微的經歷中,我想建議你,這取決於你最終項目的複雜性(我不知道)採用顏色選擇解決方案。

該解決方案通常是最靈活和最容易實施的。

它包含了以獨特的平面顏色渲染場景中的物體(通常您可以禁用着色器中的照明)到一個backbuffer ......一個紋理,然後獲取點擊(觸摸)的座標,然後讀取該特定座標中像素的顏色。

使用像素的顏色和渲染的不同對象的顏色表可以讓您理解用戶從邏輯角度單擊的內容。

還有其他的方法來解決對象拾取問題,這可能是普遍公認的最快的方法。

乾杯 毛裏齊奧

+0

我其實已經想通了。這只是投射射線並檢查與設置平面的交叉點。後來我實現了檢查物體中心與光線的距離有多近,如果足夠接近,它會選擇該物體。不過謝謝。 – scssquatch