WebGL Canvas 图形学

JS-Snippet:获取鼠标在窗口、canvas、WebGL坐

2018-05-31  本文已影响0人  LinnChu
//获取canvas元素的宽高
function getElementOfRect(element) {
    var rect = element.getBoundingClientRect();
    var eInfo = {
        width: rect.width,
        height: rect.height,
        top: rect.top,
        left: rect.left        
    };
    
    return eInfo;
}

//获取鼠标在浏览器窗口的坐标(始终以浏览器左上角为原点)
function getMouseOnWindow(event) {
    var wPos = {
        wx : event.clientX,
        wy : event.clientY
    };
    
    return wPos;
}

//根据鼠标在浏览器窗口的坐标,转化为鼠标在canvas元素上的坐标
function windowToCanvas(canvas, wx, wy) {
    var eInfo = getElementOfRect(canvas);
    var cx = wx - eInfo.left;
    var cy = wy - eInfo.top;
    
    var cPos = {
        cx : cx,
        cy : cy
    };
    
    return cPos;
}

//根据canvas坐标,转换为WebGL坐标
function cavasToWebGL(canvas, cx, cy) {
    //需要先获取canvas画布的宽高
    var width = getElementOfRect(canvas).width;
    var height = getElementOfRect(canvas).height;
    //先移动
    var gtx = cx - width / 2;
    var gty = height / 2 - cy;
    //后缩放
    var gsx = 2 * gtx / width;
    var gsy = 2 * gty / height;
    
    var gPos = {
        gx : gsx,
        gy : gsy
    };
    return gPos;
}

window.onload = function main() {
    var canvas = document.getElementById("webgl");

    canvas.onclick = function(event) {
        var width = getElementOfRect(canvas).width;
        var height = getElementOfRect(canvas).height;
        var top = getElementOfRect(canvas).top;
        var left = getElementOfRect(canvas).left;
        console.log("canvas元素的宽高为:\nW: " + width + " H: " + height + "\n此时距浏览器顶端和左端的距离分别是:\nTop: " + top + " Left: " + left);
        
        var wPos = getMouseOnWindow(event);
        console.log("\n此时鼠标点击时相对于浏览器窗口的位置是:\nX: " + wPos.wx + " Y:" + wPos.wy);

        var cPos = windowToCanvas(canvas, wPos.wx, wPos.wy);
        console.log("\n此时鼠标点击时相对于canvas元素的位置是:\nX: " + cPos.cx + " Y:" + cPos.cy);

        var gPos = cavasToWebGL(canvas, cPos.cx, cPos.cy);
        console.log("\n此时鼠标点击时相对于WebGL的位置是:\nX: " + gPos.gx + " Y:" + gPos.gy);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读