arcore中提供了根據螢幕座標、視口大小及view、 project矩陣計算從螢幕座標發射一條射線的方法,此方法用於3d拾取。
1class
ray
1011
//根據螢幕座標計算射線——3d拾取
12public
static ray screenpointtoray(vector2f point, vector2f viewportsize, float
viewprojmtx) ;//
遠*面上的座標透視除法之後的值
18float nearscreenpoint = new
float;//
**面上的座標透視除法之後的值
1920
float nearplanepoint = new
float[4];//
用於記錄世界座標系下,**面上的點
21float farplanepoint = new
float[4];//
用於記錄世界座標系下,遠*面上的點
2223
float invertedprojectionmatrix = new
float[16];
24 matrix.setidentitym(invertedprojectionmatrix, 0);
25 matrix.invertm(invertedprojectionmatrix, 0, viewprojmtx, 0);//
計算逆矩陣
2627 matrix.multiplymv(nearplanepoint, 0, invertedprojectionmatrix, 0, nearscreenpoint, 0);//
計算世界座標系中,對應到**面的座標
28 matrix.multiplymv(farplanepoint, 0, invertedprojectionmatrix, 0, farscreenpoint, 0);
2930 vector3f direction = new vector3f(farplanepoint[0] / farplanepoint[3], farplanepoint[1] / farplanepoint[3], farplanepoint[2] / farplanepoint[3]);
31 vector3f origin = new vector3f(new vector3f(nearplanepoint[0] / nearplanepoint[3], nearplanepoint[1] / nearplanepoint[3], nearplanepoint[2] / nearplanepoint[3]));
32direction.sub(origin);
33direction.normalize();
34return
newray(origin, direction);
35}
36 }
原理:一、世界座標系的點p1轉化到投影空間得到點p2的公式是:p2 = p1 * viewmatrix * projectmatrix = p1 * viewprojmatrix;
在渲染管線中,投影空間的點還需要經過透視除法,轉化到x , y , z值均為[-1,1]區間內,是乙個單位立方體。公式是:point_clip = p2/p2.w;
那麼將點從單位立方體座標系轉化到世界座標系的公式跟上述情況是逆過程,公式:
p2 = point_clip * wvalue;
p1 = p2 * viewprojmatrix_invert;
其中wvalue代表給定的w值,在arcore中此值為1,所以並未體現在**中。
二、上面**片段,是將螢幕上的點的x,y座標值均轉化到[-1,1],給定*裁剪*面的點的z為-1,遠裁剪*面上的點的z為1,其w值均為1,這種方法得到透視除法後單位立方體中的座標。
因為wvalue為1,所以此時farscreenpoint和nearscreenpoint就代表投影空間中的座標點。
然後根據(一)中的結論即可得到對應到世界座標系的座標點,根據兩個點可得到射線方法,最終即可得到射線的起點和方向。
計算機螢幕座標系
常用的螢幕座標系有如下圖所示的兩種 螢幕座標系和視窗客戶區座標系最明顯的區別在於座標原點,螢幕座標系的座標原點在 整個螢幕的左上角 而視窗客戶區座標系的座標原點在視窗客戶區的左上角,通常這兩個點是不重合的。一 裝置座標和邏輯座標 裝置座標 device coordinate 又稱為物理座標 phys...
OpenGL中的螢幕座標和世界座標的轉換
glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz gldouble posx,posy,posz glpushmatrix 變換要繪圖函式裡的順序一樣,否則座標轉換會產生錯誤 gl...
GIS 中地理座標和螢幕座標的標準轉換方法
在gis中,當你拿到乙個圖層的地理座標後,如果需要繪製到螢幕上,那麼不可避免的需要在地理座標和螢幕座標之間進行轉換,轉換的方法相信每乙個做gis的都會有自己的實現方法,本文描述的是和arcgis wms openlayers完全一致的座標轉換方法,當然這三個工具 標準 指令碼也是採用的相同的方法 因...