3つのJSを使用して3次元グラフを作成しています。私はグラフの単位をTHREE.SPRITE
と表示したいと思います。 SPRITE
を作成するには、最初にキャンバス要素を作成し、その要素にテキストを追加しました。それで、以前作成したキャンバス要素を使ってTHREE.Texture
を作成しました。テクスチャをマップとしてTHREE.SpriteMaterial
を作成し、このスプライトマテリアルを使用してTHREE.SPRITE
を作成しました。このスプライトの素材をシーンに追加しました。レンダラーがTHREE.WebGLRenderer
のインスタンスである場合、テキストのサイズは非常に小さく、レンダラーがTHREE.CanvasRenderer
のインスタンスである場合、テキストのサイズは非常に大きい。ThreeJS:TextスプライトのWebGLレンダラーとキャンバスレンダラーのフォントサイズの違い
以下は、私がSpriteを作成するために使用したコードです。
var canvas = document.createElement('canvas'),
context = canvas.getContext('2d'),
metrics = null,
textHeight = 100,
textWidth = 0,
actualFontSize = 20;
context.font = "normal " + textHeight + "px Arial";
metrics = context.measureText("Sample Text");
var textWidth = metrics.width;
canvas.width = textWidth;
canvas.height = textHeight;
context.font = "normal " + textHeight + "px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillStyle = "#ff0000";
context.fillText("Sample Text", textWidth/2, textHeight/2);
var texture = new THREE.Texture(canvas);
texture.needsUpdate = true;
var material = new THREE.SpriteMaterial({ map: texture, useScreenCoordinates: false, alignment: THREE.SpriteAlignment.center });
material.transparent = true;
//var textObject = new THREE.Sprite(material);
var textObject = new THREE.Object3D();
var sprite = new THREE.Sprite(material);
textObject.textHeight = actualFontSize;
textObject.textWidth = (textWidth/textHeight) * textObject.textHeight;
//sprite.scale.set(textObject.textWidth/textWidth, textObject.textHeight/textHeight, 1);
textObject.add(sprite);
scene.add(textObject);
これはデフォルトの動作ですか、何か間違っていますか? CanvasとWebGLの両方のレンダリングで一貫して機能する修正を提案してください。
ありがとうございます。
残念ながら、 'WebGLRender'と' CanvasRenderer'はスプライトを同じスケールにしません。これは修正すべきものです。 – WestLangley
返事をありがとう。 CanvasRendererとWebGLRendererを使用してサイズを変更したときのサイズの違いが比例/相対であるかどうかを知ることができます。これにより、if-elseブロックを使用して2つのレンダラーに対して異なるロジックを書くことができます。テキストサイズが似ていても(まったく同じではない場合は)十分です。 – Kishor
'WebGLRenderer'では、スケール(1,1,1)を持つスプライトは、同じ位置を持つサイズ(1,1)の' PlaneGeometry'と同じサイズをレンダリングする必要があります。 (three.js r.62) 'CanvasRenderer'では、スケーリングロジックが何であるか分かりません。おそらくあなたはそれを追跡し、改善を提案するかもしれません。 – WestLangley