WebGL";项目“;功能

WebGL";项目“;功能,webgl,Webgl,嗨,有人能帮我做以下事情吗 我需要在WebGL场景中进行世界到屏幕的转换 保持非常简单,我正在渲染一条从原点(0,0,0)到点(1,0,0)的线,我想找到线(1,0,0)末端的屏幕(x,y)位置,并在那里放置一个画布元素,显示字母x 如何将该点转换为屏幕坐标 我几乎完成了,但是有一些缩放问题 我正在使用glMatrix,在我的渲染代码中,我有: mat4.perspective(45, this.m_WebGLContext.viewportWidth / this.m_WebGLContext

嗨,有人能帮我做以下事情吗

我需要在WebGL场景中进行世界到屏幕的转换

保持非常简单,我正在渲染一条从原点(0,0,0)到点(1,0,0)的线,我想找到线(1,0,0)末端的屏幕(x,y)位置,并在那里放置一个画布元素,显示字母x

如何将该点转换为屏幕坐标

我几乎完成了,但是有一些缩放问题

我正在使用glMatrix,在我的渲染代码中,我有:

mat4.perspective(45, this.m_WebGLContext.viewportWidth / this.m_WebGLContext.viewportHeight, 0.1, 100.0, this.m_projectionMatrix);
this.m_modelViewMatrix = mat4.lookAt(this.m_eye, this.m_centre, this.m_up);
我有一个视图矩阵和一个投影矩阵。我的转换函数如下:

FieldViewer.prototype.Project = function(xzyArray, viewMatrix, projectionMatrix, nViewportWidth, nViewportHeight)
{
    var viewProjectionMatrix = mat4.create();
    mat4.multiply(projectionMatrix, viewMatrix, viewProjectionMatrix);

    var point3D = [0,0,0];
    mat4.multiplyVec3(viewProjectionMatrix, xzyArray, point3D);

    var nWinX = Math.round(((point3D[0] + 1) / 2.0) * nViewportWidth);
    var nWinY = Math.round(((1 - point3D[1]) / 2.0) * nViewportHeight);

    return [nWinX, nWinY];
}
它有效,但不完全有效。如果我用点[1,0,0]来调用它,那么返回的屏幕x,y与绘制的线的端点不一致,但是is始终位于线上(在它的端点之前或之后)

这里的一个线索一定是,当我改变眼睛位置来旋转场景时,计算出的屏幕点(如我所说)在这条线上(但与1,0.0处的终点不重合)但是,当我用鼠标滚轮将相机拉远或朝向原点时,场景会正确地缩小,但上面的函数始终返回相同的值。我的缩放功能只是修改m_eye,使其朝向或远离原点。我看到这条线越来越大越来越小,但“x”一点也不动。但是,如果我围绕原点旋转眼睛的位置,它会正确移动