🌓
搜索
 找回密码
 立即注册

threejs入门

塞上雪狼 2022-10-9 07:28:13 49369
今年刚刚接触threejs。这玩意封装得挺不错。为了使大家感观上能够了解threejs.这里直接分享一段代码。看完就知道threejs的套路了。所有的学习资料,源代码,从github上已经足够。5000多的源码分享,天啊。。。
https://github.com/search?q=threejs
 
有几个例子也比较好的:https://github.com/luosijie/threejs-examples 
以下一个案例,配置运行起来可以直接了解到threejs的结构。threejs的JS引用文件自己去官方找。https://threejs.org/
效果示意图:
225141ldafdhcr1rfu814f.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <title>three.js webgl - Simple text from json</title>
  5.     <meta charset="utf-8">
  6.     <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  7.     
  8. </head>
  9. <body>
  10.     
  11.         <script></script>
  12.         <script></script>
  13.         <script></script>
  14.         <script></script>
  15.         <script></script>
  16.         <script></script>
  17.         <script></script>
  18.         <script></script>
  19.         <script>
  20.             var camera, scene, renderer;
  21.             var components = [];
  22.             var selComps = [];
  23.             var controls;
  24.             var mouseInfo;
  25.             var tube;
  26.             var ptone;
  27.             initComp();
  28.             animate();
  29.             
  30.             function initComp() {
  31.                 document.addEventListener('mousedown', onDocumentMouseDown, false);
  32.                 document.addEventListener('mousemove', onDocumentMouseMove, false);
  33.                 document.addEventListener('mouseup', onDocumentMouseUp, false);
  34.                 camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.01, 1e10);
  35.                 camera.up.set(0, 1, 0);
  36.                 controls = new THREE.OrbitControls(camera);
  37.                 scene = new THREE.Scene();
  38.                 
  39.                 camera.position.set(100,100,100);
  40.                 
  41.                 scene.position = new THREE.Vector3(0,0,0);
  42.                 scene.up = new THREE.Vector3(0,0,1);
  43.                 dxplane();
  44.                 cube();
  45.                 sphere();
  46.                 cylinder();
  47.                 var axes = new THREE.AxisHelper(100);
  48.                 scene.add(axes);
  49.                 controls.update();
  50.                 var ambientLight = new THREE.AmbientLight(0x606060);
  51.                 scene.add(ambientLight);
  52.                 //平行光源
  53.                 var directionalLight = new THREE.DirectionalLight(0xffffff);
  54.                 directionalLight.position.set(1, 0.75, 0.5).normalize();
  55.                 scene.add(directionalLight);
  56.                 scene.background = new THREE.Color(0xffffff);
  57.                 renderer = new THREE.WebGLRenderer({ antialias: true });
  58.                 renderer.setPixelRatio(window.devicePixelRatio);
  59.                 renderer.setSize(window.innerWidth, window.innerHeight);
  60.                 document.body.appendChild(renderer.domElement);
  61.                 window.addEventListener('resize', onWindowResize, false);
  62.             } // end init
  63.             
  64.             function initLight() {
  65.                 scene.add(new THREE.AmbientLight(0x444444));
  66.                 light = new THREE.DirectionalLight(0xffffff);
  67.                 light.position.set(0, 0, 0);
  68.                 light.castShadow = true;
  69.                 light.shadow.camera.top = 10;
  70.                 light.shadow.camera.bottom = -10;
  71.                 light.shadow.camera.left = -10;
  72.                 light.shadow.camera.right = 10;
  73.                 //告诉平行光需要开启阴影投射
  74.                 light.castShadow = true;
  75.                 scene.add(light);
  76.             }
  77.             function onWindowResize() {
  78.                 camera.aspect = window.innerWidth / window.innerHeight;
  79.                 camera.updateProjectionMatrix();
  80.                 renderer.setSize(window.innerWidth, window.innerHeight);
  81.             }
  82.             function animate() {
  83.                 requestAnimationFrame(animate);
  84.                 render();
  85.             }
  86.             function render() {
  87.                 if (renderer)
  88.                     renderer.render(scene, camera);
  89.             }
  90.             function onDocumentMouseDown(event) {
  91.                 console.log(event);
  92.                 if (event.button != 0) return;
  93.                 mouseInfo = { start: [event.x, event.y] };
  94.             }
  95.             function onDocumentMouseUp(event) {
  96.                 if (event.button != 0) return;
  97.                 if (event.x - mouseInfo.start[0] != 0 || event.y - mouseInfo.start[1] != 0) return;
  98.                 var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5);
  99.                 vector = vector.unproject(camera);
  100.                 var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
  101.                 var intersects = raycaster.intersectObjects(components);
  102.                 console.log(intersects)
  103.                 // console.log(intersects.length)
  104.                 if (selComps.length > 0) {
  105.                     selComps[0].object.material.transparent = false;
  106.                     selComps[0].object.material.opacity = 1;
  107.                     selComps = [];
  108.                 }
  109.                 if (intersects.length > 0) {
  110.                     // console.log(intersects[0]);
  111.                     intersects[0].object.material.transparent = true;
  112.                     intersects[0].object.material.opacity = 0.5;
  113.                     selComps.push(intersects[0]);
  114.                 }
  115.             }
  116.             function onDocumentMouseMove(event) {
  117.                 if (controls.showRay) {
  118.                     var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5);
  119.                     vector = vector.unproject(camera);
  120.                     var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
  121.                     var intersects = raycaster.intersectObjects(components);
  122.                     if (intersects.length > 0) {
  123.                         var points = [];
  124.                         points.push(new THREE.Vector3(-30, 39.8, 30));
  125.                         points.push(intersects[0].point);
  126.                         var mat = new THREE.MeshBasicMaterial({ color: 0xff0000, transparent: true, opacity: 0.6 });
  127.                         var tubeGeometry = new THREE.TubeGeometry(new THREE.SplineCurve3(points), 60, 0.001);
  128.                         if (tube) scene.remove(tube);
  129.                         if (controls.showRay) {
  130.                             tube = new THREE.Mesh(tubeGeometry, mat);
  131.                             scene.add(tube);
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.             //创建一个平面
  137.             function dxplane() {
  138.                 var planeGeo = new THREE.PlaneGeometry(100, 100, 10, 10);//创建平面
  139.                 var planeMat = new THREE.MeshLambertMaterial({  //创建材料
  140.                     color: 0x666666,
  141.                     wireframe: false
  142.                 });
  143.                 var planeMesh = new THREE.Mesh(planeGeo, planeMat);//创建网格模型
  144.                 planeMesh.position.set(0, 0, -20);//设置平面的坐标
  145.                 planeMesh.rotation.x = -0.5 * Math.PI;//将平面绕X轴逆时针旋转90度
  146.                 scene.add(planeMesh);//将平面添加到场景中
  147.             }
  148.             //创建一个立方体
  149.             function cube() {
  150.                 var cubeGeo = new THREE.CubeGeometry(20, 20, 20, 5, 5, 5);//创建立方体
  151.                 var cubeMat = new THREE.MeshLambertMaterial({//创建材料
  152.                     color: 0x003300,
  153.                     wireframe: false
  154.                 });
  155.                 var cubeMesh = new THREE.Mesh(cubeGeo, cubeMat);//创建立方体网格模型
  156.                 cubeMesh.position.set(20, 10, 0);//设置立方体的坐标
  157.                 scene.add(cubeMesh);//将立方体添加到场景中
  158.             }
  159.             //创建一个球
  160.             function sphere() {
  161.                 var sphereGeo = new THREE.SphereGeometry(16, 40, 40);//创建球体
  162.                 var sphereMat = new THREE.MeshLambertMaterial({//创建材料
  163.                     color: 0x0000FF,
  164.                     wireframe: false
  165.                 });
  166.                 var sphereMesh = new THREE.Mesh(sphereGeo, sphereMat);//创建球体网格模型
  167.                 sphereMesh.position.set(-25, 10, 0);//设置球的坐标
  168.                 scene.add(sphereMesh);//将球体添加到场景
  169.             }
  170.             //创建圆柱体
  171.             function cylinder() {
  172.                 //创建圆柱体
  173.                 var cylinderGeo = new THREE.CylinderGeometry(15, 15, 40, 40, 40);
  174.                 var cylinderMat = new THREE.MeshLambertMaterial({//创建材料
  175.                     color: 0xFF6600,
  176.                     wireframe: false
  177.                 });
  178.                 //创建圆柱体网格模型
  179.                 var cylinderMesh = new THREE.Mesh(cylinderGeo, cylinderMat);
  180.                 cylinderMesh.position.set(0, 20, -40);//设置圆柱坐标
  181.                 cylinderMesh.up.set(0, 0, 1);
  182.                 scene.add(cylinderMesh);//向场景添加圆柱体
  183.             }
  184.         </script>
  185. </body>
复制代码


来源:SketchUpBBS
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

扫一扫

8 回复

宋裕
2022-10-8 22:52:36
真是 收益 匪浅
锄禾日当午,发帖真辛苦。
好好 学习了 确实不错
谁知坛中餐,帖帖皆辛苦!
LZ真是人才
忾暨
2022-10-9 07:14:46
我是来刷分的,嘿嘿
拓展了视野!
路过,支持一下啦
高级模式
游客
返回顶部