国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Threejs進(jìn)階之十一:使用FontLoader和TextGeometry創(chuàng)建三維文字

這篇具有很好參考價(jià)值的文章主要介紹了Threejs進(jìn)階之十一:使用FontLoader和TextGeometry創(chuàng)建三維文字。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在Threejs中我們可以通過FontLoader和TextGeometry結(jié)合使用來創(chuàng)建三維文字,F(xiàn)ontLoader用于加載JSON格式的字體,F(xiàn)ontLoader返回值是表示字體的Shape類型的數(shù)組;TextGeometry用于將文本生成為單一的幾何體。下面我們先來了解下這兩個(gè)類

FontLoader

用于加載JSON格式的字體的類。返回font, 返回值是表示字體的Shape類型的數(shù)組。 其內(nèi)部使用FileLoader來加載文件。

構(gòu)造函數(shù)

FontLoader( manager : LoadingManager )
manager — 加載器所使用的loadingManager。默認(rèn)值為THREE.DefaultLoadingManager.

常用方法

FileLoader常用的方法是.load()方法

.load ( url : String, onLoad : Function, onProgress : Function, onError : Function )
url — 文件的URL或者路徑
onLoad — 在加載完成時(shí)調(diào)用。參數(shù)是將要被加載的font
onProgress — 在加載過程中調(diào)用。參數(shù)是包含total和loaded字節(jié)的XMLHttpRequest實(shí)例。如果server沒有設(shè)置header的Content-Length,則total值為0
onError — 在加載錯(cuò)誤時(shí)調(diào)用

注意

這里需要注意的是,F(xiàn)ontLoader加載的是JSON格式的字體,Threejs默認(rèn)提供了一些json格式的字體在/examples/fonts中,可以將其拷貝到項(xiàng)目中直接使用。如果里面沒有需要的之前,如中文字體,可以通過facetype.js進(jìn)行字體轉(zhuǎn)換.

TextGeometry 文本緩沖幾何體

TextGeometry 用于將文本生成為單一的幾何體的類。 它是由一串給定的文本,以及由加載的font和該幾何體ExtrudeGeometry父類中的設(shè)置所組成的參數(shù)來構(gòu)造的

構(gòu)造函數(shù)

TextGeometry(text : String, parameters : Object)
text — 將要顯示的文本。
parameters — 包含有下列參數(shù)的對(duì)象:

font — THREE.Font的實(shí)例。
size — Float類型。字體大小,默認(rèn)值為100。
height — Float類型。擠出文本的厚度。默認(rèn)值為50。
curveSegments — Integer類型。(表示文本的)曲線上點(diǎn)的數(shù)量。默認(rèn)值為12。
bevelEnabled — Boolean類型。是否開啟斜角,默認(rèn)為false。
bevelThickness — Float類型。文本上斜角的深度,默認(rèn)值為20。
bevelSize — Float類型。斜角與原始文本輪廓之間的延伸距離。默認(rèn)值為8。
bevelSegments — Integer類型。斜角的分段數(shù)。默認(rèn)值為3。

facetype.js在線轉(zhuǎn)換字體

facetype.js在線轉(zhuǎn)換可以將我們想要轉(zhuǎn)換的ttf格式的字體文件轉(zhuǎn)換為json格式的字體文件,其用法非常簡(jiǎn)單,打開網(wǎng)站,在選擇文件中選擇需要轉(zhuǎn)換的ttf文件,默認(rèn)選中Generate a JSON file (.json),不需要修改,點(diǎn)擊下面的Convert即可將ttf轉(zhuǎn)換為json格式,并下載到本地
fontloader.js,ThreeJS,javascript,前端,vue.js,html5,3d
這里需要注意,facetype.js只能轉(zhuǎn)換ttf格式的字體

創(chuàng)建三維文字

對(duì)FontLoader和TextGeometry有了了解后,我們就可以在場(chǎng)景中創(chuàng)建三維文字了,在我們的vue項(xiàng)目中的components文件夾下新建FontView.vue文件,引入threejs并初始化,這些都是創(chuàng)建Threejs的基本套路,這里就不在贅述了,對(duì)Threejs創(chuàng)建的過程還不了解的小伙伴可以看我前面的博客文章。

初始化代碼

<template>
  <div id="scene"></div>
</template>
<script setup>
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'  
import { onMounted } from 'vue'
let scene,camera,renderer,controls
onMounted(()=>{
  init()
}) 
function init() {
  initScene()
  initCamera()
  initAxesHelper()
  initLight()
  initRenderer()
  initControls()
  
  animate()
  window.addEventListener('resize',onWindowResize.bind(this))
}
// 初始化場(chǎng)景
function initScene() {
  scene = new THREE.Scene()
  scene.background = new THREE.Color(0x808080)
}
// 初始化相機(jī)
function initCamera() {
  camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000)
  camera.position.set(0,2,2)  
}
// 輔助軸
function initAxesHelper() {
  const axesHelper = new THREE.AxesHelper(1)
  scene.add(axesHelper)
}
// 燈光
function initLight() {
  const hesLight = new THREE.HemisphereLight(0xffffff,0x444444)
  hesLight.intensity = 0.6
  scene.add(hesLight)

  const dirLight = new THREE.DirectionalLight()
  dirLight.position.set(5,5,5)
  scene.add(dirLight)
}
// 初始化渲染器
function initRenderer() {
  renderer = new THREE.WebGLRenderer({antialias:true}) //抗鋸齒
  // 設(shè)置屏幕像素比
  renderer.setPixelRatio(window.devicePixelRatio)
  // 設(shè)置大小
  renderer.setSize(window.innerWidth,window.innerHeight) 
  // 添加到容器
  document.querySelector('#scene').appendChild(renderer.domElement)
  // 加載陰影
  renderer.shadowMap.enable = true
}
// 初始化軌道控制器
function initControls() {
  controls = new OrbitControls(camera,renderer.domElement)  
  controls.minPolarAngle = 0 //默認(rèn)0
  // 左鍵拖動(dòng)時(shí)視窗垂直方向的最大旋轉(zhuǎn)角度。Math.PI/2 為地平線視角
  controls.maxPolarAngle = 80 / 360 * 2 * Math.PI // 默認(rèn)Math.PI,即可以向下旋轉(zhuǎn)到撒旦視角。 
	controls.update()
}  
function animate() { 
  const delta = clock.getDelta()
 
  renderer.render(scene,camera)
  controls.update(delta) // 當(dāng)controls.enableDamping=true或者controls.autoRotate=true時(shí)調(diào)用
  requestAnimationFrame(animate)
 
}
function onWindowResize() {
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
  renderer.setSize(window.innerWidth,window.innerHeight)
} 
</script>
<style scoped>
</style>

創(chuàng)建三維文字

引用FontLoader和TextGeometry

FontLoader位于three/examples/jsm/loaders/目錄下,
TextGeometry位于three/examples/jsm/geometries/目錄下

import { FontLoader } from 'three/examples/jsm/loaders/FontLoader'
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry' 
創(chuàng)建initFont()方法

創(chuàng)建initFont()方法,在該方法中創(chuàng)建三維文字

創(chuàng)建材質(zhì)

一個(gè)三維文字有兩個(gè)面組成,分別是文字的正面和拉伸出來的面組成,如果只設(shè)置一種材質(zhì),則不會(huì)有三維立體效果,仍然是二維的文字,可以調(diào)整兩個(gè)材質(zhì)的顏色不同來觀察區(qū)別
fontloader.js,ThreeJS,javascript,前端,vue.js,html5,3d

const materials = [
    new THREE.MeshPhongMaterial({
      color:0xffffff,
      flatShading:true
    }),//front
    new THREE.MeshPhongMaterial({color:0xff0000})//back
  ]
實(shí)例化FontLoader對(duì)象
const loader = new FontLoader()
調(diào)用FontLoader的.load方法,在.load方法中設(shè)置要調(diào)用的字體和加載成功時(shí)的回調(diào)

在成功的回調(diào)中主要處理以下幾個(gè)邏輯
1、創(chuàng)建TextGeometry,并設(shè)置相關(guān)參數(shù),
2、創(chuàng)建Mesh,將上面定義的幾何體和材質(zhì)作為參數(shù)傳入
3、設(shè)置Mesh的位置并添加到屏幕

 const font = loader.load(
    // font資源URL 
    'fonts/helvetiker_regular.typeface.json',
    // onLoad回調(diào)
    function (font) { 
      const geometry = new TextGeometry('你好 hello',{
        font:font,
        size:0.25, // Float。字體大小,默認(rèn)值為100。
        height:0.05, //  Float。擠出文本的厚度。默認(rèn)值為50。
        curveSegments: 12, // Integer (表示文本的)曲線上點(diǎn)的數(shù)量。默認(rèn)值為12。
        bevelEnabled: true, // Boolean 是否開啟斜角,默認(rèn)為false。
        bevelThickness: 0.01, // Float。文本上斜角的深度,默認(rèn)值為20。
        bevelSize: 0,// Float。斜角與原始文本輪廓之間的延伸距離。默認(rèn)值為8。
        bevelSegments: 3 // Integer 斜角的分段數(shù)。默認(rèn)值為3。
      })
      const textMesh1 = new THREE.Mesh(geometry,materials)
      textMesh1.position.set(0,0,0)
      scene.add(textMesh1)
    }
  )

在init()函數(shù)中調(diào)用initFont()方法

在init()函數(shù)中調(diào)用initFont()方法,刷新瀏覽器看效果
fontloader.js,ThreeJS,javascript,前端,vue.js,html5,3d

獲取文字寬度并向左偏移

我們得到的是從原點(diǎn)開始的一個(gè)三維文字,如果我們想要讓這個(gè)文字的中心與原點(diǎn)重合,即將文字向左偏移一般,應(yīng)該如何處理呢?
這里我們可以借助Geometry的.computeBoundingBox () 方法,該方法用于計(jì)算當(dāng)前幾何體的的邊界矩形,該操作會(huì)更新已有 .boundingBox。這里注意,邊界矩形不會(huì)默認(rèn)計(jì)算,我們需要調(diào)用該接口指定計(jì)算邊界矩形,否則保持默認(rèn)值 null
我們?cè)谑褂脮r(shí),首先調(diào)用geometry.computeBoundingBox ()方法,然后在geometry.boundingBox屬性中獲取max和min對(duì)應(yīng)的x、y、z的值,我們根據(jù)最大值的x和最小值的x的差值來獲取文字邊界的長(zhǎng)度,從而獲取偏移量

geometry.computeBoundingBox()
// console.log(geometry.boundingBox);
const xOffset = (geometry.boundingBox.max.x - geometry.boundingBox.min.x) / 2
const textMesh1 = new THREE.Mesh(geometry,materials)
textMesh1.position.set(-xOffset,0,0)
scene.add(textMesh1)

fontloader.js,ThreeJS,javascript,前端,vue.js,html5,3d

添加中文

前面我們提到,要想創(chuàng)建三維的中文文字,需要支持中文的字體的json格式字體文件,我們前面也介紹了如何將ttf文件轉(zhuǎn)換為json格式的字體文件,這里我們將轉(zhuǎn)換好的簡(jiǎn)體中文直接使用

 const font = loader.load(
    // font資源URL
    'fonts/KaiTi_Regular.json', 
    // onLoad回調(diào)
    function (font) {
      console.log(font);
      const geometry = new TextGeometry('歡迎',{
        font:font,
        size:0.25, // Float。字體大小,默認(rèn)值為100。
        height:0.08, //  Float。擠出文本的厚度。默認(rèn)值為50。
        curveSegments: 12, // Integer (表示文本的)曲線上點(diǎn)的數(shù)量。默認(rèn)值為12。
        bevelEnabled: true, // Boolean 是否開啟斜角,默認(rèn)為false。
        bevelThickness: 0.01, // Float。文本上斜角的深度,默認(rèn)值為20。
        bevelSize: 0,// Float。斜角與原始文本輪廓之間的延伸距離。默認(rèn)值為8。
        bevelSegments: 3 // Integer 斜角的分段數(shù)。默認(rèn)值為3。
      })
      geometry.computeBoundingBox()
      // console.log(geometry.boundingBox);
      const xOffset = (geometry.boundingBox.max.x - geometry.boundingBox.min.x) / 2
      const textMesh1 = new THREE.Mesh(geometry,materials)
      textMesh1.position.set(-xOffset,0,0)
      scene.add(textMesh1)
    }
  )

讓文字產(chǎn)生倒影效果

要產(chǎn)生倒影效果的三維文字,我們可以在添加一個(gè)文字Mesh,將其沿x軸旋轉(zhuǎn)180度,這樣就得到了文字的倒影
旋轉(zhuǎn)后得到的文字與原文字在z軸上有偏差,對(duì)其進(jìn)行微調(diào)

 geometry.computeBoundingBox()
    
      const xOffset = (geometry.boundingBox.max.x - geometry.boundingBox.min.x) / 2
      const textMesh1 = new THREE.Mesh(geometry,materials)
      textMesh1.position.set(-xOffset,0,0)
      scene.add(textMesh1)
      const textMesh2 =new THREE.Mesh(geometry,materials)
      // console.log(geometry.boundingBox);
      textMesh2.position.set(-xOffset,-geometry.boundingBox.min.y-0.03,geometry.boundingBox.max.z-0.01)
      textMesh2.rotation.x = Math.PI
      scene.add(textMesh2)

fontloader.js,ThreeJS,javascript,前端,vue.js,html5,3d
好了,這次就寫到這里吧,祝小伙伴們勞動(dòng)節(jié)快樂!喜歡的關(guān)注點(diǎn)贊收藏吧文章來源地址http://www.zghlxwxcb.cn/news/detail-737467.html

到了這里,關(guān)于Threejs進(jìn)階之十一:使用FontLoader和TextGeometry創(chuàng)建三維文字的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Threejs入門之十四:Threejs中的組(Group)對(duì)象

    Threejs入門之十四:Threejs中的組(Group)對(duì)象

    組其實(shí)就是一個(gè)集合,將不同的物體添加到一個(gè)組中,就形成了一個(gè)集合; 比如我們可以創(chuàng)建兩個(gè)物體,然后將這兩個(gè)物體使用group.add方法添加到同一個(gè)組中 Group的特性 在Threejs的官方文檔中介紹Group時(shí)說它幾乎與Object3D相同,因此,Group的屬性和Object3D的相同 .children屬性 使用

    2024年02月06日
    瀏覽(23)
  • quarkus依賴注入之十一:攔截器高級(jí)特性上篇(屬性設(shè)置和重復(fù)使用)

    quarkus依賴注入之十一:攔截器高級(jí)特性上篇(屬性設(shè)置和重復(fù)使用)

    這里分類和匯總了欣宸的全部原創(chuàng)(含配套源碼):https://github.com/zq2599/blog_demos 本篇是《quarkus依賴注入》系列的第十一篇,之前的[《攔截器》]學(xué)習(xí)了攔截器的基礎(chǔ)知識(shí),現(xiàn)在咱們要更加深入的了解攔截器,掌握兩種高級(jí)用法:攔截器屬性和重復(fù)使用攔截器 先來回顧攔截器的基

    2024年02月13日
    瀏覽(49)
  • JUC之十一:CompletableFuture用法詳解

    JUC之十一:CompletableFuture用法詳解

    前面介紹了 FutureTask ,獲取異步執(zhí)行結(jié)果通過get的形式,而且會(huì)阻塞主線程,隨著開發(fā)的越來越越復(fù)雜已經(jīng)無法滿足真正開發(fā)場(chǎng)景,我們?cè)囅胍粋€(gè)例子: 我們?cè)俪床说臅r(shí)候,先洗菜,切菜,炒菜,盛菜,然后吃。。。。。。 如果還用原來的 future 來操作的話,需要每一個(gè)步驟

    2024年02月16日
    瀏覽(23)
  • hive學(xué)習(xí)筆記之十一:UDTF

    hive學(xué)習(xí)筆記之十一:UDTF

    為了驗(yàn)證UDTF的功能,咱們要先把表和數(shù)據(jù)都準(zhǔn)備好: 新建名為t16的表: create table t16( person_name string, string_field string ) row format delimited fields terminated by ‘|’ stored as textfile; 本地新建文本文件016.txt,內(nèi)容如下: tom|1:province:guangdong jerry|2:city:shenzhen john|3 導(dǎo)入數(shù)據(jù): load data loca

    2024年04月08日
    瀏覽(20)
  • 軟件設(shè)計(jì)模式系列之十一——裝飾模式

    軟件設(shè)計(jì)模式系列之十一——裝飾模式

    當(dāng)談到設(shè)計(jì)軟件系統(tǒng)時(shí),經(jīng)常需要考慮如何使系統(tǒng)更加靈活、可擴(kuò)展和易維護(hù)。設(shè)計(jì)模式是一種被廣泛采用的方法,用于解決常見的設(shè)計(jì)問題,并提供了一套可重用的解決方案。裝飾模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許您在不改變對(duì)象接口的情況下動(dòng)態(tài)地添

    2024年02月08日
    瀏覽(20)
  • ThreeJS-紋理旋轉(zhuǎn)、重復(fù)(十一)

    ThreeJS-紋理旋轉(zhuǎn)、重復(fù)(十一)

    ?文檔:three.js docs 關(guān)鍵代碼: ? ?//設(shè)置旋轉(zhuǎn)中心,默認(rèn)左下角 ? ? docColorLoader.center.set(0.5,0.5); ? ? //圍繞旋轉(zhuǎn)中心逆時(shí)針旋轉(zhuǎn)45度 ? ? docColorLoader.rotation = Math.PI/4; 完整代碼: template ? div id=\\\"three_div\\\"/div /template ? script import * as THREE from \\\"three\\\"; import { OrbitControls } from \\\"three/example

    2023年04月08日
    瀏覽(18)
  • Verilog基礎(chǔ)之十一、移位寄存器實(shí)現(xiàn)

    Verilog基礎(chǔ)之十一、移位寄存器實(shí)現(xiàn)

    目錄 一、前言 二、工程設(shè)計(jì) ?2.1 工程代碼 2.2 綜合結(jié)果 2.3 仿真結(jié)果 ????移位寄存器SRL在工程中屬于使用頻率較高個(gè)模塊,可用于存儲(chǔ)數(shù)據(jù),實(shí)現(xiàn)串并轉(zhuǎn)換;根據(jù)數(shù)據(jù)移動(dòng)方向可分為左移寄存器,右移寄存器,左移是向數(shù)據(jù)高位移動(dòng),右移是向數(shù)據(jù)低位移動(dòng)。? 工程中包

    2024年02月11日
    瀏覽(25)
  • K8S初級(jí)入門系列之十一-安全

    K8S初級(jí)入門系列之十一-安全

    ? ? 安全是K8S重要的特性,在K8S初級(jí)入門系列之四-Namespace/ConfigMap/Secret章節(jié),我們已經(jīng)已經(jīng)了解了Namespace,Secret與安全相關(guān)的知識(shí)。本篇將梳理K8S在安全方面的策略。主要包括兩個(gè)方面,API安全訪問策略以及Pod安全策略。 在介紹安全前,我們先了解下用戶和用戶組的概念。

    2024年02月16日
    瀏覽(27)
  • 軟件開發(fā)項(xiàng)目文檔系列之十一如何撰寫系統(tǒng)部署方案

    軟件開發(fā)項(xiàng)目文檔系列之十一如何撰寫系統(tǒng)部署方案

    撰寫系統(tǒng)部署文檔在于為項(xiàng)目提供了關(guān)鍵的操作手冊(cè),它不僅標(biāo)準(zhǔn)化了部署流程、傳遞了關(guān)鍵知識(shí),還降低了系統(tǒng)故障排查和修復(fù)的難度,減少了溝通復(fù)雜性,確保了合規(guī)性和可維護(hù)性,為項(xiàng)目的成功實(shí)施和穩(wěn)定運(yùn)行提供了堅(jiān)實(shí)的基礎(chǔ)。系統(tǒng)部署文檔充當(dāng)了項(xiàng)目成功的關(guān)鍵工

    2024年02月05日
    瀏覽(26)
  • Net 高級(jí)調(diào)試之十一:托管堆布局架構(gòu)和對(duì)象分配機(jī)制

    Net 高級(jí)調(diào)試之十一:托管堆布局架構(gòu)和對(duì)象分配機(jī)制

    一、簡(jiǎn)介 今天是《Net 高級(jí)調(diào)試》的第十一篇文章,這篇文章來的有點(diǎn)晚,因?yàn)?,最近比較忙,就沒時(shí)間寫文章了?,F(xiàn)在終于有點(diǎn)時(shí)間,繼續(xù)開始我們這個(gè)系列。這篇文章我們主要介紹托管堆的架構(gòu),對(duì)象的分配機(jī)制,我們?nèi)绾尾檎以谕泄芏焉系膶?duì)象,我學(xué)完這章,很多以前

    2024年02月05日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包