当前位置: 首页 > article >正文

鼠标事件与webGl坐标系

弯道超车:

盒子模型:

又称CSS 盒模型,包含contentpaddingbordermargin 四个部分。

clientWidth、scrollWidth、offsetWidth之间的区别:

        offsetWidth:包含内容、paddingborder 和滚动条的宽度(如果有滚动条),但不包含 margin

        clientWidth:元素的可见内容区域和padding的宽度,但不会包括边框和滚动条

        scrollWidth:包含内容的完整宽度(包括溢出部分,即滚动条),但不含 border,margin

webGL坐标系:

        WebGL 采用的标准坐标系范围为 [−1,1]

                X 轴:水平轴,从左到右,范围为 -1 到 1。

                Y 轴:垂直轴,从下到上,范围为 -1 到 1。

                Z 轴:深度轴,从屏幕前到后,靠近观察者的为 -1,远离观察者的为 1。

        

html和脚本js:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>测试</title>
  <script src="./lib/webgl-utils.js"></script>
  <script src="./lib/webgl-debug.js"></script>
  <script src="./lib/cuon-utils.js"></script>
  <script src="./js/clickPoint.js"></script>
</head>

<body onload="main()">
  <canvas id="canvas" width="400" height="400"></canvas>
</body>

</html>

// clickPoint.js
var vshader_source = `
attribute vec4 a_Position;
void main(){
  gl_Position = a_Position;
  gl_PointSize = 10.0;
}
`
var fshader_source = `
void main(){
  gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
`
function main () {
  var canvas = document.getElementById('canvas')
  var gl = getWebGLContext(canvas)

  if (!gl) {
    console.log('获取webGl绘图上下文失败')
    return
  }
  if (!initShaders(gl, vshader_source, fshader_source)) {
    console.log('初始化着色器失败')
    return
  }
  var a_Position = gl.getAttribLocation(gl.program, 'a_Position')
  if (a_Position < 0) {
    console.log('获取attribute变量a_Position失败')
    return
  }
  // 注册鼠标点击事件
  // function (ev) { ... } 是一个匿名函数,作为参数传递给click函数,匿名函数可以访问main函数中的变量
  canvas.onmousedown = function (ev) {
    click(ev, gl, canvas, a_Position)
  };
  gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);
  gl.clearColor(0.0, 0.0, 0.0, 1.0)
  gl.clear(gl.COLOR_BUFFER_BIT)
  gl.drawArrays(gl.POINTS, 0, 1)
}
var g_ponints = []; // 存储点击位置的数组
// 获取鼠标点击位置并存储在一个数组中
function click (ev, gl, canvas, a_Position) {
  // 鼠标点击浏览器的坐标
  var x = ev.clientX; // 鼠标点击位置的x坐标
  var y = ev.clientY; // 鼠标点击位置的y坐标
  var rect = ev.target.getBoundingClientRect()
  // 画布的原点rect.left 和 rect.top
  // canvas.width/2 和 canvas.height/2 是canvas的中心点 即WedGL坐标系的中心点
  x = ((x - rect.left) - canvas.height / 2) / (canvas.height / 2)
  y = (canvas.width / 2 - (y - rect.top)) / (canvas.width / 2)
  // 将坐标存储在数组中
  // g_ponints.push(x);
  // g_ponints.push(y);
  g_ponints.push([x, y])
  // 清空canvas
  gl.clear(gl.COLOR_BUFFER_BIT)
  // 根据数组中的点绘制图形
  for (var i = 0; i < g_ponints.length; i += 2) {
    // 将点的位置传输到a_Position变量中
    // gl.vertexAttrib3f(a_Position, g_ponints[i], g_ponints[i + 1], 0.0);
    var xy = g_ponints[i]
    gl.vertexAttrib3f(a_Position, xy[0], xy[1], 0.0);
    // 绘制点
    gl.drawArrays(gl.POINTS, 0, 1)
  }
}

最终效果:


http://www.kler.cn/a/370247.html

相关文章:

  • Elasticsearch(ES)基础查询语法的使用
  • 图的基本概念
  • Golang 中强大的重试机制,解决瞬态错误
  • Qt基础项目篇——Qt版Word字处理软件
  • 免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
  • 从零开始:Spring Boot核心概念与架构解析
  • RayLink为企业提供高效安全的远程办公环境
  • 架构师备考-非关系型数据库
  • 贵州鑫宏远农业-始终致力于推动现代农业的科技创新与发展
  • 使用 FastGPT + Ollama 搭建本地 AI 客服小助手
  • 【封装小程序log,设定层级】
  • opencv - py_ml - py_kmeans
  • Vue.js从入门到精通 — 基础知识
  • 医学影像基础:常见的医学影像学术语和概念
  • 商场应急管理:SpringBoot技术解决方案
  • 后端:Spring-1
  • 智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT
  • canvas基础学习(鼠标点位拖拽)
  • 为什么有的说法是STM32有60个外部中断,有的说法是有23个中断
  • vscode中提升效率的插件扩展——待更新
  • 基于Distil-Whisper的实时ASR【自动语音识别】
  • python实战项目47:Selenium采集百度股市通数据
  • 电商 API 接口:提升用户体验的关键路径深度解析
  • AtCoder ABC376A-D题解
  • 雷池社区版compose文件配置讲解--fvm
  • 分布式并发场景的核心问题与解决方案