网站首页 > 开源技术 正文
相机(camera)是用来将3D场景投影到二维屏幕的重要因素,如果没有相机(camera)的投影,我们就什么也看不到。在Web3D|基于WebGL的Three.js框架|入门篇中我们已经介绍了相机的两种投影方式:
- 透视投影:THREE.PerspectiveCamera,遵循近大远小规则,跟现实生活中我们看物体的方式是一样的。
- 正投影:THREE.OrthographicCamera,不论远近,按照统一的大小进行投影。
这一篇,我们的主题是如何捕捉鼠标事件,将相机移动到被选中的渲染物体上。
分析
- 第一步:获取鼠标的位置,转换成three.js的坐标。
- 第二步:获取当前鼠标位置下的渲染物体。
- 第三步:移动相机,更新照射位置。
示例
具体的方法如下:
var mouse = {}; function onDocumentMouseDown(event) { // 将当前的屏幕坐标,转换成Three坐标 mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; //查找当前坐标下的渲染物体。 raycaster.setFromCamera(mouse, camera); var intersects = raycaster.intersectObjects(group.children, false); if (intersects.length > 0) { //获取当前物体的位置. var position = intersects[0].object.position.clone(); // 移动相机,更新照射点. camera.position = position; camera.lookAt(position); } }
由于这个方法是直接改变camera的位置,看上去不太友好,我们可以用Tween.js来添加点动画效果。
function tweenCamera(position, target) { new TWEEN.Tween(camera.position).to({ x: position.x, y: position.y, z: position.z }, 600) .easing(TWEEN.Easing.Sinusoidal.InOut).start(); new TWEEN.Tween(controls.target).to({ x: target.x, y: target.y, z: target.z }, 600) .easing(TWEEN.Easing.Sinusoidal.InOut).start(); }
总结
- 由于屏幕坐标和Three中的坐标系不同,所以不能直接使用。
- 默认情况下,camera照在(0,0,0)点,所以,在移动camera之后,必须调用lookAt更新照射位置。
- 查找界面上的元素,用到了Raycaster,是一个THREE.Raycaster对象。
更多内容,请期待下一篇:Web3D | 基于WebGL的Three.js框架 | 坐标转换篇
猜你喜欢
- 2024-10-26 微信小程序开发小游戏的语言和框架
- 2024-10-26 2015年16个最佳的免费响应式HTML5框架
- 2024-10-26 前端移动开发基础HTML5丶CSS3+零基础Web前端开发工程师高端培训
- 2024-10-26 一篇文章教会你使用HTML打造一款颜色配对游戏
- 2024-10-26 《响应式开发》16个最佳响应式HTML5框架分享
- 2024-10-26 3D世界中的动画实现(3d世界中的动画实现什么意思)
- 2024-10-26 课程速递:HTML5类库CreateJS系列:EaselJ
- 2024-10-26 一篇文章教会你利用createjs实现界面效果
- 2024-07-20 [常用工具] PyAutoGUI使用教程(pyautogui.click())
- 2024-07-20 值得收藏学习的最新HTML5学习课程大纲
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)