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;
}