取消对象选择的结果

时间:2014-06-14 16:04:32

标签: opengl matrix webgl matrix-multiplication

Web上有几个引用,包括stackoverflow。我有一个unproject方法,返回x,y坐标,返回范围为-1和1.我想知道这些值是否正确。如果是这样,那么我如何处理这些值,将相机位置乘以?

参考:How to convert mouse coordinate on screen to 3D coordinate

更新

  

我在我的矩阵库中发现了一个错误,我错过了一些矩阵   组件,我认为它是在乘法方法中。固定后   这个,我不再获得-1到1的范围。

     

现在我的数据(刚从Unproject方法返回)看起来像   这样:

When I click on Canvas pixel coord's (1, 2), I get a start vector
(near value of 0) of approx. (9.660, 3.001, 8.091). A end vector (far
value of 1) of approx. (-67.002, 4.408, -107.016).
  

虽然这似乎好一点(不再在-1和1的范围内)   向量不再从近到远指向屏幕(如   你可以从返回的开始和结束向量告诉。)

     

我希望我有另一个可以修复的错误。请告诉我和我   将发布相关的数学函数。

已更新w /顶点着色器详细信息

我正在添加这个因为我开始怀疑我的UnProject方法是否使用了错误的矩阵。 我的顶点着色器计算顶点位置,如下所示:

  

gl_Position = projectionMatrix * viewmatrix * modelMatrix *   attribPosition;

混杂。信息

  
      
  • 仅供参考,我的画布是640 x 480.
  •   
  • 我专注于通过点击Canvas的左上角来测试非投影。
  •   
  • 我的投影设置为:FOV = 60,近= 0.1,远= 100. Up =(0,1,0),LookAt =(0,0,0)。
  •   

我的UnProject实施 这是我的unproject函数,它几乎是这里发布的一个副本(注意它不是一个精确的副本而且我使用自己的矩阵函数):How to convert mouse coordinate on screen to 3D coordinate

function unProject(x, y, z) {
var mat = this.renderer.projMatrix.Clone();
mat.Multiply(this.renderer.viewMatrix);

var m = mat.GetInverseOf();
var viewPort = this.Viewport;

// invert due to opengl thing.
y = viewPort.Height - y;

var inverse = new Vertex4f();
inverse.X = (x - viewPort.X) / viewPort.Width * 2 - 1;
inverse.Y = (y - viewPort.Y) / viewPort.Height * 2 - 1;
inverse.Z = 2 * z - 1;
inverse.W = 1;

// to world coordinates.
var vector = m.MultiplyVector4(inverse);
if (vector.W == 0) {
    return null;
}

vector.W = 1 / vector.W;

var worldCoordinates = new Vertex3f();
worldCoordinates.X = vector.X * vector.W;
worldCoordinates.Y = vector.Y * vector.W;
worldCoordinates.Z = vector.Z * vector.W;

return worldCoordinates;
}

0 个答案:

没有答案