[英]Three.js Using 2D texture\sprite for animation (planeGeometry)
[英]THREE.js How to stop truncation of text in texture made from 2D canvas
人們似乎很普遍地使用這種2d畫布紋理方法在THREE.js場景中生成文本廣告牌,子畫面,覆蓋圖,而不是從導入的圖像文件中生成紋理的替代方法,例如Lee Stemkoski的示例 。
但是,當我針對長度超過幾個字符的文本字符串嘗試這種方法時,完成的圖形對象中的文本將被截斷。
這是一個JSFiddle
這是相關的代碼
function F_Text_Plane_Make_wo_box(text)
{
var canvas1 = document.createElement('canvas');
var context1 = canvas1.getContext('2d');
context1.font = "Bold 40px Arial";
context1.fillStyle = "rgba(155,0,200,0.95)";
context1.fillText(text, 0, 50);
var texture1 = new THREE.Texture(canvas1);
texture1.needsUpdate = true;
var material1 = new THREE.MeshBasicMaterial
( { map: texture1, side:THREE.DoubleSide } );
material1.transparent = true;
var mesh1 = new THREE.Mesh(
new THREE.PlaneGeometry(canvas1.width, canvas1.height),
material1
);
return mesh1;
}
它發生在Windows7筆記本電腦上的Chrome,Opera和Firefox中。
UPDATE
感謝West Langley澄清問題。 看來我們不能輕松,自動地構建一個包含提供的文本字符串且沒有尾隨空白的平面。 可以使用透明性或固定寬度的目標容器來解決此限制。
這是一個JSFiddle
這是相關的代碼
//=============================================================================
function F_Text_onto_Plane(text, Tbox_width, Tbox_depth)
{
var canvas1 = document.createElement('canvas');
var context1 = canvas1.getContext('2d');
canvas1.width = Tbox_width; canvas1.height = Tbox_depth;
context1.font = "Bold 40px Arial"; //... font as big and simple as possible so graphics look smooth
var metric = context1.measureText(text);
var text_len_pixels = metric.width;
//------------ Backing Rectangle ------------
context1.fillStyle = "rgba(255,255,255,0.95)"; //... White
//..x1,y1, x2,y2 origin in top left corner x increasing rightwards, y increasing downwards.
context1.fillRect(0,0, Tbox_width, Tbox_depth); //... rectangle matches the Tbox_width and Tbox_depth
context1.fillStyle = "rgba(255,255,0,0.95)"; //... Yellow, probably change to white in practice.
context1.fillRect(0,0,5+text_len_pixels+5,Tbox_depth); //... very good fit to the particular text
//------------- Paint the Text onto canvas ----------------
context1.fillStyle = "rgba(0,0,0,1)";//... Black.
context1.fillText(text , 0+5, Tbox_depth-5);//... text string, start_x, start_y (start point is bottom left of first character).
//------------------------------------------------
//... canvas contents will be used for a texture
//... note this takes the everything within the canvas area, including the canvas background.
var texture1 = new THREE.Texture(canvas1);
texture1.needsUpdate = true;
var material1 = new THREE.MeshLambertMaterial( { map: texture1, side:THREE.DoubleSide } );
material1.transparent = true;
var mesh1 = new THREE.Mesh(
new THREE.PlaneGeometry(Tbox_width, Tbox_depth),
material1 );
//... can scale the plane e.g. mesh1.scale.set(100,50,1.0);
//... alert ("Checkout: http://stackoverflow.com/questions/4532166/how-to-capture-a-section-of-a-canvas-to-a-bitmap?lq=1");
//... can use .lookat to make plane face a single camera in the scene.
//... can use THREE.js Sprite to make plane look at all cameras in the scene.
return mesh1;
}
您需要設置畫布寬度:
var canvas1 = document.createElement( 'canvas' );
canvas1.width = 512;
canvas1.height = 64;
var texture1 = new THREE.Texture( canvas1 );
texture1.needsUpdate = true;
var material1 = new THREE.MeshLambertMaterial( { map: texture1, side:THREE.DoubleSide, transparent = true } );
現在,當您創建網格幾何時,可以以世界單位而不是像素指定其大小:
var mesh1 = new THREE.Mesh( new THREE.PlaneGeometry( 1024, 128 ), material1 );
three.js r.70
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.