转 threejs中3D视野的缩放实现

Threejs基础部分学习知道透视相机new THREE.PerspectiveCamera(fov, aspect , near,far)中。

fov视野角(拍摄距离)越大,场景中的物体越小。fov视野角(拍摄距离)越小,场景中的物体越大。

透视相机(近大远小)  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 >
        <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>

文章缩放来源  http://blog.csdn.net/u_9_5/article/details/50542847

时间: 2024-08-07 04:33:54

转 threejs中3D视野的缩放实现的相关文章

Threejs 开发3D地图实践总结

前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂直于我们想要照亮的物体表面的向量.法线代表表面的方向因此他们为光源和物体的交互建模中具有决定性作用.每一个顶点都有一个关联的法向量. 如果一个顶点被多个三角形共享,共享顶点的法向量等于共享顶点在不同的三角形中的法向量的和.N=N1+N2: 所以如果不做任何处理,直接将3维物体的点传递给BufferGeometry,那么由于法向量被合成,经过

ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 joint 使用

我们接着上文  ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用继续完成创建带四个可以转动轮子的双层小车. 一 建立可以转动的joint <span style="font-size:18px;"><?xml version="1.0"?> <robot name="sp1s"> <link name="base_link"> <v

unity3d简单的相机跟随及视野旋转缩放

1.实现相机跟随主角运动 一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置,便能实现简单的相机跟随了. 这里我们选取第二种方法,首先给Camera添加一个脚本,取名为FollowPlayer,脚本很简单不做说明了 1 public class FollowPlayer : MonoBehaviour { 2 3 private Transform player; 4 private V

WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图: XAML代码:// Transform.XAML <Canvas Width="700" Height="700" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://sc

在ThreeJS中使用PNG实现透明贴图效果

ThreeJS是一个基于WebGL的开源库,使用起来十分方便.不过由于是开源,所以相关文档相当稀少,本人把在学习过程中遇到的一些问题及解决方法整理成一个专栏,希望对大家可以有所帮助! 在ThreeJS中如果直接把PNG贴图赋给材质,是无法在场景中正常显示的,效果如下图所示: 贴图是自己随便找的PNG图片,所以效果比较那个,大家不要介意. 现在说一下解决方法,就是在材质中设置透明属性为true,代码如下: child.material.transparent = true; 正确效果如下: 下面是

HT for Web中3D流动效果的实现与应用

流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散热的问题,采用冷热通道方案可大大提高数据中心的散热能力,充分有效利用机柜和机房的空间,因此在电信的3D机房监控领域,也常需要借助流动的效果,对机房冷热通道系统进行监控. Hightopo的HT for Web作为3D客户端呈现解决方案,今天介绍的重点不在于采集这些指标,而在于如何应用HT的预定于3D

Threejs 中建立可看到其内部的房间效果

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. var cubetex = THREE.ImageUtils.loadTexture('./maps/house_wall.png'); var

Cocos2d-x-v3中3D网格特效动画的应用

Cocos2d-x-v3中3D网格特效动画的应用 一.网格特效的使用原理 基础的动作是对节点整体进行移动,变形等操作,网格特效的原理是将节点分割成多个尺寸相同的网格,根据改变每个网格块的属性使整体节点产生3D的效果. 二.网格特效的基本用法 在cocos2d-x中,v3的版本新引入了一个类NodeGrid,专门用来包装网格的特效,示例如下:     //获取屏幕尺寸     Size visibleSize = Director::getInstance()->getVisibleSize();

如何使用CAD编辑器中的框选缩放功能?

如何使用CAD编辑器中的框选缩放功能?现在随着人们生活水平的不断提高,越来越多的人们开始对住房有了更多的要求,所有随着CAD行业的发展,也有越来越多的小伙伴们开始加入到CAD这个行业中来,日常的工作就是编辑出各种CAD图纸,但是在编辑CAD图纸的时候,也会遇到许许多多的问题,那就是如何使用CAD编辑器中的框选缩放功能?具体要怎么来进行操作?下面就利用迅捷CAD编辑器标准版来教教大家具体操作步骤,下面我们就一起来看看具体操作方法吧! 步骤一:首先电脑中没有下载安装CAD编辑器的小伙伴们,还是需要在