欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

threejs?模型添加文字的多種方式匯總

 更新時間:2023年03月04日 10:43:54   作者:楊大大28  
這篇文章主要介紹了threejs?模型添加文字的幾種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在給幾何體或者導入的模型表面添加文字時,可以用如下方式

1 將文字繪制到canvas中,并將其用作Texture

給正方體某個表面添加文字為例;如下創(chuàng)建一個正方體

// ---------------------------------------------------------------------
// 添加模型
// ---------------------------------------------------------------------
var geometry = new THREE.BoxGeometry( 30,30, 30 );
var materials = [ 
    new THREE.MeshBasicMaterial( { color: 'blue' } ), // right
    new THREE.MeshBasicMaterial( { color: 'yellow' } ), // left
    new THREE.MeshBasicMaterial( { map: new THREE.CanvasTexture(getTextCanvas1()) } ), // top
    new THREE.MeshBasicMaterial( { color: 'black' } ), // bottom
    new THREE.MeshBasicMaterial( { color: 'green' } ), // back
    new THREE.MeshBasicMaterial( { color: 'red' } ) // front 
    ];
var cube = new THREE.Mesh( geometry, materials );
scene.add(cube);

其中正方體頂部表面,使用CanvasTexture作為材質(zhì),如下該材質(zhì)可以用canvas或者img或者視頻元素作為貼圖,下面以canvas為例;

 在canvas中繪制文本,可以通過filltext繪制文本,遍歷可以實現(xiàn)換行的效果

// CanvasTexture
function getTextCanvas1(){ 
    let texts=[{
        name:"北京",
        value:323
    },{
        name:"杭州",
        value:121
    },{
        name:"南京",
        value:56
    }]
    var width=512, height=256; 
    var canvas = document.createElement('canvas');
    canvas.width = width;
    canvas.height = height;
    var ctx = canvas.getContext('2d');
    ctx.fillStyle = '#C3C3C3';
    ctx.fillRect(0, 0, width, height);
    ctx.font = 32+'px " bold';
    ctx.fillStyle = '#2891FF';
    texts.forEach((text,index)=>{
        ctx.fillText(`${text.name}:${text.value}`, 10, 32 * index + 30);
    }) 
    return canvas;
}

效果:

優(yōu)點是可以繪制任意樣式文字,缺點是canvas一旦生成,因為分辨率不再改變,所以在threejs中放大時會模糊

2 用一個透明表面貼在幾何體表面

這種方式適合較規(guī)范的幾何體模型;仍然以上面正方體為例,跟第一種方式原理差不多,將文字繪制在一個透明幾何平面上,然后把平面的位置設(shè)置在剛好覆蓋正方體前表面;

代碼如下

function getTextCanvas2(){
 //用canvas生成圖片
  let canvas = document.createElement("canvas");
  let ctx = canvas.getContext('2d')
  canvas.width = 300
  canvas.height = 300
  //制作矩形
  ctx.fillStyle = "gray"; 
  ctx.fillRect(0, 0, 300, 300)
  //設(shè)置文字
  ctx.fillStyle = "white";
  ctx.font = 'normal 20px "楷體"'
  ctx.fillText('這個平面將被貼在正方體前表面', 0, 20)
 
  //生成圖片
  let url = canvas.toDataURL('image/png');
  //將圖片構(gòu)建到紋理中
  let geometry1 = new THREE.PlaneGeometry(30, 30)
  let material1 = new THREE.MeshBasicMaterial({
    map: new THREE.TextureLoader().load(url),
    side: THREE.DoubleSide,
    opacity: 1
  })
  let rect = new THREE.Mesh(geometry1, material1)
  rect.position.set(0, 0, 25.1)
  scene.add(rect)
}
getTextCanvas2();

效果: 

可以看到?jīng)]有貼到表面,需要調(diào)整z值為15.1, rect.position.set(0, 0, 15.1),看最后效果

 但是平面的顏色將原本正方體顏色覆蓋

 將canvas矩形的顏色和材質(zhì)顏色都設(shè)置為透明即可

  //制作矩形
  ctx.fillStyle = "transparent";  // 設(shè)為透明
 
 
  //將圖片構(gòu)建到紋理中
  let geometry1 = new THREE.PlaneGeometry(30, 30)
  let material1 = new THREE.MeshBasicMaterial({
    map: new THREE.TextureLoader().load(url),
    side: THREE.DoubleSide,
    opacity: 1,
    transparent: true, // 設(shè)為透明
  })

3 使用threejs提供的文字幾何體接口

通過THREE.TextGeometry生成文字幾何體。在一個立方體表面遍歷添加一排文字,效果如下:

 代碼如下:

// ---------------------------------------------------------------------
// 添加文字模型
// ---------------------------------------------------------------------
let texts1=[
{
    name:"北 京",
    value:23
}
,{
    name:"杭 州",
    value:23
},
{
    name:"南 京",
    value:23
},
{
    name:"南 京",
    value:23
} 
,{
    name:"杭 州",
    value:23
},
{
    name:"南 京",
    value:23
},
{
    name:"南 京",
    value:23
}
 
]
texts1.forEach((text,index)=>{
    addTextGeometry(text,index);
})
 
 
// 添加文字geometry
function addTextGeometry(text,index){
    var loader = new THREE.FontLoader(); 
    loader.load("/statics/fonts/chinese.json", function (res) { 
        var geometry = new THREE.TextGeometry(`${text.name}: ${text.value}`, {
            font: res,          // 字體格式
            size: 13,           // 字體大小
            height: 1,          // 字體深度
            curveSegments: 11,  // 曲線控制點數(shù)
            bevelEnabled: true, // 斜角
            bevelThickness: 0.1,  // 斜角的深度
            bevelSize: 1,       // 斜角的大小
            bevelSegments: 1    // 斜角段數(shù)
        });
        var mat = new THREE.MeshPhongMaterial({
            color: "white",
            opacity: 0.8,
            shininess: 1,
        });
        var mesh = new THREE.Mesh(geometry, mat);
        mesh.rotation.y=-Math.PI/2
        mesh.position.set(-151,150-40*index, 15.1);
        scene.add(mesh);
    }); 
}

 其中chinese.json是字體文件,如下 three提供了幾中默認的字體格式,但是都支持英文,如果要添加中文文字,需要借助轉(zhuǎn)換工具,將ttf的文字格式轉(zhuǎn)換為json文件

 轉(zhuǎn)換很簡單:

首先下載字體,參考網(wǎng)站:http://www.dbjr.com.cn/fonts/

  然后使用在線轉(zhuǎn)換工具Facetype.js,轉(zhuǎn)換為json文件后下載即可。也可以將該工具下載到本地,直接運行;

如果在使用過程中,報錯找不到stylename的情況,可能是因為下載的ttf某些屬性缺失,那么可以適當調(diào)整main.js代碼,如下

更多文章請參考文獻

 http://xiaobaigis.com

到此這篇關(guān)于threejs 模型添加文字的幾種方式的文章就介紹到這了,更多相關(guān)threejs 模型添加文字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • threejs太陽光與陰影效果實例代碼

    threejs太陽光與陰影效果實例代碼

    在Threejs中類似于我們現(xiàn)實世界,物體顯示的顏色是由物體本身的顏色及光照的顏色相互疊加而得到的,這篇文章主要給大家介紹了關(guān)于threejs太陽光與陰影效果的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • JavaScript中的時間處理小結(jié)

    JavaScript中的時間處理小結(jié)

    這篇文章主要介紹了JavaScript中的時間處理小結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • JavaScript正則函數(shù)中test和match的區(qū)別解析

    JavaScript正則函數(shù)中test和match的區(qū)別解析

    在javascript中,用于檢測一個字符串是否匹配某個模式用的比較多的就是test和match方法。,這篇文章主要介紹了js正則函數(shù)中test和match的區(qū)別,需要的朋友可以參考下
    2022-11-11
  • js 火狐下取本地路徑實現(xiàn)思路

    js 火狐下取本地路徑實現(xiàn)思路

    火狐下取本地全路徑使用js代碼實現(xiàn),感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-04-04
  • 基于JavaScript打造一款桌面級便簽系統(tǒng)

    基于JavaScript打造一款桌面級便簽系統(tǒng)

    本文將用html,css和JavaScript實現(xiàn)一個簡單的便簽系統(tǒng)。除非手動清空便簽,否則便簽會一直保留,非常方便。感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-02-02
  • JS生成唯一id方式之UUID和NanoID

    JS生成唯一id方式之UUID和NanoID

    這篇文章主要介紹了JS生成唯一id方式之UUID和NanoID,唯一id有了更好的方式,那就是NanoID,今天這篇文章記錄一下NanoID 正在取代 UUID?及js 生成uuid及NanoID的方法,下面來看文章的詳細介紹
    2021-12-12
  • 基于require.js的使用(實例講解)

    基于require.js的使用(實例講解)

    下面小編就為大家?guī)硪黄趓equire.js的使用(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • javascript實現(xiàn)二分查找法實現(xiàn)代碼

    javascript實現(xiàn)二分查找法實現(xiàn)代碼

    javascript實現(xiàn)二分查找法實現(xiàn)代碼...
    2007-11-11
  • typescript配置alias的詳細步驟

    typescript配置alias的詳細步驟

    這篇文章主要介紹了typescript配置alias,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 兩種方法實現(xiàn)文本框輸入內(nèi)容提示消失

    兩種方法實現(xiàn)文本框輸入內(nèi)容提示消失

    第一種方法:基于HTML5 input標簽的新特性 - placeholder 。另外,x-webkit-speech 屬性可以實現(xiàn)語音輸入功能;第二種方法: 用span模擬,定位span,借助JS鍵盤事件判斷輸入,確定span里的內(nèi)容顯示隱藏
    2013-03-03

最新評論