【发布时间】:2017-02-18 00:38:02
【问题描述】:
我想将画布鼠标坐标传递给一个以鼠标坐标为中心以交互方式生成圆的函数。因此,我使用以下函数进行归一化:
var mousePositionX = (2*ev.clientX/canvas.width) - 1;
var mousePositionY = (2*ev.clientY/(canvas.height*-1)) + 1;
但是,这仅适用于屏幕中心。当围绕光标移动鼠标时,不再位于圆的中心: see the picture here
鼠标光标离屏幕中心越远,它离圆心的位置就越大。 以下是一些相关代码:
HTML
body {
border: 0;
margin: 0;
}
/* make the canvas the size of the viewport */
canvas {
width: 100vw;
height: 100vh;
display: block;
}
...
<body onLoad="main()">
<canvas id="glContext"></canvas>
</body>
着色器
<script id="vShaderCircle" type="notjs">
attribute vec4 a_position;
uniform mat4 u_viewMatrix;
void main(){
gl_Position = u_viewMatrix * a_position;
}
</script>
JS
function main(){
// PREPARING CANVAS AND WEBGL-CONTEXT
var canvas = document.getElementById("glContext");
var gl_Original = initWebGL(canvas);
var gl = WebGLDebugUtils.makeDebugContext(gl_Original);
resize(canvas);
gl.viewport(0, 0, canvas.width, canvas.height);
// ----------------------------------
...
// MATRIX SETUP
var viewMatrix = new Matrix4();
viewMatrix.setPerspective(30, canvas.width/canvas.height, 1, 100);
viewMatrix.lookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
// ----------------------------------
canvas.addEventListener("mousemove", function(){stencilTest(event)});
function stencilTest(ev){
var mousePositionX = (2*ev.clientX/canvas.width) - 1;
var mousePositionY = (2*ev.clientY/(canvas.height*(-1))) + 1;
...
...
drawCircle(..., mousePositionX, mousePositionY, viewMatrix);
...
drawCube(...);
}
}
我该如何解决这个问题?
【问题讨论】:
-
您可能需要发布一些代码。你提到你有一个视图矩阵。如果您在某些评论中有一个视图矩阵,那么您就没有在 WebGL 的坐标系(即剪辑空间)中工作。相反,您正在使用您定义的其他坐标系,我们无法帮助您将鼠标坐标转换到该空间,除非您向我们展示 codez
-
@gman 所以我现在提供了更多代码。你能从中找出问题所在吗?各个函数(例如矩阵函数)做他们应该做的事情。我也尝试了您的
getRelativeMousePosition()功能,但没有成功... -
更新了我的答案
标签: javascript webgl coordinate-systems