3D词云球体旋转

<template>
  <div
    class="tagBall"
    ref="tagBall"
    @mouseover.self.stop="mouseOver"
    @mouseleave.self.stop="mouseLeave"
  >
    <div v-for="(item, index) in list" :key="index" class="tag">{{ item.name }}<span>({{ item.value }})</span></div>
  </div>
</template>

<script setup>
import {reactive,ref,onMounted } from 'vue'
const list=reactive([{
            "name": "3",
            // 'symbol':'image://data:image/png;base64,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',
            "value": 10,
        }, {
            "name": "2",
            "value": 61,
        }, {
            "name": "6",
            "value": 43,
        }, {
            "name": "3",
            "value": 45,
        }, {
            "name": "6",
            "value": 24,
        }, {
            "name": "12",
            "value": 22,
        }, {
            "name": "43",
            "value": 18,
        }, {
            "name": "23",
            "value": 14,
        }, {
            "name": "432",
            "value": 11,
        }, {
            "name": "423",
            "value": 9,
        }, {
            "name": "42",
            "value": 9,
        },  {
            "name": "2",
            "value": 61,
        }, {
            "name": "6",
            "value": 43,
        }, {
            "name": "3",
            "value": 45,
        }, {
            "name": "6",
            "value": 24,
        }, {
            "name": "12",
            "value": 22,
        }, {
            "name": "43",
            "value": 18,
        }, {
            "name": "23",
            "value": 14,
        }, {
            "name": "432",
            "value": 11,
        }, {
            "name": "423",
            "value": 9,
        }, {
            "name": "42",
            "value": 9,
        }, 
        
         ])
const tagEle=ref("") 
const paper=ref("") 
const RADIUS=ref(105)//大小
const fallLength=ref(500)
const tags=ref([])
const angleX=ref(Math.PI / 500)
const angleY=ref(Math.PI / 500)
const CX=ref("")
const CY=ref("")
const EX=ref("")
const EY=ref("")
const timing=ref(null)
const tagBall=ref()
onMounted(() => {
    tagEle.value = tagBall.value.children;
    paper.value = tagBall.value;
    CX.value = paper.value.offsetWidth / 2;
    CY.value = paper.value.offsetHeight / 2;
    EX.value =
      paper.value.offsetLeft +
      document.body.scrollLeft +
      document.documentElement.scrollLeft;
    EY.value =
      paper.value.offsetTop +
      document.body.scrollTop +
      document.documentElement.scrollTop;
    innit();
    animate();
 
});
   const innit=()=> {
      for (var i = 0; i < tagEle.value.length; i++) {
        var a, b;
        var k = (2 * (i + 1) - 1) / tagEle.value.length - 1;
        var a = Math.acos(k);
        var b = a * Math.sqrt(tagEle.value.length * Math.PI);
        var x = RADIUS.value * Math.sin(a) * Math.cos(b);
        var y = RADIUS.value * Math.sin(a) * Math.sin(b);
        var z = RADIUS.value * Math.cos(a);
        
        tagEle.value[i].style.color =
          "rgb(" +
          parseInt(Math.random() * 255) +
          "," +
          parseInt(Math.random() * 255) +
          "," +
          parseInt(Math.random() * 255) +
          ")";
        tags.value.push({ ele: tagEle.value[i], x, y, z });
      }
    };
    const tag=({ ele, x, y, z })=>{
      var scale = fallLength.value / (fallLength.value- z);
      var alpha = (z + RADIUS.value) / (2 * RADIUS.value);
      ele.style.fontSize = 15 * scale + "px";
      ele.style.opacity = alpha + 0.5;
      ele.style.filter = "alpha(opacity = " + (alpha + 0.5) * 100 + ")";
      ele.style.zIndex = parseInt(scale * 100);
      ele.style.left = x + CX.value - ele.offsetWidth / 2 + "px";
      ele.style.top = y + CY.value - ele.offsetHeight / 2 + "px";
    }
   const animate=()=>{
    timing.value= setInterval(() => {
        rotateX();
        rotateY();
       tags.value.forEach((item) => {
          tag(item);
        });
      }, 20);
    }
    const rotateX=()=>{
      var cos = Math.cos(angleX.value);
      var sin = Math.sin(angleX.value);
      tags.value.forEach((item) => {
        var y1 = item.y * cos - item.z * sin;
        var z1 = item.z * cos + item.y * sin;
        item.y = y1;
        item.z = z1;
      });
    }
      const rotateY=()=>{
      var cos = Math.cos(angleY.value);
      var sin = Math.sin(angleY.value);
      tags.value.forEach((item) => {
        var x1 = item.x * cos - item.z * sin;
        var z1 = item.z * cos + item.x * sin;
        item.x = x1;
        item.z = z1;
      });
    }
    const mouseOver=(event)=>{
      var x = event.clientX - EX.value - CX.value;
      var y = event.clientY - EY.value - CY.value;
      // console.log(x, y);
      angleY.value = x * 0.000001;
      angleX.value = y * 0.000001;
      if (!timing.value) animate();
    }
    const mouseLeave=(event)=>{
      var x = event.clientX - EX.value - CX.value;
      var y = event.clientY - EY.value - CY.value;
      angleY.value = x * 0.00001;
      angleX.value = y * 0.00001;
    }
    const cheMouseOver=()=>{
      clearInterval(timing.value);
      timing.value = null;
    }
</script>
<style lang='scss' scoped>
.tagBall {
  width: 100%;
  height: 90%;
  position: relative;
  overflow: hidden;
  margin-top: 12px;
}
.tag {
  display: block;
  position: absolute;
  left: 0px;
  top: 0px;
  color: #000;
  text-decoration: none;
  font-size: 15px;
  font-family: "微软雅黑";
  font-weight: bold;
  span{
    font-size: 12px;
  }
}
 
</style>
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个动态的3D旋转球体,可以使用HTML5的Canvas和JavaScript来实现。下面是一个简单的实现思路: 1. 首先创建一个Canvas元素,并设置它的宽度和高度。然后获取Canvas的2D上下文对象。 2. 使用JavaScript创建一个球体模型,可以使用Three.js等库来简化这一步骤。 3. 在Canvas上绘制球体。可以使用Canvas的API来绘制球体,或者使用CanvasTexture将球体模型转换为纹理贴图,然后通过Canvas绘制纹理贴图。 4. 使用JavaScript实现球体旋转动画。可以使用requestAnimationFrame来实现平滑的动画效果。 下面是一个示例代码,可以参考一下: ```html <canvas id="canvas"></canvas> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r121/three.min.js"></script> <script> const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); const width = canvas.width = window.innerWidth; const height = canvas.height = window.innerHeight; // 创建球体模型 const geometry = new THREE.SphereGeometry(200, 32, 32); const material = new THREE.MeshBasicMaterial({ color: 0xffffff, map: new THREE.CanvasTexture(ctx.canvas), }); const sphere = new THREE.Mesh(geometry, material); // 添加球体到场景中 const scene = new THREE.Scene(); scene.add(sphere); // 创建相机 const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000); camera.position.z = 500; // 创建渲染器 const renderer = new THREE.WebGLRenderer({ canvas }); renderer.setSize(width, height); // 实现球体旋转动画 function animate() { requestAnimationFrame(animate); sphere.rotation.x += 0.01; sphere.rotation.y += 0.01; // 绘制球体纹理贴图 ctx.clearRect(0, 0, width, height); ctx.fillStyle = 'rgba(255, 255, 255, 0.1)'; ctx.fillRect(0, 0, width, height); ctx.drawImage(renderer.domElement, 0, 0); material.map.needsUpdate = true; renderer.render(scene, camera); } animate(); </script> ``` 这段代码使用Three.js创建了一个球体模型,并在Canvas上绘制了这个球体的纹理贴图。然后使用requestAnimationFrame实现了球体旋转动画。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值