three.js中坐标系转换以及camera的position、lookAt与up属性理解

2 篇文章 0 订阅
订阅专栏

       为了更好的理解camera的position、lookAt与up属性,文章最开始我们先来阐述three.js的坐标系转换的概念。

1.监听event的事件获得屏幕坐标

       文章的最开始首先讨论在哪里进行点击事件的监听的问题,当鼠标触发点击事件时,event会输出点击位置相对于各个参考系所产生的坐标,在此我们只讨论常用的offsetX、offsetY以及clientX、clientY。

offsetX:设置或获取鼠标点击位置相对于触发事件对象(触发事件DOM的内部不包含border)的水平(X)距离
offsetY:设置或获取鼠标点击位置相对于触发事件对象(触发事件DOM的内部不包含border)的垂直(Y)距离

clientX:设置或获取鼠标相对于浏览器可视区域的水平坐标    
clientY:设置或获取鼠标相对于浏览器可视区域的垂直坐标    

     如图(1)示,window中(clientX,clientY)都是相对于左上角坐标原点的距离,而(offsetX,offsetY)中触发事件的对象这个概念就很重要,是相对于当前DOM元素不包含border及其外部的content部分左上角原点坐标,如果在展示界面存在header,(clientX,clientY)还需要转换才能作为画布的坐标,所以推介选取(offsetX,offsetY)作为监听事件获得的坐标。

                                                       图(1)不同坐标数据展示

         如果展示模型的画布如果是整个可视页面,监听window得到的坐标(clientX,clientY)与(offsetX,offsetY)都是一致的。但往往我们只会选择一个区域进行三维模型的展示, 这时若监听对象为window,就会在画布外触发点击事件,容易产生不必要的问题。所以此时最好把监听对象设置为存放画布的DOM元素,不仅在画布外不会触发不必要的事件,并且可以直观的获得该点相对于画布的坐标。

element.addEventListener('click',()=>{})
window.addEventListener('click',()=>{})

     

2 屏幕坐标、标准化设备坐标与世界坐标的相互转换

这里我们先抛出屏幕坐标、标准化设备坐标与世界坐标的概念。

2.1 概念:

屏幕坐标:以左上角为原点,横向为x轴,纵向向下为y轴;屏幕坐标系在three.js中为canvas画布的坐标系,如图(2)示

                                                        图(2)屏幕坐标系

标准化设备坐标(NormalizedDeviceCoordinates,NDC) :标准化设备坐标是一个横纵坐标值在-1到1的一小段空间,坐标原点位于区域正中心。如图(3)示

                                                         图(3)标准化设备坐标系

世界坐标:场景坐标原点坐标系,世界坐标是物体相对场景坐标原点的位置,如图(4)示

                                                          图(4)世界坐标系

2.2 屏幕坐标系转世界坐标系

首先我们了解如何从屏幕坐标系转化为标准化设备坐标系,最后转化为世界坐标系的过程 。

step 1:

当鼠标在canvas画布上点击时,获得屏幕坐标系(Sx,Sy),将其转化为( Nx,Ny),可得

N_{x}=\frac{S_{X}}{width}*2-1

 N_{y}=-\frac{y}{height}*2+1

转化为代码就是

const x = (x / Width) * 2 - 1,

const y = - (y /Height) * 2 + 1,

step 2: 

将得到的设备坐标转化为三维向量;

const nVector = new THREE.Vector3((x / Width) * 2 - 1,- (y /Height) * 2 + 1,0.5) 

step 3: 

 three.js有封装好的方法.unporject( ),将设备坐标转为世界坐标系;

const worldVector = nVector.unprojet( camera )

 2.2世界坐标系转屏幕坐标系

        同上可得

 step1:

 将世界坐标系转化为标准坐标系

const nVector = worldVector .projet( camera )

step2:

将标准坐标系转化为屏幕坐标系,公式为

S_{x}=\frac{N_{x}+1}{2}width

S_{y}=\frac{N_{y}-1}{2}height

3 camera的position、lookAt与up属性

3.1camera的position

.position:Vectors

 表示对象局部位置的Vector3。默认值为(0, 0, 0)

       官方文档的解释很容易理解,就是相机相对于世界坐标系原点的位置,换句话说相机距离场景中心的距离。距离越近看到的物体越少越大,距离越远看到的物体越多越小。设置一个合适的位置对于观察场景内模型具有很重要的意义。

                                                          图(5)相机看向物体

3.2 .lookAt

object3D.lookAt ( vector:Vector3) :undefined
object3D.lookAt( x : Float, y : Float, z : Float ) :undefined

vector - 一个表示世界空间中位置的向量。

也可以使用世界空间坐标的位置分量。
旋转物体使其在世界空间中面朝一个点。

这一方法不支持其父级被旋转过或者被位移过的物体。

       也就是说,这个object的永远朝向 .lookAt( ) 中向量的位置,如果在创建object时使用这个属性,就会产生构建的物体总是会朝向向量的方向,图(6)示为raycaster射线射中返回的数据,借由这些数据和。lookAt()方法,我们可以完成很多有趣的功能,例如在物体表面形成数据点,或者构建垂直于当前面的线等等。

                                                           图(6)相机看向物体

       而相机的这个属性可以理解为”看向“哪里,只有保证视角中出现这个对象,我们才能通过画布看到。在渲染场景时,通常都是将相机看向场景的原点,以此来保证可视界面的完整,我们也可以把相机放置在场景中移动的物体上,设置看向某个方向,借此完成动态巡检等功能。

3.3 up

.up:Vector3

这个属性由lookAt方法所使用,例如,来决定结果的朝向。 默认值是Object3D.DefaultUp,

即( 0, 1, 0 )

       通过前面阐述的世界坐标系概念可知,这个”结果的朝向“指的是场景的坐标系的朝向,默认的朝向为Y轴向上,X轴向右,Z轴向外,那么我们设置这个值会得到什么?

a.设置Y轴向上

      换句话说,就是哪个方向是向上的,设置.up为(0,1,0),就可以得到图(7)的样式,Y轴向上,X轴向右,Z轴向外。

camera.position.set(1,30,60)

camera.lookAt(0,0,0)

camera.up = new THREE.Vector3(0,1,0) 

                                                            图(7)Y轴向上

b.设置Y轴向上

       那么,设置.up为(1,0,0),就可以得到图(8)的样式,x轴向上,X轴向坐,Z轴向外。

camera.position.set(1,30,60)

camera.lookAt(0,0,0)

camera.up = new THREE.Vector3(1,0,0) 

                                                            图(8)X轴向上

c.设置Z轴向上

         设置.up为(0,0,1)时,就可以得到图(9),由图可知Z轴向外,那么为什么Z轴没有向上?通过图(10)可以知道相机的位置在Z轴正半轴,看向Z轴的负半轴,改变.up()的值,相机的位置也是在跟随着一起移动,所以得到如图所示的结果。

camera.position.set(1,30,60)

camera.lookAt(0,0,0)

camera.up = new THREE.Vector3(1,0,0) 

                                                            图(9)Z轴向上

three.js 相机camera的up和lookAt详解
flame_007的博客
03-11 1万+
three.js相机的设置很重要。甚至牵涉到缩放,旋转等动画的应用,下面就up和lookAt的用法做下解释: 先来说说position属性,就是设置相机的位置,而位置设置后相机看向哪里呢? 默认情况下,是由正z轴看像-z轴(相机镜头对着-z轴方向拍),就是我们由屏幕外向屏幕内看一样。 如果不设置lookAt,相机看向的就是position的z值垂直向里看的方向。 如果设置了lookAt,比...
three.js 3d坐标转平面坐标
02-08
一个小demo,3d空间坐标转平面坐标,div固定于3d空间系得某一点
ThreejsCamera相机
最新发布
你华还是你华
08-29 384
相机在Threejs扮演着至关重要的角色,它决定了我们从哪个视角来观察场景。在Threejs,创建相机轻松设定视角、宽高比等参数,掌控视觉体验。相机虽无形,却决定所见,需搭配物体、灯光等可见元素,共同构建生动场景。它是连接现实与虚拟的桥梁,让想象触手可及。在Threejs有正交相机、透视相机、立方相机、立体相机,接下来我们将重点记录透视相机,因为透视相机是比较还原我们人眼的效果。本文只介绍常用参数,更多参数请点这里。
ThreeJS 坐标系转化
Define_best的博客
07-28 2832
ThreeJS 坐标系转化(屏幕坐标与世界坐标互转)
ThreeJS相机camera位置属性
丰空岛主(Vega Prime,Android,LabWindows,ThreeJS,Python,OpenCV)
12-03 3679
开始很懵,完全不能理解,有个position,还要up和lookAt干嘛。 既然是位置属性不明白,那默认其它属性都懂了。 上坐标轴: 先来第一个position属性,可以设置xyz。 假设设置y为 1000 position(0,1000,0); 相机的位置是下图: 单独设置xz轴都和以上类似,位置z或者x轴某个位置。 那lookAt,字面上的意思就是,看向哪里。 相机默认是由正z轴看像-z轴(相机镜头对着-z轴方向拍),就是我们由屏幕外向屏幕内看一样。 camera.l...
threejs三种坐标(世界坐标,局部坐标,屏幕坐标)转换
m0_73495473的博客
08-08 4001
获取点击到的三维坐标图形,将其转化为屏幕坐标,获取其屏幕坐标的x,y值。三种坐标系转换
Three.js camera.up参数的作用
一名业余前端的博客
10-25 3109
camera有三个参数,positionlookAt、up。 position,设置camera的位置。也就是把摄像机放在哪里。 lookAt,设置camera看向的位置,即摄像机在position的位置看向哪里。若position设置为(500,500,500),lookAt设置为(100,100,100)。其意思就是把camera放在坐标为(500,500,500)的位置,并把摄像头对...
three.js 入门示例,含坐标系、相机参数
01-20
标题"three.js 入门示例,含坐标系、相机参数"表明这个示例项目是关于three.js的初学者教程,主要关注如何设置和理解三维空间坐标系以及调整相机参数来观察场景。three.js是一个基于WebGL的JavaScript库,用于在...
threejs学习随记(二)】——up属性lookAt方法解析
u012088576的博客
09-07 8285
有关threejs的学习资料真心不多,很多东西都要自己好好琢磨。 今天主要讲讲有关相机(camera)的一些小细节——up属性lookat方法,初学者可能对这两者不大理解,所以有必要提醒下。
如何使用three.js集成令人羡慕的局部坐标系
敖丙007的博客
01-23 499
如何使用three.js集成令人羡慕的局部坐标系
three.js 点、线、坐标轴(02)
sandy_star
02-08 3332
文章目录一、3D世界的组成二、在Threejs定义一个点2.1定义一个点2.2 一个栗子----画一条直线三、几何体THREE.Geometry()四、线条的材质THREE.LineBasicMaterial4.1插值五、关于坐标系5.1 世界坐标和本地坐标5.2 AxesHelper三维坐标系 一、3D世界的组成 在计算机,3d是由点组成,两个点能够组成一条直线,三个不在一条直线上的点就能够组成一个三角形面,无数三角形面就能够组成各种形状的物体。 网格模型:也叫mesh模型,给物体贴上皮肤也叫纹理,那
three.js之创建坐标系网格
aaronthon的博客
06-05 1746
three.js之创建坐标系网格 <!DOCTYPE html> <html> <head> <meta charset=utf-8> <title>My first three.js app</title> <style> ...
three.js地理坐标系有哪些,和屏幕坐标系转换
2401_82881178的博客
07-03 1559
坐标系很好理解,就是点线面体的位置,一个点是一个坐标,一条线段2个坐标,一个矩形四个坐标,一个立方体8个坐标,three.js面对的是三维空间,屏幕则是二维的,这就面临着转换问题,贝格前端工场借助本文为大家浅释一下。
three.js 相机 Camera `.up`相机上方向(旋转渲染结果)
u014291990的博客
12-13 923
up是相机对象的属性,当你改变.up属性时候,就好比你生活拍照时候,扭转你的相机姿态角度进行拍照,这时候你的照片也会跟着相机姿态旋转。.up属性默认值是,意思是沿着y轴朝上。
Three.js学习-相机Camera的基本操作(了解向)
qq_41835314的博客
07-01 5135
介绍了相机的两种透视方式,以及相机的基本属性设置,还有简单介绍了轨道控制器的使用。
Three.js相机对象.up属性
yinge0508的博客
12-22 1220
Threejs相机对象Camera的.up属性表示相机对象的上方向,如果你有一定图形学基础,你可以很好的理解,如果没有图形学基础也没关系,你可以在threejs代码更改.up的属性值,查看threejs渲染结果有什么变化。 .up属性默认值是new THREE.Vector3(0,1,0),沿着y轴朝上,你可以使用下面代码看渲染效果绿色y轴数值向上,你可以改变.up属性的值,查看渲染结果变化。 camera.position.set(200, 300, 200); // 浏览器控制台查看.up...
Threejs 展示——坐标间的转换
虎康的博客
01-30 394
世界坐标系是指整个 Three.js 场景的坐标系,它是一个三维坐标系,用来表示场景物体的位置和方向。屏幕坐标系是指屏幕或视口的二维坐标系,通常以左上角为原点,向右为 X 轴正方向,向下为 Y 轴正方向。当用户在屏幕上点击鼠标时,得到的坐标就是屏幕坐标系的坐标。在 Three.js ,展示和坐标间的转换涉及到不同的坐标系,包括世界坐标系、屏幕坐标系和相机坐标系。相机坐标系是相机的局部坐标系,它以相机位置为原点,相机视线方向为 Z 轴负方向,垂直向上为 Y 轴正方向,水平向右为 X 轴正方向。
[Threejs]三种坐标系位置数据的转换
热门推荐
moxiaomomo的专栏
10-29 1万+
webGL主要有6种坐标系.接下来看看如何在以下三种坐标系之间进行坐标数据的转换:屏幕坐标系,标准坐标系,世界坐标系. 屏幕坐标系和标准设备坐标系 先来了解一下这两个坐标系的定义,具体如下图所示: 屏幕坐标系的起始点(0,0)在左上角,而标准坐标系的起始点在canvas心处. 假设3D画布的大小填满window 假如我们要通过鼠标来操控3D画布内的场景对象,需要将鼠标的坐标位置转换为3...
Three.js坐标系与变换矩阵快速入门
新缸中之脑
01-27 5154
很多东西汇集在一起构成一个美丽的 3D 场景,例如光照、材质、模型、纹理、相机设置、后期处理、粒子效果、交互性等等,但无论我们创建什么样的场景,没有比这更多的了 比组成它的乐曲的排列和运动更重要。要创建建筑效果图,我们必须成为建筑师和室内装饰师。我们必须考虑建筑物和里面房间的比例,巧妙地放置家具和灯具。在自然场景,无论是一朵花的特写,还是广阔的山景,我们都需要以自然而令人信服的方式安排树木和岩石,或叶子和花瓣。
three.js如何实现camera跟随模型相对运动?
04-03
可以通过设置相机的位置和目标点来实现相对运动。具体步骤如下: 1. 设置一个相机对象和一个模型对象。 ``` var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); var model = new THREE.Object3D(); ``` 2. 将相机设置在模型的后面一定距离处,并将相机的目标点设置为模型的位置。 ``` var distance = 10; var cameraOffset = new THREE.Vector3(0, 0, -distance); var cameraTarget = new THREE.Vector3(); camera.position.copy(model.position).add(cameraOffset); camera.lookAt(cameraTarget.copy(model.position)); ``` 3. 在每一帧更新相机的位置和目标点,以实现跟随模型的相对运动。 ``` function animate() { requestAnimationFrame(animate); // 更新相机的位置和目标点 camera.position.copy(model.position).add(cameraOffset); camera.lookAt(cameraTarget.copy(model.position)); renderer.render(scene, camera); } ``` 注意,如果模型发生旋转,则需要更新相机的偏移向量,以保持相对位置不变。
写文章

热门文章

  • three.js中坐标系转换以及camera的position、lookAt与up属性理解 7131
  • three.js一个渲染器渲染双场景的相互覆盖问题 1077

分类专栏

  • three.js 2篇

最新评论

  • three.js中坐标系转换以及camera的position、lookAt与up属性理解

    Daniel_jianer: 为啥我第一遍看了哈 完全没get到意思

  • three.js中坐标系转换以及camera的position、lookAt与up属性理解

    MyJamson: 谢谢大佬!浅显易懂!

  • three.js中坐标系转换以及camera的position、lookAt与up属性理解

    IGSol: 请教一下,2.2 屏幕坐标转世界坐标,step2 nVector的第三项0.5是怎么确定的

  • three.js中坐标系转换以及camera的position、lookAt与up属性理解

    小林居士: 优秀,膜拜大佬

最新文章

  • three.js一个渲染器渲染双场景的相互覆盖问题
2022年2篇

目录

目录

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家南阳玻璃钢雕塑费用西安玻璃钢雕塑设计东营卡通玻璃钢雕塑制作广东季节性商场美陈供应北京主题商场美陈销售小品玻璃钢雕塑出厂价格浙江大型商场美陈价格临沂玻璃钢价值观雕塑滁州定制玻璃钢雕塑玻璃钢雕塑造型定制哪种好儿童玻璃钢雕塑设计一般多少钱浙江节庆商场美陈玻璃钢仿生雕塑造价湖北定做玻璃钢雕塑厂家玻璃钢雕塑厂家直供耒阳玻璃钢伟人像雕塑周口太湖石玻璃钢人物雕塑厂家安顺商场美陈展览珠海定制玻璃钢造型雕塑玻璃钢雕塑仿真水果蔬菜玻璃钢雕塑维修工艺流程衢州承接玻璃钢卡通人物雕塑大型玻璃钢雕塑怎么制作河北曲阳玻璃钢雕塑像厂家五华区玻璃钢雕塑设计哪里好武汉玻璃钢智能雕塑玻璃钢雕塑制作安装合同金昌玻璃钢动物雕塑价格淮南玻璃钢雕塑价位玻璃钢雕塑临沂厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化