鼠标事件与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)
  }
}

最终效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Camp4-L0:Linux 前置基础

书生浦语大模型实战营Camp4-L0:Linux前置基础 教程地址&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux任务地址&#xff1a;https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/linux/task.md 任务描述完成所需时间闯关任务完成SSH连接与…

「虚拟现实中的心理咨询:探索心灵世界的新方法」

内容概要 当我们想到虚拟现实时&#xff0c;很多人会联想到游戏或娱乐&#xff0c;但如今其在心理咨询领域的应用正在逐渐崭露头角。传统的心理咨询方式常常局限在咨询室内&#xff0c;面临着空间和情感隔阂的问题。然而&#xff0c;沉浸式环境的出现&#xff0c;使得治疗者能…

python:ADB通过包名打开应用

一、依赖库 os 二、命令 1.这是查看设备中所有应用包名的最简单方法。只需在命令行中输入以下命令&#xff1a; adb shell pm list packages 2.打印启动的程序包名 adb shell am monitor回车&#xff0c;然后启动你想要获取包名的那个应用&#xff0c;即可获得 3.查看正在运…

【面试每日一题之CSS】2、line-height和heigh区别

line-height和heigh区别 前言1、试题分析讲解2、代码模块眼见为实3、效果对比 前言 随着就业形式的压力&#xff0c;很多人都可能面临着待业&#xff0c;再就业的情况&#xff0c;那么在乾坤未定之际好好的丰实自己的羽翼吧&#xff0c;没有啥比壮大自己重要&#xff0c;所以我…

ICLR25初审稿按照自己喜好整理自己需要的(逐渐更新)

ICLR25初审稿按照自己喜好整理自己需要的&#xff08;逐渐更新) 光谱GNN合集&#xff08;10.29初筛&#xff09; 数据集 大类数据集名称pygcora &#xff0c;citeseer &#xff0c;pubmed&#xff0c;cornell&#xff0c;texas&#xff0c;wisconsin,flickr,reddit,actor,ph…

QT实时显示日志内容

性能有待提高&#xff1b; 能够读取指定目录下的日志文件&#xff0c;显示在下拉框中。 选择某一个日志之后&#xff0c;点击获取数据按钮&#xff0c;能够实时刷新日志内容。 但是每次刷新都会对整个文件进行读取&#xff0c;文本框重新加载文本。效率很低&#xff0c;影响性能…

服务器数据恢复—异常断电导致服务器挂载分区无法访问的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌服务器同品牌存储&#xff0c;Linux centos7EXT4文件系统。 服务器故障&#xff1a; 意外断电导致服务器操作系统不能正常启动。经过修复后系统可以正常启动&#xff0c;但是挂载的分区无法正常访问。使用fsck修复这个问题分区&#xff…

驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)

驾校管理系统平台 目录 基于java和小程序的驾校管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#…

GaussDB高智能--自治运维技术(下)

书接上文GaussDB高智能--自治运维技术&#xff08;中&#xff09;&#xff0c;从日志分析、慢SQL发现、慢SQL诊断、集群故障根因诊断等方面介绍了GaussDB的自治运维技术&#xff0c;本篇将从索引推荐、分布键推荐、参数调优等三方面继续解读GaussDB的自治运维技术。 8 索引推荐…

【Linux】基础IO-下

目录 1、重定向 2、缓冲区 3、简单模拟实现C文件标准库 1、重定向 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h>#define filename "log.txt&qu…

Java(三十) --- 基于比较的七大比较的排序算法(巨详细)

文章目录 前言1. 排序的概念和引用2.直接插入排序3.希尔排序(缩小增量排序)4. 直接选择排序5. 堆排序6. 冒泡排序7.快速排序7.1.Hoare法7.2.挖坑法7.3.快速排序的优化7.4.非递归方法 8.归并排序8.1.递归方法8.2.非递归方法8.3 海量数据的排序问题 9. 七大比较排序的复杂度以及稳…

构建安全基石:网络安全等级保护定级指南

在数字化时代&#xff0c;网络安全已成为企业与个人不可忽视的重要课题。网络安全等级保护定级指南&#xff0c;作为国家指导网络安全保护的重要文件&#xff0c;为各类机构提供了精准的安全防护蓝图。本文旨在深度解析网络安全等级保护定级指南的精髓&#xff0c;助力建构全面…

Docker-在Centos中部署Shell脚本获取镜像并构建容器

环境准备 1.Centos 7系统 参考&#xff1a;Centos安装 2.demo镜像推送到阿里云 参考demo镜像推送到阿里云 Centos操作 1.修改demo中相关配置springboot-docker-demo\bin\docker-deploy.sh ## 仓库地址 REGISTRY_SERVER公有网络域名 ## 用户名 USERNAME阿里云账号 ## 密码 P…

背包问题全解

文章目录 01背包一、01背包模板二、采药三、装箱问题四、宠物小精灵之收服五、数字组合 完全背包六、完全背包模板七、买书八、货币系统&#xff08;简单版&#xff09;九、货币系统&#xff08;进阶版&#xff09; 01背包 一、01背包模板 还有个疑惑&#xff0c;为什么最大价…

【高阶数据结构】红黑树的插入(超多精美图解+完整代码)

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《高阶数据结构》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多《高阶数据结构》点击专栏链接查看&a…

51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)

实现目标 1、巩固数码管、外部中断知识 2、具体实现&#xff1a;按键K4&#xff08;INT1&#xff09;每按一次&#xff0c;数码管从0依次递增显示至F&#xff0c;再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为&#xff…

MacOS上Homebrew 安装、配置、更改国内镜像源及使用教程

Homebrew笔记 1. 介绍 官网&#xff1a;https://brew.sh/ 对于习惯了使用命令来完成一切的程序员来说&#xff0c;安装软件这种小事&#xff0c;自然是能够用命令解决&#xff0c;就不用图形界面选择。但是在 Linux 中&#xff0c;我们有 yum、apt、dnf、pkg等命令来完成软件的…

LeetCode 热题 100之链表1

1.相交链表 思路分析&#xff08;直接上双指针&#xff09;&#xff1a; 初始化两个指针&#xff0c;分别指向两个链表的头节点 headA 和 headB遍历两个链表&#xff0c;当指针到达链表的末尾时&#xff0c;将指针移动到另一个链表的头部 如果链表相交&#xff0c;两个指针会在…

【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现

开题报告 围场县拥有丰富的自然景观和野生动植物资源&#xff0c;同时面临着旅游业发展和自然保护之间的平衡问题&#xff0c;通过强调自然保护&#xff0c;这个平台可以教育游客如何尊重和保护当地的生态环境。同时&#xff0c;平台还可以提供关于生态保护的信息&#xff0c;…

立仪光谱共焦在玻璃上奥秘与应用

在现代工业和科学研究中&#xff0c;玻璃因其透明、坚硬和易加工的特性被广泛应用于各个领域。然而&#xff0c;玻璃的厚度测量一直是困扰业界的一大难题。传统的千分尺或电容式传感器虽然在一定程度上能满足生产需求&#xff0c;但在精度、效率以及适用范围上存在明显的局限。…