1 先打一个架子,这样容易写代码

先看一个结果

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style>
</head>
<body onload="draw();">
</body>
<script src="lib/three.js"></script>
<script src="lib/SceneUtils.js"></script>
<script src="lib/stats.min.js"></script>
<script src="lib/dat.gui.min.js"></script>
<script>//这里就是三维的代码写入
</script>
</html>

2 定义场景、相机、灯光

 var renderer;//渲染器function initRender() {renderer = new THREE.WebGLRenderer({antialias: true});renderer.setClearColor(new THREE.Color(0x000000)); renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);}var camera;//相机function initCamera() {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200);camera.position.x = 0;camera.position.y = 40;camera.position.z = 50;camera.lookAt(new THREE.Vector3(0, 0, 0));}var scene;//场景function initScene() {scene = new THREE.Scene();}var light;function initLight() {scene.add(new THREE.AmbientLight(0x404040));light = new THREE.DirectionalLight(0xffffff);light.position.set(1, 1, 1);scene.add(light);}function initModel() {//模型var object = new THREE.AxesHelper(500);//scene.add(object);}

完整代码,直接复制可用

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style>
</head>
<body onload="draw();">
</body>
<script src="lib/three.js"></script>
<script src="lib/SceneUtils.js"></script>
<script src="lib/stats.min.js"></script>
<script src="lib/dat.gui.min.js"></script>
<script>var renderer;function initRender() {renderer = new THREE.WebGLRenderer({antialias: true});renderer.setClearColor(new THREE.Color(0x000000)); //renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);}var camera;function initCamera() {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200);camera.position.x = 0;camera.position.y = 40;camera.position.z = 50;camera.lookAt(new THREE.Vector3(0, 0, 0));}var scene;function initScene() {scene = new THREE.Scene();}var light;function initLight() {scene.add(new THREE.AmbientLight(0x404040));light = new THREE.DirectionalLight(0xffffff);light.position.set(1, 1, 1);scene.add(light);}function initModel() {//模型var object = new THREE.AxesHelper(500);//scene.add(object);}//状态var stats;function initStats() {stats = new Stats();document.body.appendChild(stats.dom);}//guivar controls,knot,loadedMesh;function initGui() {//controls = {"radius": 13,"tube": 1.7,"radialSegments": 156,"tubularSegments": 12,"p": 3,"q": 4,"heightScale": 3.5,"rotate": false,redraw: function () {// if (knot) scene.remove(knot);var geom = new THREE.TorusKnotGeometry(controls.radius, controls.tube, Math.round(controls.radialSegments), Math.round(controls.tubularSegments), Math.round(controls.p), Math.round(controls.q), controls.heightScale);knot = createMesh(geom);scene.add(knot);},save:function () {console.log(knot);var result = knot.toJSON();localStorage.setItem("json", JSON.stringify(result));},load:function () {scene.remove(loadedMesh);var json = localStorage.getItem("json");if (json) {var loadedGeometry = JSON.parse(json);var loader = new THREE.ObjectLoader();loadedMesh = loader.parse(loadedGeometry);loadedMesh.position.x -= 50;scene.add(loadedMesh);console.log(loadedMesh);}}};var gui = new dat.GUI();var loadFolder = gui.addFolder("存储");loadFolder.add(controls, "save");loadFolder.add(controls, "load");var meshFolder = gui.addFolder("参数");meshFolder.add(controls, 'radius', 0, 40).onChange(controls.redraw);meshFolder.add(controls, 'tube', 0, 40).onChange(controls.redraw);meshFolder.add(controls, 'radialSegments', 0, 400).step(1).onChange(controls.redraw);meshFolder.add(controls, 'tubularSegments', 1, 20).step(1).onChange(controls.redraw);meshFolder.add(controls, 'p', 1, 10).step(1).onChange(controls.redraw);meshFolder.add(controls, 'q', 1, 15).step(1).onChange(controls.redraw);meshFolder.add(controls, 'heightScale', 0, 5).onChange(controls.redraw);meshFolder.add(controls, 'rotate');controls.redraw();}var step = 0;function render() {if (controls.rotate) {knot.rotation.y = step += 0.01;}renderer.render(scene, camera);}// function generateSprite() {var canvas = document.createElement('canvas');canvas.width = 16;canvas.height = 16;var context = canvas.getContext('2d');var gradient = context.createRadialGradient(canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2);gradient.addColorStop(0, 'rgba(255,255,255,1)');gradient.addColorStop(0.2, 'rgba(0,255,255,1)');gradient.addColorStop(0.4, 'rgba(0,0,64,1)');gradient.addColorStop(1, 'rgba(0,0,0,1)');context.fillStyle = gradient;context.fillRect(0, 0, canvas.width, canvas.height);var texture = new THREE.Texture(canvas);texture.needsUpdate = true;return texture;}// 创建点云function createPointCloud(geom) {var material = new THREE.PointCloudMaterial({color: 0xffffff,size: 3,transparent: true,blending: THREE.AdditiveBlending,map: generateSprite(),depthTest: false});var cloud = new THREE.Points(geom, material);cloud.sortParticles = true;return cloud;}//meshfunction createMesh(geom) {//var meshMaterial = new THREE.MeshNormalMaterial({wireframe: true});meshMaterial.side = THREE.DoubleSide;//var mesh = THREE.SceneUtils.createMultiMaterialObject(geom, [meshMaterial]);return mesh;}//窗口重置function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();render();renderer.setSize(window.innerWidth, window.innerHeight);}function animate() {render();stats.update();requestAnimationFrame(animate);}function draw() {initRender();initScene();initCamera();initLight();initModel();initStats();initGui();animate();window.onresize = onWindowResize;}
</script>
</html>

其中的SceneUtil.js内容,其他两个stats.min.js dat.gui.min.js可以到网上下载,如若不想下载,可以直接我从的资源中下
//SceneUtils.js,读者可以更新自己的内容到这个里面,形成自己需要的lib

THREE.SceneUtils = {createMultiMaterialObject: function ( geometry, materials ) {var group = new THREE.Group();for ( var i = 0, l = materials.length; i < l; i ++ ) {group.add( new THREE.Mesh( geometry, materials[ i ] ) );}return group;},detach: function ( child, parent, scene ) {child.applyMatrix( parent.matrixWorld );parent.remove( child );scene.add( child );},attach: function ( child, scene, parent ) {child.applyMatrix( new THREE.Matrix4().getInverse( parent.matrixWorld ) );scene.remove( child );parent.add( child );}
};

3 注意

在窗口变换大小的时候,重新对视图进行更新,这样即使变动窗口,所有物体依然正常,所以加入窗口变化的事件 window.onresize = onWindowResize;
下面这个函数非常简单地解决了这个问题
//窗口重置

function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
render();
renderer.setSize(window.innerWidth, window.innerHeight);
}

4 完整htmljs下载

这里可以下载
threejs基础demo

threejs基础示例相关推荐

  1. Python面向对象基础示例_创建对象

    Python面向对象基础示例_创建对象 python是面向对象的语言,你可以很轻松的创建一个类和对象.本书代码源自<<Python 3 Object-Oriented Programmin ...

  2. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  3. 运维之DNS服务器Bind9配置解析和基础示例及附带命令

    0x03 Bind 配置解析 实例1.DNS主从区域传输介绍与配置 实例2.DNS区域传输限制 实例3.DNS部分二级域名解析 示例1.采用Bind建立一个A记录DNS服务器 示例2.采用Bind建立 ...

  4. 【ThreeJS基础教程】0.在学习使用ThreeJS之前

    [ThreeJS基础教程]0.在学习使用ThreeJS之前 什么人适合学习ThreeJS 什么人不建议学习ThreeJS或学起来比较累 了解ThreeJS ThreeJS文档在哪 关于<Thre ...

  5. Mybatis3基础示例

    Mybatis3基础示例 一.搭建流程 总体项目结构: 1.Maven依赖 2.配置文件 Mybatis-config.xml 3.封装MybatisUtils工具类 4.其他 二.CURD 1.接口 ...

  6. Cocos2d-x 基础示例-精灵移动2

    Cocos2d-x 基础示例-精灵移动2 先推荐一下红哥的精灵教程 http://blog.csdn.net/honghaier/article/details/8117903 红哥里面使用的ccTo ...

  7. 【ThreeJS基础教程-材质纹理篇】3.2 初识基础网格材质MeshStandardMaterial

    初识标准网格材质 学习ThreeJS的捷径 了解材质的基本知识 材质继承关系 常用的通用材质属性 alphaTest的验证和应用 depthTest和depthWrite应用 渲染哪一面Side 常用 ...

  8. 1. awk基础,awk介绍,awk基本语法,直接使用action,打印列,初识列和行,\$0、\$NF、NF,基础示例,begin模式,end模式

    文章目录 前言 awk介绍 awk基本语法 直接使用action 打印列 初识列和行 \$0.\$NF.NF 基础示例 初识模式(begin end) 总结 友情链接 前言 本小节是awk基础入门课程 ...

  9. 【ThreeJS基础教程-初识Threejs】1.2掌控我们的物体和模型

    掌控我们的物体和模型 学习ThreeJS的捷径 引入帧数监控与调试时使用的GUI 案例解析 引入刷新率检测器stats和lil-gui Stats LIL.GUI (Dat.GUI) 学习ThreeJ ...

最新文章

  1. 号外号外!RancherOS v1.2.0发布啦!
  2. VF01 BAPI :BAPI_BILLINGDOC_CREATEMULTIPLE
  3. 日语编程语言抚子 - 第三版特色初探
  4. Docker 配置,详细说明 daemon.json 的作用
  5. php的联查,PHP的多表联查
  6. 传说中的神器: shared_ptr/weak_ptr/scoped_ptr
  7. history指令显示日期时间
  8. webapp之路--之query media
  9. Fences v3.0.9 中文破解版,总结了一些注意事项,亲测可用
  10. <blockquote>标签 自定义样式
  11. 【Redis】概述以及启动Redis并进入Redis
  12. 华为手机 从服务器获取安装包信息,华为openGauss 获取并校验安装包
  13. 隐马尔可夫模型的三个基本问题(例子说明)
  14. POJ 3696 神TM数论
  15. 因特网,万维网,互联网什么区别?
  16. 微信撤回的消息找不到?你OUT了,看看python程序怎么找回!
  17. 云计算技术基础【15】
  18. 电路中的输入与输出电阻计算
  19. Python 根据两列/多列合并数据表
  20. C语言:找出10000以内所有的素数(质数)

热门文章

  1. 网易云音乐刷听歌量_「PC端」解锁网易云音乐灰色歌曲,让你听歌不用东跑西跑...
  2. 11月1日至11日 全国处理快件47.76亿件
  3. OPPO K9 Pro将于9月26日登场:搭载天玑1200旗舰游戏芯
  4. 张朝阳:Q4盈利远超预期 2021年期待产品爆发
  5. 《消费者报告》杂志:Model 3和Model S被评选为美国最佳豪华汽车
  6. 终于可以自定义喇叭声音:你的特斯拉可以“放屁”吓唬人了
  7. 饿了么上架iPhone 12:最快花呗10分钟拿到手
  8. 使用15年,竟未得授权?真功夫遭李小龙女儿起诉索赔,回应:我们也很疑惑...
  9. 谁说格力不做手机了?格力折叠屏手机了解一下
  10. 搭载高通骁龙855+UFS 3.0闪存 iQOO Neo 855版正式发布