three.js中3D视野的缩放实现代码


Posted in Javascript onNovember 16, 2017

通过Threejs基础学习——修改版知道创建一个相机的相关知识点

var camera = new THREE.PerspectiveCamera( fov, aspect , near,far );

视野角:fov 这里视野角(有的地方叫拍摄距离)越大,场景中的物体越小,视野角越小,场景中的物体越大
纵横比:aspect   (3d物体的宽/高比例)
相机离视体积最近的距离:near
相机离视体积最远的距离:far
其中fov视野角(拍摄距离)越大,场景中的物体越小。fov视野角(拍摄距离)越小,场景中的物体越大。

three.js中3D视野的缩放实现代码three.js中3D视野的缩放实现代码

透视相机(近大远小)  PerspectiveCamera 

//透视照相机参数设置
var fov = 45,//拍摄距离 视野角值越大,场景中的物体越小
 near = 1,//相机离视体积最近的距离
 far = 1000,//相机离视体积最远的距离
 aspect = window.innerWidth / window.innerHeight; //纵横比
var camera = new THREE.PerspectiveCamera(fov,aspect, near, far);

改变fov的值,并更新这个照相机

//改变fov值,并更新场景的渲染
camera.fov = fov;
camera.updateProjectionMatrix();
renderer.render(scene, camera);
 //updateinfo();

鼠标上下滑轮实现放大缩小效果  代码如下

//监听鼠标滚动事件
canvas.addEventListener('mousewheel', mousewheel, false);
//鼠标滑轮-鼠标上下滑轮实现放大缩小效果
function mousewheel(e) {
 e.preventDefault();
 //e.stopPropagation();
 if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
 if (e.wheelDelta > 0) { //当滑轮向上滚动时
  fov -= (near < fov ? 1 : 0);
 }
 if (e.wheelDelta < 0) { //当滑轮向下滚动时
  fov += (fov < far ? 1 : 0);
 }
 } else if (e.detail) { //Firefox滑轮事件
 if (e.detail > 0) { //当滑轮向上滚动时
  fov -= 1;
 }
 if (e.detail < 0) { //当滑轮向下滚动时
  fov += 1;
 }
 }
 //改变fov值,并更新场景的渲染
 camera.fov = fov;
 camera.updateProjectionMatrix();
 renderer.render(scene, camera);
 //updateinfo();
}

实现效果完整代码  标注具体案例为个人原创

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>threejs中3D视野的缩放</title>
 <style>
 #canvas-frame {
 width: 100%;
 height: 600px;
 }
 </style>
 </head>
 <body onload="threeStart()">
 <div id="canvas-frame" ></div>
 </body>
 <script type="text/javascript" src="./lib/three.js" ></script>
 <script type="text/javascript">
 var renderer, //渲染器
 width = document.getElementById('canvas-frame').clientWidth, //画布宽
 height = document.getElementById('canvas-frame').clientHeight; //画布高
 //照相机配置
 var fov = 45,//拍摄距离 视野角值越大,场景中的物体越小
 near = 1,//最小范围
 far = 1000;//最大范围
 //DOM对象
 var canvas = null;
 //初始化DOM对象 
 function initDOM(){
 canvas = document.getElementById("canvas-frame");
 }
 //初始化渲染器
 function initThree(){
 renderer = new THREE.WebGLRenderer({
  antialias : true
  //canvas: document.getElementById('canvas-frame')
 });
 renderer.setSize(width, height);
 renderer.setClearColor(0xFFFFFF, 1.0);
 document.getElementById('canvas-frame').appendChild(renderer.domElement);
  renderer.setClearColor(0xFFFFFF, 1.0);
 }
 //初始化场景
 var scene;
 function initScene(){
 scene = new THREE.Scene();
 }
 var camera;
 function initCamera() { //透视相机
 camera = new THREE.PerspectiveCamera(fov, width/height , near, far);
 camera.position.x = 150;
 camera.position.y = 150;
 camera.position.z =250;
 camera.up.x = 0;
 camera.up.y = 1; //相机朝向--相机上方为y轴
 camera.up.z = 0;
 camera.lookAt({ //相机的中心点
  x : 0,
  y : 0,
  z : 0
 });
 }
 function initLight(){
 // light--这里使用环境光
 //var light = new THREE.DirectionalLight(0xffffff); /*方向性光源*/
 //light.position.set(600, 1000, 800);
 /* var light = new THREE.AmbientLight(0xffffff); //模拟漫反射光源
 light.position.set(600, 1000, 800); //使用Ambient Light时可以忽略方向和角度,只考虑光源的位置
 scene.add(light);*/
 }
 function initObject(){ //初始化对象
 //初始化地板
 initFloor();
 }
 function initGrid(){ //辅助网格
 var helper = new THREE.GridHelper( 1000, 50 );
 helper.setColors( 0x0000ff, 0x808080 );
 scene.add( helper );
 }
 function initFloor(){
 //创建一个立方体
 var geometry = new THREE.BoxGeometry(80, 20, 80);
  for ( var i = 0; i < geometry.faces.length; i += 2 ) {
  var hex = Math.random() * 0xffffff;
  geometry.faces[ i ].color.setHex( hex );
  geometry.faces[ i + 1 ].color.setHex( hex );
 }
 var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors} );
 //将material材料添加到几何体geometry
 var mesh = new THREE.Mesh(geometry, material);
 mesh.position = new THREE.Vector3(0,0,0);
 scene.add(mesh);
 }
 //初始化页面加载
 function threeStart(){
 //初始化DOM对象
 initDOM();
 //初始化渲染器
 initThree();
 //初始化场景
 initScene();
 //初始透视化相机
 initCamera();
 //初始化光源
 initLight();
 //模型对象
 initObject();
 //初始化网格辅助线
 initGrid();
 //渲染
 renderer.render(scene, camera);
 //实时动画
 //animation();
 //监听鼠标滚动事件
 canvas.addEventListener('mousewheel', mousewheel, false);
 }
 function animation(){
 //相机围绕y轴旋转,并且保持场景中的物体一直再相机的视野中
 //实时渲染成像
 var timer = Date.now()*0.0001;
 camera.position.x = Math.cos(timer)*100;
 camera.position.z = Math.sin(timer)*100;
 camera.lookAt(scene.position);
 renderer.render(scene, camera);
 requestAnimationFrame(animation);
 }
 //鼠标滑轮-鼠标上下滑轮实现放大缩小效果
 function mousewheel(e) {
 e.preventDefault();
 //e.stopPropagation();
 if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
 if (e.wheelDelta > 0) { //当滑轮向上滚动时
  fov -= (near < fov ? 1 : 0);
 }
 if (e.wheelDelta < 0) { //当滑轮向下滚动时
  fov += (fov < far ? 1 : 0);
 }
 } else if (e.detail) { //Firefox滑轮事件
 if (e.detail > 0) { //当滑轮向上滚动时
  fov -= 1;
 }
 if (e.detail < 0) { //当滑轮向下滚动时
  fov += 1;
 }
 }
 console.info('camera.fov:'+camera.fov);
 console.info('camera.x:'+camera.position.x);
 console.info('camera.y:'+camera.position.y);
 console.info('camera.z:'+camera.position.z);
 //改变fov值,并更新场景的渲染
 camera.fov = fov;
 camera.updateProjectionMatrix();
 renderer.render(scene, camera);
 //updateinfo();
 }
 </script>
</html>

文章缩放来源:three.js实现3D视野缩放效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
Mar 29 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
Javascript中的迭代、归并方法详解
Jun 14 Javascript
微信JS接口大全
Aug 25 Javascript
jQuery实现底部浮动窗口效果
Sep 07 Javascript
详解jQuery选择器
Dec 21 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
详解webpack介绍&amp;安装&amp;常用命令
Jun 29 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
Apr 10 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 #Javascript
React/Redux应用使用Async/Await的方法
Nov 16 #Javascript
详谈DOM简介及节点、属性、查找节点的方法
Nov 16 #Javascript
图片加载完成再执行事件的实例
Nov 16 #Javascript
详解React 在服务端渲染的实现
Nov 16 #Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 #Javascript
详解React Native 采用Fetch方式发送跨域POST请求
Nov 15 #Javascript
You might like
PHP初学者头疼问题总结
2006/07/08 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
又一个php 分页类实现代码
2009/12/03 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
Python数据操作方法封装类实例
2017/06/23 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
shell程序中如何注释
2012/01/28 面试题
安全生产实施方案
2014/02/23 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
读后感作文评语
2014/12/25 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
工作收入证明范本
2015/06/12 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL
JavaScript 定时器详情
2021/11/11 Javascript
全新239军机修复记
2022/04/05 无线电
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python