当前位置: 首页 > article >正文

学习threejs,创建内置几何体,并加入旋转动画

文章目录

  • 一、前言
  • 二、示例代码
  • 三、总结


一、前言

本文基于threejs,实现threejs内置几何体的创建,并加入立方体旋转动画。包含几何体有:球形网格、二十面体、八面体、四面体、长方形平面、立方体、圆形平面等,这些都是学习threejs的基础

二、示例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn5(内置几何体)</title>
    <script src="lib/threejs/91/three.js"></script>
    <style>
        body {
            margin: 0;
        }

        canvas {
            width: 100%;
            height: 100%;
            display: block;
        }
    </style>
</head>
<script>
    var renderer
    var initRenderer = () => {
      renderer = new THREE.WebGLRenderer({antialias: true})
      renderer.setSize(window.innerWidth, window.innerHeight)
      // 设置背景色
      renderer.setClearColor(0x000000, 1.0)
      // 物理像素/css像素, 比值越大越清晰
      renderer.setPixelRatio(window.devicePixelRatio)
      document.body.appendChild(renderer.domElement)
    }

    var camera
    var initCamera = () => {
      camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 )
      camera.position.y = 400
    }

    var scene
    var initScene = () => {
      scene = new THREE.Scene()
    }

    var light
    var initLight = () => {
      if (scene) {
        // 添加环境光
        scene.add(new THREE.AmbientLight(0x404040))
      }

      var light = new THREE.DirectionalLight(0xffffff)
      light.position.set(0, 1, 0)
      scene.add(light)
    }

    var initModel = () => {
      var map = THREE.ImageUtils.loadTexture('data/img/UV_Grid_Sm.jpg')
      //定义纹理在水平和垂直方向简单的重复到无穷大。
      map.wrapS = map.wrapT =THREE.RepeatWrapping
      //定义纹理的各向异性
      map.anisotropy = 16

      //定义兰伯特网孔材质
      var material = new THREE.MeshLambertMaterial({map:map,side:THREE.DoubleSide})

      //球形网格 (半径长度,水平块的密度,垂直块的密度)
      object = new THREE.Mesh(new THREE.SphereGeometry(75,20,10), material)
      object.position.set( -400, 0, 200 )
      scene.add(object)

      //二十面体 (图形大小半径,大于零将不是二十面体,越大越圆滑)
      object = new THREE.Mesh(new THREE.IcosahedronGeometry(75, 0), material)
      object.position.set(-200, 0, 200)
      scene.add(object)

      //八面体(图形大小半径,大于零将不是八面体,越大越圆滑)
      object = new THREE.Mesh(new THREE.OctahedronGeometry(75, 0), material)
      object.position.set(0, 0, 200)
      scene.add(object)

      //四面体(图形大小半径,大于零将不是四面体,越大越圆滑)
      object = new THREE.Mesh( new THREE.TetrahedronGeometry( 75, 0 ), material );
      object.position.set( 200, 0, 200 );
      scene.add(object)

      //长方形平面 (x轴宽度,y轴高度,x方向分段数,y方向分段数)
      object = new THREE.Mesh( new THREE.PlaneGeometry( 100, 100, 1, 1 ), material )
      object.position.set( -400, 0, 0 )
      scene.add( object )

      //立方体 (x轴宽度,y轴高度,z轴深度,沿宽面分段数,沿高度面分段数,沿深度面分段数)
      object = new THREE.Mesh( new THREE.BoxGeometry( 100, 100, 100, 1, 1, 1 ), material )
      object.position.set( -200, 0, 0 )
      scene.add(object)

      //圆形平面 (半径,顶点密度,绘制起点弧度,绘制弧度)
      object = new THREE.Mesh( new THREE.CircleGeometry( 50, 20, 0, Math.PI * 2 ), material )
      object.position.set( 0, 0, 0 )
      scene.add(object)

      // 空心圆平面(内圆半径,外圆半径,分割面越大越圆滑,垂直外边分割面,开始绘制弧度,绘制弧度)
      object = new THREE.Mesh(new THREE.RingGeometry(10, 50, 10, 5, 0, Math.PI * 2 ), material)
      object.position.set( 200, 0, 0 )
      scene.add(object)

      // 圆柱体(头部圆的半径,底部圆半径,高度,上下圆顶点个数,上下面切割线条数,上下面是否显示,开始弧度,绘制弧度)
      object = new THREE.Mesh(new THREE.CylinderGeometry(25, 25, 100, 40, 5), material)
      object.position.set( 400, 0, 0 )
      scene.add(object)

      // 车床模型
      var points = []

      for ( var i = 0; i < 50; i ++ ) {
        points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * Math.sin( i * 0.1 ) * 15 + 50, ( i - 5 ) * 2 ) );
      }

      //(一个vector2的数组分别代表xy轴,生成圆周段的数目,开始弧度,绘制弧度)
      object = new THREE.Mesh(new THREE.LatheGeometry( points, 20 ), material )
      object.position.set( -400, 0, -200 )
      scene.add(object)

      // 救生圈 (救生圈半径,管道直径,基于管道横切顶点数,救生圈横切顶点个数, 越大越圆)
      object = new THREE.Mesh(new THREE.TorusGeometry(50, 20, 20, 20), material)
      object.position.set(-200, 0, -200)
      scene.add(object)

      // 环形扭结模型(图形半径,管道直径,基于管道横切定点数,根据图形半径横切顶点数,绕旋转对称轴的圈数,绕环面的圆的圈数)
      object = new THREE.Mesh(new THREE.TorusKnotGeometry(50, 10, 50, 20), material)
      object.position.set(0, 0, -200)
      scene.add( object )

      // 轴辅助 (每个轴的长度,红线是X轴,绿线是Y轴,蓝线是Z轴)
      object = new THREE.AxisHelper(50)
      object.position.set(200, 0, -200)
      scene.add(object)

      // 箭头辅助(箭头头的方向必须是vecteor3,箭头起点必须是vector3,箭头长度,颜色)
      object = new THREE.ArrowHelper(new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 0 ), 50 ,0x00ffff)
      object.position.set(400, 0, -200)
      scene.add(object)
    }

    var render = () => {
      var timer = Date.now() * 0.0001
      camera.position.x = Math.cos( timer ) * 800
      camera.position.z = Math.sin( timer ) * 800

      camera.lookAt( scene.position )
      for ( var i = 0, l = scene.children.length; i < l; i ++ ) {
        var object = scene.children[ i ];
        object.rotation.x = timer * 5
        object.rotation.y = timer * 2.5
      }
      renderer.render( scene, camera )
    }

    var  animate = () =>  {
      requestAnimationFrame(animate)
      render()
    }

    var onWindowResize = () => {
      camera.aspect = window.innerWidth/window.innerHeight
      camera.updateProjectionMatrix()
      renderer.setSize(window.innerWidth, window.innerHeight)
    }

    //绘制
    function draw() {
      initRenderer()
      initCamera()
      initScene()
      initLight()
      initModel()

      animate()
      // 窗口变动自适应
      window.addEventListener( 'resize', onWindowResize, false )
    }
</script>
<body onload='draw();'>
</body>
</html>

效果如下图:
在这里插入图片描述

三、总结

以上为基于threejs,实现threejs内置几何体的创建,并加入立方体旋转动画的简单案例,希望对您有帮助~
在这里插入图片描述


http://www.kler.cn/a/298259.html

相关文章:

  • 【AIStarter:AI绘画、设计、对话】零基础入门:Llama 3.1 + 千问2快速部署
  • 【重点】(非常全) Node.js的生态有哪些包
  • 2025毕业设计免费指导!!
  • Linux是如何收发网络包的
  • mysql主从复制搭建
  • linux 文件压缩并且切割压缩
  • Mysql基础练习题 1407.排名靠前的旅行者(力扣)
  • 开源DDOS防火墙 零成本搭建DDOS防御
  • JavaWeb【day12】--(SpringBootWeb登录认证)
  • C++学习笔记(14)
  • 无人机动力系统设计之桨叶推力计算
  • 在Webmin上默认状态无法正常显示 Mariadb V11.02及以上版本
  • 企业财税自动化解决方案与其他财务软件的集成与应用
  • 直播相关02-录制麦克风声音,QT 信号与槽,自定义信号和槽
  • 2024网络安全学习路线,最全保姆级教程,学完直接拿捏!
  • Not all code paths return a value. <ArkTSCheck>
  • 此mac无法连接Applie媒体服务,因为“”出现问题。
  • Spring AOP,通知使用,spring事务管理,spring_web搭建
  • python scrapy爬虫框架 抓取BOSS直聘平台 数据可视化统计分析
  • 技术速递|从 .NET 9 中移除 BinaryFormatter