学习threejs,绘制任意字体模型

news2024/12/26 21:16:20

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
  • 二、🍀绘制任意字体模型
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍基于threejs如何绘制任意文字模型,亲测可用。希望能帮助到您。一起学习,加油!加油!

二、🍀绘制任意字体模型

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set
  • 4、初始化light灯光,定义灯光位置,Scene场景加入灯光
  • 5、加载字体模型:加载字体库,在回调函数中创建TextBufferGeometry字体模型,设置字体模型位置和贴图,Scene场景加入字体模型
  • 6、加入controls控制,加入stats监控器,监控帧数信息

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn8(绘制字体模型)</title>
    <script src="lib/threejs/127/three.js-master/build/three.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script>
</head>
<style>
    body {
        margin: 0;
    }

    canvas {
        width: 100%;
        height: 100%;
        display: block;
    }
</style>
<body onload="draw()">

</body>
<script>
    var renderer
    var initRenderer = () => {
      renderer = new THREE.WebGLRenderer({antialias: true})
      renderer.setSize(window.innerWidth, window.innerHeight)
      document.body.appendChild(renderer.domElement)
    }
    var camera
    // 初始化相机
    var initCamera = () => {
      camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000)
      camera.position.set(0, 0, 400)
    }
    var scene
    // 初始化场景
    var initScene = () => {
      scene = new THREE.Scene()
    }
    // 初始化灯光
    var light
    var initLight = () => {
      scene.add(new THREE.AmbientLight(0x404040))
      light = new THREE.DirectionalLight(0xffffff)
      light.position.set(1, 1, 1)
      scene.add(light)
    }

    var fontModel
    var initModel = () => {
      var font
      var loader = new THREE.FontLoader()
      // 加载字体库,中文字体库参照:https://www.cnblogs.com/leisir/articles/5905700.html
      loader.load('lib/threejs/127/three.js-master/examples/fonts/gentilis_regular.typeface.json', res => {
        font = new THREE.TextBufferGeometry('gis sharer, thanks!', {
          font: res,
          size: 100,
          height: 60
        })
        // 运行以后设置font的boundingBox属性对象,如果不运行无法获得。
        font.computeBoundingBox()
        var map = new THREE.TextureLoader().load('data/img/UV_Grid_Sm.jpg')
        var material = new THREE.MeshLambertMaterial({map: map, side:THREE.DoubleSide})
        fontModel = new THREE.Mesh(font, material)
        //设置位置
        fontModel.position.x = - (font.boundingBox.max.x - font.boundingBox.min.x)/2; //计算出整个模型的宽度的一半, 保证字体居中
        fontModel.position.y = - 50
        fontModel.position.z = - 30
        scene.add(fontModel)
      })
    }

    var stats
    var initStats = () => {
      stats = new Stats()
      document.body.appendChild(stats.dom)
    }

    var controls
    var initControls = () => {
      controls = new THREE.OrbitControls(camera, renderer.domElement)
      // 如果使用animate方法时,将此函数删除
      //controls.addEventListener( 'change', render )
      // 使动画循环使用时阻尼或自转 意思是否有惯性
      controls.enableDamping = true
      //动态阻尼系数 就是鼠标拖拽旋转灵敏度
      //controls.dampingFactor = 0.25
      //是否可以缩放
      controls.enableZoom = true
      //是否自动旋转
      controls.autoRotate = false
      //设置相机距离原点的最远距离
      controls.minDistance = 200
      //设置相机距离原点的最远距离
      controls.maxDistance = 600
      //是否开启右键拖拽
      controls.enablePan = true
    }
    // 渲染
    var render = () => {
      renderer.render(scene, camera)
    }
    var onWindowResize = () => {
      camera.aspect = window.innerWidth/window.innerHeight
      camera.updateProjectionMatrix()
      render()
      renderer.setSize(window.innerWidth, window.innerHeight)
    }

    var animate = () => {
      controls.update()
      render()
      stats.update()
      requestAnimationFrame(animate)
    }
    var draw = () => {
      initRenderer()
      initScene()
      initCamera()
      initLight()
      initModel()
      initControls()
      initStats()

      animate()
      window.onresize = onWindowResize
    }
</script>
</html>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端开发之装饰器模式

介绍 装饰器模式 是在不修改对象内部结构的情况下&#xff0c;动态地给对象添加功能的一种设计模式。在软件开发中&#xff0c;有时候我们需要为已有对象添加一些额外的行为&#xff0c;但不希望修改该对象的代码&#xff0c;装饰器模式可以很好的满足这一需求。 在TypeScrip…

面向AI的数据治理市场前景如何?

面向AI的数据治理市场前景如何&#xff1f; 前言面向AI的数据治理 前言 在这个数字化飞速发展的时代&#xff0c;数据已经成为了我们生活和工作中不可或缺的一部分。就像一把双刃剑&#xff0c;既能为我们带来巨大的机遇&#xff0c;也可能带来一些挑战。而数据治理&#xff0…

[spring]springboot日志

文章目录 一. 日志的用途二. 打印日志三. 日志框架门面模式(外观模式)SLF4J框架介绍 四. 日志格式日志级别配置日志级别日志持久化配置日志文件分割配置日志格式 五. 更简单的日志输出 一. 日志的用途 二. 打印日志 得到日志对象: 需要使用日志工厂LoggerFactory RestControl…

统信服务器操作系统【qcow2 镜像空间扩容】方案

使用 qcow2 镜像安装系统,当默认安装系统存储空间不够用时,进行自定义扩容 文章目录 准备环境扩容步骤一、检查环境信息1.查看镜像信息2.查看镜像分区信息3.确认需要扩容的分区名二、扩容1.备份镜像2.创建新的镜像文件,并指定空间3.将系统扩容到新的镜像三、扩容 lvm 分区四…

OpenCV目标检测(1)模板匹配函数matchTemplate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个模板与重叠的图像区域进行比较。 该函数在图像中滑动&#xff0c;使用指定的方法将大小为 w h w \times h wh的重叠块与模板 templ 进行…

安全运维教程(非常详细)从零基础入门到精通,看完这一篇就够了_网络运维手册

一、安全运维-网络 1、IP地址相关 IP地址属于网络层地址&#xff0c;用于标识网络中的节点设备。 IP地址由32bit构成&#xff0c;每8bit一组&#xff0c;共占用4个字节。 IP地址由两部分组成&#xff0c;网络位和主机位。 IP地址分类&#xff1a; 类别网络位子网掩码私有地…

基于单片机的智能校园照明系统

由于校园用电量较大&#xff0c;本设计可以根据实际环境情况的改变&#xff0c;实现实时照明的控制。本设计以单片机芯片为控制芯片&#xff0c;热释电传感器采集教室中学生出入的信息&#xff0c;并把信息传递给单片机芯片&#xff0c;单片机芯片根据传感器传递过来的信息来控…

004_动手实现MLP(pytorch)

import torch from torch import nn from torch.nn import init import numpy as np import sys import d2lzh_pytorch as d2l # 1.数据预处理 mnist_train torchvision.datasets.FashionMNIST(root/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist, t…

水印与标志检测系统源码分享

水印与标志检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

深度解读数字化转型实施中的常见挑战与解决方案

为何深入理解数字化转型中的挑战至关重要&#xff1f; 数字化转型不仅仅是技术升级的过程&#xff0c;更是企业在面对市场变化、客户需求以及内部效率提升等多方面压力时&#xff0c;进行的系统性变革。然而&#xff0c;数字化转型并非一蹴而就&#xff0c;且在实际实施过程中…

app store预览和截屏最新要求6.9寸截屏,没真机的解决方案

IOS又升级了&#xff0c;最新的iphone 16&#xff0c;新出的iphone 16 pro max是6.9英寸的。 而app store的上架流程也随机更新了&#xff0c;不再需要之前的5.5寸屏截图&#xff0c;改为需要6.9寸屏的截图了 5.5寸那些老古董终于退出历史舞台 但是问题来了&#xff0c;现在…

电源设计的艺术:从底层逻辑到工程实践

在电子工程的世界里&#xff0c;电源设计是核心中的核心。它不仅是电子设备的能量源泉&#xff0c;更是整个系统稳定运行的基石。随着科技的不断进步&#xff0c;电源设计的要求也越来越高&#xff0c;从效率、稳定性到体积、成本&#xff0c;每一个维度都是工程师们不断追求的…

Linux相关概念和重要知识点(7)(git、冯诺依曼体系结构)

1.git &#xff08;1&#xff09;版本控制和版本控制器 当我们修改一个项目的时候&#xff0c;一般都会先留下一个备份再修改&#xff0c;并将修改的文件命名为第一次修改、第二次修改......当需要途中的任何版本&#xff0c;或是需要回退到之前的版本时&#xff0c;都能够找…

远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法

现象&#xff1a; 当远程连接服务器时&#xff0c;有时候会出现以下提示&#xff0c;从而导致无法成功连接服务&#xff0c;如下所述&#xff1a; 原因&#xff1a; 远程桌面使用的是“凭据安全支持提供程序协议 (CredSSP) ”&#xff0c;这个协议在未修补的版本中是存在漏…

焊接缺陷检测系统源码分享

焊接缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

实现高效物联网通信:MQTT协议深入解析

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;最初由IBM于1999年开发&#xff0c;目的是为了监控远程设备的传感器和嵌入式系统之间的通信。它的目标是提供一种简单、高效、可靠的消息传递机制&#xff0c;以满足低…

1.5 计算机网络的性能指标

参考&#xff1a;&#x1f4d5;深入浅出计算机网络 目录 速率 带宽 吞吐量 时延 时延带宽积 往返时间 利用率 丢包率 速率 速率是指数据的传送速率&#xff08;即每秒传送多少个比特&#xff09;&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&am…

【React与Vue】如何在页签中监听 LocalStorage 变化?这些方法你都试过吗?

在开发中&#xff0c;你是否会碰到过这样的需求&#xff1a;需要监听 LocalStorage 的变化。这在不同浏览器页签间是相对简单的&#xff0c;因为浏览器提供了内置的 storage 事件。但在同一个浏览器页签下&#xff0c;却没有直接的方式实现。今天&#xff0c;我们探讨下有几种高…

中电金信多模态鉴伪技术抵御AI造假威胁

AI换脸技术&#xff0c;属于深度伪造最常见方式之一&#xff0c;是一种利用人工智能生成逼真的虚假人脸图片或视频的技术。基于深度学习算法&#xff0c;可以将一个人的面部特征映射到另一个人的面部&#xff0c;创造出看似真实的伪造内容。近年来&#xff0c;以AI换脸为代表的…

关于Cursor使用的小白第一视角

最近看破局感觉洋哥总是提到cursor&#xff0c;感觉好火&#xff0c;所以打算学习一下怎么用Cursor&#xff0c;如果可以希望能做一个我自己的网站。 之前从来没用过Cursor。所以&#xff0c;这是一篇小白视角的Cursor使用教程。 如果你也是一个小白&#xff0c;并且对Cursor…