图形化开发(五)042-Three.js之Camera相机——正交相机和透视相机的对比

效果图-正交相机和透视相机的对比

camera.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>正交相机和透视相机的对比</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style>
</head>
<body onload="draw();"></body>
<script src="https://cdn.bootcss.com/three.js/92/three.js"></script>
<script src="http://www.wjceo.com/lib/js/libs/stats.min.js"></script>
<script src="https://cdn.bootcss.com/dat-gui/0.7.1/dat.gui.min.js"></script>
<script>var renderer, camera, scene, gui, stats;var group, perspectiveCamera, orthographicCamera;function initRender() {renderer = new THREE.WebGLRenderer({antialias: true});renderer.setSize(window.innerWidth, window.innerHeight);renderer.autoClear = false; //设置场景不自动清除内容,才能够让两个相机同时渲染页面//告诉渲染器需要阴影效果renderer.shadowMap.enabled = true;renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默认的是,没有设置的这个清晰 THREE.PCFShadowMapdocument.body.appendChild(renderer.domElement);}function initCamera() {var aspect = window.innerWidth / window.innerHeight / 2;//创建透视相机perspectiveCamera = new THREE.PerspectiveCamera(45, aspect, 0.1, 1000);//创建正交相机var size = 200;orthographicCamera = new THREE.OrthographicCamera(size * aspect / -2, size * aspect / 2, size / 2, size / -2, 0.1, 1000);//两个相机设置相同的位置perspectiveCamera.position.set(0, 100, 200);orthographicCamera.position.set(0, 100, 200);//设置两个相机焦点都为原点perspectiveCamera.lookAt(new THREE.Vector3());orthographicCamera.lookAt(new THREE.Vector3());//添加到场景scene.add(perspectiveCamera);scene.add(orthographicCamera);}function initScene() {scene = new THREE.Scene();}function initGui() {//声明一个保存需求修改的相关数据的对象gui = {auto: false, //自动旋转reset: function () {group.rotation.y = 0;}};var datGui = new dat.GUI();//将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)datGui.add(gui, "auto").name("自动旋转");datGui.add(gui, "reset").name("重置");}function initLight() {var ambientLight = new THREE.AmbientLight("#111111");scene.add(ambientLight);var directionalLight = new THREE.DirectionalLight("#ffffff");directionalLight.position.set(40, 60, 10);directionalLight.shadow.camera.near = 0; //产生阴影的最近距离directionalLight.shadow.camera.far = 200; //产生阴影的最远距离directionalLight.shadow.camera.left = -50; //产生阴影距离位置的最左边位置directionalLight.shadow.camera.right = 50; //最右边directionalLight.shadow.camera.top = 50; //最上边directionalLight.shadow.camera.bottom = -50; //最下面//这两个值决定生成阴影密度 默认512directionalLight.shadow.mapSize.height = 1024;directionalLight.shadow.mapSize.width = 1024;//告诉平行光需要开启阴影投射directionalLight.castShadow = true;scene.add(directionalLight);}function initModel() {group = new THREE.Group(); //创建一个模型组//球体var sphereGeometry = new THREE.SphereGeometry(5, 24, 16);var sphereMaterial = new THREE.MeshPhongMaterial({color: 0xff00ff});var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);sphere.position.x = -10;sphere.position.z = -10;sphere.castShadow = true; //开启阴影group.add(sphere);//立方体var cubeGeometry = new THREE.BoxGeometry(10, 10, 10);var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x00ffff});var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);cube.position.x = 20;cube.position.z = 20;cube.castShadow = true; //开启阴影group.add(cube);//底部平面var planeGeometry = new THREE.PlaneGeometry(100, 100);var planeMaterial = new THREE.MeshLambertMaterial({color: 0xaaaaaa});var plane = new THREE.Mesh(planeGeometry, planeMaterial);plane.rotation.x = -0.5 * Math.PI;plane.position.y = -5;plane.receiveShadow = true; //可以接收阴影group.add(plane);scene.add(group);}function initStats() {stats = new Stats();document.body.appendChild(stats.dom);}function render() {if (gui.auto) {group.rotation.y += 0.01;}renderer.clear(true, true, true); //手动清除场景var size = renderer.getSize(); //获取到当前的显示区域的宽高renderer.setViewport(0, 0, size.width / 2, size.height); //设置视口,从 (x, y) 到 (x + width, y + height)。renderer.render(scene, perspectiveCamera);renderer.setViewport(size.width / 2, 0, size.width / 2, size.height);renderer.render(scene, orthographicCamera);}//窗口变动触发的函数function onWindowResize() {var aspect = window.innerWidth / window.innerHeight / 2;//更新透视相机perspectiveCamera.aspect = aspect;perspectiveCamera.updateProjectionMatrix();//更新正交相机var size = 200;orthographicCamera.left = size * aspect / -2;orthographicCamera.right = size * aspect / 2;orthographicCamera.top = size / 2;orthographicCamera.bottom = size / -2;orthographicCamera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);}function animate() {//更新控制器render();//更新性能插件stats.update();requestAnimationFrame(animate);}function draw() {initGui();initRender();initScene();initCamera();initLight();initModel();initStats();animate();window.onresize = onWindowResize;}
</script>
</html>
initRender();initScene();initCamera();initLight();initModel();initStats();animate();window.onresize = onWindowResize;
}

图形化开发(五)042-Three.js之Camera相机——正交相机和透视相机的对比相关推荐

  1. 图形化开发(五)021-Three.js之材质——不受光影响-MeshBasicMaterial-同颜色MeshNormalMaterial-方向不同颜色LineBasicMaterial线条材质

    图形化开发(五)021-Three.js之材质--不受光影响-MeshBasicMaterial-整个物体颜色一样&MeshNormalMaterial-方向不同自动改变颜色 & Li ...

  2. 图形化开发(五)022-Three.js之材质——受光影响-MeshLambertMaterial 兰伯特材质 MeshPhongMaterial 高光材质

    图形化开发(五)022-Three.js之材质--受光影响-MeshLambertMaterial 兰伯特材质 & MeshPhongMaterial 高光材质 添加光 由于MeshBasic ...

  3. 图形化开发(一)——Three.js基本介绍-优缺点-在线编辑器 Babylon.JS是最好的JavaScript3D游戏引擎

    图形化开发(一)--Three.js基本介绍-优缺点-在线编辑器 & Babylon.JS是最好的JavaScript3D游戏引擎 课程主要学习目标 Threejs ( 3d ) D3 (做数 ...

  4. 图形化开发(六)01-Three.js之导入模型——3dmax和SketchUp-editor编辑器导出json文件,在创建模型initMesh中外部的JSON文件

    图形化开发(六)01-Three.js之导入模型--3dmax和SketchUp-editor编辑器导出json文件,在创建模型initMesh中外部的JSON文件 导入模型 官方推荐我们使用的3D模 ...

  5. 图形化开发(一)——D3.js的基本介绍、技术原理

    图形化开发(一)--D3.js的基本介绍.技术原理 D3.js 为什么学习D3 中文官网--https://www.d3js.org.cn/ github--https://github.com/d3 ...

  6. Arduino的图形化开发环境: ArduBlock

    转载自http://youngmakers.cn/groups/articles/54f9466b9835fed6656d4dd6 ArduBlock是一款为Arduino设计的开源图形化编程软件,由 ...

  7. 【MSP430G2553】图形化开发笔记(2) 系统时钟和低功耗模式

    目录 系统时钟概述 BCS+模块单元的基本构造 时钟-概览 介绍 Basic User 模式 Power User 模式 1. 数控振荡器 DCO 2. 出厂预校正频率 3. 低频振荡器 VLO 4. ...

  8. python 图形化开发用什么模块_用python进行GUI开发的选择/python的GUI模块(图形界面开发库)...

    Python最大的特点就在于她的快速开发功能.作为一种胶水型语言,python几乎可以渗透在我们编程过程中的各个领域.这里我简单介绍一下用python进行gui开发的一些选择. 1.Tkinter T ...

  9. pyqt5 不报错退出_最新版本Python图形化开发环境Anaconda(Python3.7) +PyQT5+Eric6

    Anaconda是完全免费的企业级的Python发行大规模数据处理.预测分析和科学计算工具.Anacoda是Python科学技术包的合集,所以不同的包所遵循的协议不一样.PyQt5与Eric6是众所周 ...

  10. 微信小程序开发(五) - 全局(app.js)逻辑 - js 文件

    微信小程序中使用的逻辑文件 ,本质上还是.js 文件,脚本中的很多东西进行了二次封装,本质上可以在外部调试中,查看 逻辑层(App Service) 小程序开发框架的逻辑层由 JavaScript 编 ...

最新文章

  1. 使用UEFI模式安装win10中的格式化磁盘问题
  2. 《JAVA练习题目5》 请在类中定义计算阶乘的方法完成本题目的求解
  3. 通用c/c++的Makefile模版
  4. Javascript之DOM(Document类型)
  5. java中的abstract和interface差异
  6. [转]javaandroid线程池
  7. 多种负载均衡算法及其Java代码实现
  8. Arrays和比较器
  9. Boost Thread 编程指南、Boost线程入门教程
  10. matlab生猪的出售时机,数学模型程序代码-Matlab-姜启源-第三章-简单的优化模型.doc...
  11. Mybatis 中事务提交方式
  12. iphone个系列尺寸_iPhone所有机型对比尺寸
  13. 山东济南计算机比赛,第十二届齐鲁软件大赛及首届济南市计算机科技奖颁奖盛典举行...
  14. 菜鸡随笔第二笔:insmod模块时显示已杀死
  15. python表白女神
  16. c++学习笔记(七、异常和I/O)
  17. css内边距属性、外边距属性
  18. 【LeetCode】345. Reverse Vowels of a String 解题报告
  19. python人工智能开发语言_哪些编程语言最适合开发人工智能?
  20. C语言:access函数的使用

热门文章

  1. 你养狗的方法够科学吗?
  2. ps计算机内存不足请保存文件并关闭,保存技巧,如何解决PS内存不足无法存储的错误提示情况...
  3. mp4数据恢复:mp4视频格式化怎么恢复
  4. 在线问卷调查数据表结构设计
  5. word转pdf excel转pdf ppt转pdf pdf转word pdf转excel pdf转ppt pdf转jpg
  6. 自建魔兽世界sf服务器,魔兽世界80自己搭服务器,热度却持续不到一天,全部用命令!...
  7. 制作一个简单的大数据看板(FineReport-帆软)
  8. ThingJS 和three.js对比开发太空漫游技术!3D 可视化
  9. matlab 交互界面设计
  10. 《游戏大师Chris Crawford谈互动叙事》一第 6 章 数学之苦劳