首页 > 其他分享 >归一化坐标

归一化坐标

时间:2023-06-12 16:14:27浏览次数:38  
标签:container getBoundingClientRect 三维 坐标 归一化 屏幕

归一化坐标

​ 归一化坐标,是一个二维坐标,仅有X/Y两个维度,且X和Y的取值范围均为[-1, 1],坐标原点位于three.js所创建的canvas的中心处。
​ 关于【归一化坐标】的具体概念,可以去百度搜索,我这里说一下我自己的一些见解,主要是作为一个使用者,应该如何去看待这个东西。疏漏之处,还请指正。
​ 要了解归一化坐标,有这么两个前置概念:屏幕坐标三维坐标
​ 其中,屏幕坐标指的就是物理屏幕上是坐标,三维坐标指的则是three.js所创建的这个逻辑上的三维世界中的坐标。屏幕坐标以【像素(px)】为单位,三维坐标以三维世界中的【单位1】为单位。屏幕坐标的取值范围是屏幕是像素数(X对应横向长度,y对应纵向长度),三维坐标的取值范围的无穷(z/y/z三个轴均如此)。屏幕坐标的坐标系原点在屏幕的左上角(页面的左上角),三维坐标的坐标系原点在三维世界的中心。
​ 现在,我有一个屏幕坐标,使用起来很简单;我也可以创建一个三维坐标,使用起来也很简单。但是,如果我想要把一个屏幕坐标转换为三维坐标使用呢?这时,就要使用一个中间值了,这个中间值,也就是这个【归一化坐标】。也就是说,作为一个使用者,可以将归一化坐标当做是:屏幕坐标三维坐标进行相互转换时的一个中间坐标。在使用上来说,归一化坐标实际使用中的意义,就在这里了。
​ 本文仅讨论从屏幕坐标转换为三维坐标的方法,从三维坐标转换为屏幕坐标的方法不做讨论。

公式:

首先,先把公式摆出来,以点击事件触发的屏幕坐标为演示。

js复制代码/**
 * @mouse 归一化坐标,一个二维坐标
 * @event 点击事件中的事件对象
 * @container 渲染器的包裹父元素
*/
var mouse = new Three.Vector2();
// 则有公式如下:
mouse.x = ((event.clientX - container.getBoundingClientRect().left) / container.getBoundingClientRect().width) * 2 - 1;
mouse.y = - ((event.clientY - container.getBoundingClientRect().top) / container.getBoundingClientRect().height) * 2 + 1;

推导过程:

设定:屏幕宽度为w,高度为h
已知:A点的屏幕坐标为(x, y),归一化坐标轴所在矩形(也就是three.js所创建的canvas元素)距离屏幕上方距离为t,距离屏幕左侧距离为l
求得:A点的归一化坐标 (a, b)

​ 所谓归一化坐标,可以理解为在屏幕中的某个矩形中建立一个平面直角坐标系(可以称为归一化坐标系),右为此坐标系x轴正方向,上为此坐标系y轴正方向,且x轴取值范围为[-1,1],y轴取值范围为[-1,1],那么矩形内任意一点的坐标都可以用一个屏幕坐标的百分比来表示,百分比的计算为:
坐标x = (x-l)/w - 0.5
坐标y = (y-t)/h - 0.5
​ 分析:此式中x-l表示矩形内点距离矩形左侧边缘的距离,则(x-l)/w可表示所点击的点距离屏幕左边缘的距离所占矩形宽度的百分比,此时得到一个值域在[0, 1]的数字,再减去0.5则可将值域限制在[-0.5, 0.5],同理推得坐标y = (y-t)/h - 0.5。此时可以得到一个坐标的x,y值域均在[-0.5, 0.5]的坐标,这时将值*2则可将值域拓展到[-1, 1],则此时的计算公式也变为:坐标x = (x-l)/w * 2 - 1 坐标y = (y-t)/h * 2 - 1
​ 最后,考虑y轴,屏幕坐标轴的y轴轴方向与矩形内归一化坐标系y轴的轴方向相反(无需考虑x轴就是因为屏幕坐标轴的x轴与归一化坐标轴的x轴方向相同),而此前所有计算中y值均为屏幕坐标轴的y值,是故将点从屏幕坐标轴转到归一化坐标轴时,应当对y值进行取反,即坐标y = -[(y-t)/h * 2 - 1],去括号,将负号参与计算,得坐标y = 1 - (y-t)/h * 2
​ 至此,得出公式:

ini复制代码坐标x = (x-l)/w * 2 - 1
坐标y = 1 - (y-t)/h * 2

x、y对应为event.clientXevent.clientY
w、h对应为 container.getBoundingClientRect().widthcontainer.getBoundingClientRect().height
l、t 对应为 container.getBoundingClientRect().leftcontainer.getBoundingClientRect().top

​ 至此,得出上面所说的通用公式。
​ 其实这个所谓的【通用公式】,其实也就是比网上的那些公式多了一步减法而已,x/y分别减去了canvas元素到屏幕(网页)左边缘的距离和到屏幕(网页)上边缘的距离。但是不理解【归一化坐标】的具体含义,想要想到这一步减去还是很难的。

标签:container,getBoundingClientRect,三维,坐标,归一化,屏幕
From: https://www.cnblogs.com/DTCLOUD/p/17475284.html

相关文章

  • openlayers 坐标转换
    tranform与fromLonLat、toLonLat的区别 有关坐标转换的包都在ol/proj中其中EPSG:3857和EPSG:4326坐标系之间的转换有transform、fromLonLat、toLonLatfromLonLat是将EPSG:4326转换为EPSG:3857;toLonLat是将EPSG:3857转换为EPSG:4326transform([坐标],'EPSG:3857','EPSG:4326'); ......
  • [unity3d]屏幕坐标跟世界坐标的转换
    更多教程请访问:http://dingxiaowei.cn/ keepstudyveryday!写写今天的学习收获,今天学习到了平面坐标跟世界坐标的相互转换。效果:点击鼠标中键,创建一个小球,虽然看起来是屏面的,但实则是在三维空间里面创建的哦!代码挂在摄像机上:usingUnityEngine;usingSystem.Collections;publ......
  • Python+matplotlib设置坐标轴文本标签排列方式
    在默认情况下,y轴的文本标签方向是下面这样的:有时候这样子不方便看,我们可能希望文字水平显示并且每行显示一个字,如下图:这时可以使用ylabel()函数的rotation属性设置为'horizontal'并通过手动插入换行符来实现。参考代码如下:公众号“Python小屋”x......
  • Python+matplotlib绘制背景色和坐标轴刻度变化的动态柱状图
    问题描述:已知某商品从2000年至2019年每年12个月的价格波动情况,要求绘制动态柱状图进行可视化,要求每年改变一次轴域背景色。参考代码:运行效果:公众号“Python小屋”......
  • js原始坐标转百度坐标(GPS坐标转百度坐标)(火星坐标转百度坐标)
    wgs84togcj02tobd09(lng,lat){constxPI=3.14159265358979324*3000.0/180.0constPI=3.1415926535897932384626consta=6378245.0constee=0.00669342162296594323//WGS84转GCj02letdlat=transformlat(lng-105.0,lat-35.......
  • Python+matplotlib绘制极坐标柱状图(南丁格尔玫瑰图)
    功能描述:根据给定数据,绘制南丁格尔玫瑰图,也就是在极坐标系中绘制柱状图。参考代码:绘制结果:......
  • 正则化(regularization)和归一化(normalization)
    正则化:批量归一化和dropout批量归一化和dropout作为正则化器来克服深度学习模型中的过度拟合问题。 来源您遇到过导致过拟合的大型数据集吗?过度拟合的原因之一是网络中的权重很大。具有较大网络权重的网络可能是网络不稳定的标志,其中输入的微小变化可能导致输......
  • 如何通过CAD图中的坐标来确定是哪个坐标系
    国内常见的坐标系坐标系分为以下两种:地理坐标系(GeographicCoordinateSystem,GCS)投影坐标系(ProjectedCoordinateSystem,PCS)那什么是地理坐标系统呢?地理坐标系:为球面坐标。参考平面地是椭球面,坐标单位:经纬度。以地球参考为例,坐标系就相当于整个地球,而地理坐标系就是椭......
  • 相机的坐标系变换
    1.正文 图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图:   构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。 接下来的......
  • 标准化(Standardization)、归一化(Normalization)
    归一化:1)把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为......