网站: http://www.yanhuangxueyuan.com/Three.js_course/screen.html

方法.project

通过Vector3对象的方法project,方法的参数是相机对象,语句worldVector.project(camera);返回的结果是世界坐标worldVector在camera相机对象矩阵变化下对应的标准设备坐标, 标准设备坐标xyz的范围是[-1,1]。

因为canvas画布是全屏状态,完全填充浏览器窗口的客户区,canvas画布的宽高尺寸就是window.innerWidth、window.innerHeight。 画布的中心从屏幕坐标系的角度看是坐标是(window.innerWidth/2,window.innerHeight/2),从WebGL标准设备坐标系的角度看是坐标原点(0,0). 对于初次接触WebGL的读者,如果不太清楚世界坐标系、屏幕坐标系、标准设备坐标系的区别可以不用深入理解,直接复制下面的代码会修改即可。

  1. /**
  2. * 网格模型添加标签
  3. */
  4. function tag() {
  5. /**
  6. * 立方体世界坐标转屏幕坐标
  7. */
  8. //获取网格模型boxMesh的世界坐标
  9. var worldVector = new THREE.Vector3(
  10. boxMesh.position.x,
  11. boxMesh.position.y,
  12. boxMesh.position.z
  13. );
  14. var standardVector = worldVector.project(camera);//世界坐标转标准设备坐标
  15. var a = window.innerWidth / 2;
  16. var b = window.innerHeight / 2;
  17. var x = Math.round(standardVector.x * a + a);//标准设备坐标转屏幕坐标
  18. var y = Math.round(-standardVector.y * b + b);//标准设备坐标转屏幕坐标
  19. /**
  20. * 更新立方体元素位置
  21. */
  22. div.style.left = x + 'px';
  23. div.style.top = y -130 + 'px';
  24. }

创建div元素

在Javascript程序中创建html元素,并设置相关属性,可以学习本博客的HTML5部分教程。

  1. /**
  2. * 创建div元素(作为立方体标签)
  3. */
  4. var div = document.createElement('div');
  5. div.innerHTML = '立方体';
  6. div.style.padding = '5px';
  7. div.style.position = 'absolute';
  8. div.style.backgroundColor = 'rgba(155,0,155,0.8)';
  9. document.body.appendChild(div);

threejs 世界坐标转化为屏幕坐标的更多相关文章

  1. threejs 世界坐标与屏幕坐标相互转换

    屏幕坐标转世界坐标: let pX = (screenPoint.x / this.scene.renderer.domElement.clientWidth) * 2 - 1; let pY = - ...

  2. Unity ugui屏幕适配与世界坐标到ugui屏幕坐标的转换

    我们知道,如今的移动端设备分辨率五花八门,而开发过程中往往只取一种分辨率作为设计参考,例如采用1920*1080分辨率作为参考分辨率. 选定了一种参考分辨率后,美术设计人员就会固定以这样的分辨率来设计 ...

  3. unity3d游戏物体跟着鼠标方向移动

    效果:当点击鼠标左键时,游戏对象会朝鼠标点击的方向移动,类似魔兽争霸一样. 思路:把鼠标的坐标转化成世界坐标(鼠标默认是屏幕坐标),然后当点击鼠标时,物体将朝着鼠标的世界坐标方向移动. 如果你看到这的 ...

  4. FPS游戏方框透视基本原理

    计算机图形学基础 计算机图形学最基础的目标就是把建模时构建好的3D物体显示在2D屏幕上,这就涉及到物体在不同坐标系中坐标的转换.(物体/建模坐标系 ---------> 屏幕坐标系) 坐标系 在 ...

  5. unity屏幕坐标转世界坐标结果为(0,0,0)

    代码: wv转出来一直为(0,0,0),卡了好久,问别人说要转化的屏幕坐标Z不能为0 阿西吧!特此记录

  6. ThreeJS中的点击与交互——Raycaster的用法

    基础概念 坐标系 我们的手机屏幕是二维的,但是我们展示物体的世界是三维的,当我们在构建一个物体的时候我们是以一个三维世界既是世界坐标来构建,而转化为屏幕坐标展示在我们眼前,则需要经历多道矩阵变化,中间 ...

  7. UGUI世界坐标转换为UI本地坐标(游戏Hud的实现)

    实现世界坐标的原理是: 世界坐标和UGUI的坐标分属两个坐标系,他们之间是无法进行转换的,需要通过屏幕坐标系来进行转换(因为屏幕坐标是固定的),即先将游戏场景中的世界坐标通过游戏场景Camera转化为 ...

  8. OpenGL 坐标与矩阵转换

    1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Transformation).做个比 ...

  9. OpenGL图形管线和坐标变换[转]

    1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Transformation).做个比 ...

随机推荐

  1. 使用rgba设置输入框背景透明

    项目中遇到要求输入框的背景设置透明度,但文字不受影响,如下图 输入框使用input标签 <input ref="searchText" type="search&q ...

  2. mybatis实现一对多连接查询

    问题:两个对象User和Score,它们之间的关系为一对多. 底层数据库为postgresql,ORM框架为mybatis. 关键代码如下: mybatis配置文件如下: mybatis.xml文件内 ...

  3. mysql 远程 ip访问

    默认情况下Linux内的mysql数据库mysql,user表内的用户权限只是对localhost即本机才能登陆.需要更改权限: 如下的方式确认: root#mysql -h localhost-u  ...

  4. VC++ MFC如何生成一个可串行化的类

    一.MFC允许对象在程序运行的整个过程中持久化的串行化机制(1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程.(2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构)的 ...

  5. C++ MFC常用函数(转)

    WinExec() ExitWindowsEx() GlobalMemoryStatus() GetSystemInfo() GetSystemDirectory() GetWindowsDirect ...

  6. Swift的UILabel的一些属性

    let label = UILabel(frame: CGRectMake(,,,)) label.backgroundColor = UIColor.redColor() label.text = ...

  7. C# 监测每个方法的执行次数和占用时间(测试2)

    在Nuget引用 Castle.DynamicProxy 和 Newtonsoft.Json 这个 原文:http://www.cnblogs.com/RicCC/archive/2010/03/15 ...

  8. hdu2669-Romantic-(扩展欧几里得定理)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. table tr 加入背景色之后 去掉td之间的空隙

    给table加样式  border-collapse:collapse;

  10. metasploit framework(四):生成payload

    RHOST是限制来源IP,这里不用修改 generate生成payload 假设'\x00'是坏字符,生成payload时就会对'\x00'进行编码,排除坏字符. -b 去掉坏字符 -t 指定生成的格 ...