网站首页 > 开源技术 正文
相机(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学习课程大纲
欢迎 你 发表评论:
- 1577℃北京那些看上去很牛的车牌们!(北京厉害车牌)
- 1098℃2025年度视频去水印软件TOP5对比:哪款最值得用
- 665℃《我的世界》不同版本的差异 ——新手向
- 583℃新疆话里的“虫子”
- 539℃正畸治疗后的牙间黑三角
- 499℃蓝牙设备配对失败的系统性解决方案与技术解析
- 497℃中兴光猫 Telnet下设置大全(中兴光猫命令大全)
- 491℃未备份电脑文件数据恢复的七种方法
- 最近发表
- 标签列表
-
- 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)

本文暂时没有评论,来添加一个吧(●'◡'●)