以下のコードを使用して、three.jsシーンで数百行を作成しています
edgeGeometry[i] = new THREE.Geometry();
edgeGeometry[i].vertices[0] = v(x1,y1,z1);
edgeGeometry[i].vertices[1] = v(x2,y2,z2);
edgesMat[i] = new THREE.LineBasicMaterial({
color: 0x6699FF, linewidth: 1, fog:true});
Edge[i] = new THREE.Line(edgeGeometry[i], edgesMat[i]);
Edge[i].type = THREE.Lines;
scene2.add(Edge[i]);
それはうまく動作しますが、「線幅」の値をより大きなORより小さな値に変更すると、シーンに違いは見られません。
線の太さを変更するにはどうすればよいですか?何か案は?
ありがとう、ディミトリス
Windowsを使用していますか?
[〜#〜] angle [〜#〜] で実装されていなかったため、これはWindowsで動作しなかったことを覚えています。
ブラウザでANGLEの代わりにネイティブOpenGLを使用するように設定することにより、回避策で線の太さのレンダリングを実現できます。 Chromeでこれを行う方法についてはこちらをご覧ください 。ネイティブOpenGLに切り替えると、パフォーマンスの違いが発生することに注意してください。
編集:
マスターMrDoob自身 ChromeとFirefox)の両方でこれを行う方法をここに投稿しました 。
注:最新のOpenGLバージョンも線の太さをサポートしなくなったため、この最初のオプションは有効なソリューションではなくなりました。 @ gman彼の答え を確認してください。これは、線の太さを使用したい場合、2番目のオプションが方法であることを意味します。
THREE.MeshLine
クラスを使用する別の解決策もあります。 githubのこのTHREE.MeshLine
クラス は素晴らしい回避策です。特別なTHREE.MeshLineMaterial
が付属しています。ドキュメントによると、次のように簡単です。
- ジオメトリを作成して入力する
THREE.MeshLine
を作成し、ジオメトリを割り当てますTHREE.MeshLineMaterial
を作成しますTHREE.MeshLine
とTHREE.MeshLineMaterial
を使用してTHREE.Mesh
を作成します
これは、Windows ChromeおよびFirefoxで、どちらもANGLE(WebGL to DirectXラッパー)を使用している場合に発生します。
この問題はまだANGLEプロジェクトによって解決されていません。ここで問題にスターを付けて、より高い優先度を取得し、実装される場合は通知を受け取ることができます。
これはもはやANGLEだけの問題ではなく、すべてのプラットフォームの問題です。 WebGL2およびOpenGL 4+コアプロファイルをサポートするためにOpenGL 4+コアプロファイルに切り替える必要があるブラウザーは、1を超える線幅をサポートしていません。OpenGL4.0+仕様のセクションE.2.1から
E.2.1廃止されたがまだサポートされている機能
次の機能は廃止されましたが、コアプロファイルに引き続き存在します。これらはOpenGLの将来のバージョンから削除される可能性があり、コアプロファイルを実装する前方互換性のあるコンテキストで削除されます。
- 幅の広い線-1.0より大きいLineWidth値は、INVALID_VALUEエラーを生成します。
より太い線を描くには、ジオメトリを生成する必要があります。 three.jsにはこのライブラリがあります(Wiltからも指摘されています)
Webglrendererの代わりにCanvasRendererを使用できます。公式ドキュメントをご覧ください here ここで、各図形の線幅= 10の境界線があります。
extrude-polyline
を使用して、太い(ポリ)線と three-simplicial-complex
に対して simplicial complex を生成すると、同じ効果を得ることができます。 =これをthree.jsメッシュに変換するには:
const THREE = require('three');
const extrudePolyline = require('extrude-polyline');
const Complex = require('three-simplicial-complex')(THREE);
function thickPolyline(points, lineWidth) {
const simplicialComplex = extrudePolyline({
// Adjust to taste!
thickness: lineWidth,
cap: 'square', // or 'butt'
join: 'bevel', // or 'miter',
miterLimit: 10,
}).build(points);
// Add a z-coordinate.
for (const position of simplicialComplex.positions) {
position[2] = 0;
}
return Complex(simplicialComplex);
}
const vertices = [[0, 0], [10, 0], [10, 10], [20, 10], [30, 00]];
const geometry = thickPolyline(vertices, 10);
const material = new THREE.MeshBasicMaterial({
color: 0x009900,
side: THREE.DoubleSide
});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
ソース とともに 完全な例 を示します。 (現在、 requirebinの問題 があり、ソースの例をレンダリングできません)。
ポリラインのテクスチャマップを作成する場合は、少し複雑になります。
TubeGeometryを使用して、2つのポイントの間に太い線を作成します:
Helixの緑の線を見る
// line material
var lineMaterial = new THREE.LineBasicMaterial({ color: 0x00ff00 });
let startVector = new THREE.Vector3(
RADI * Math.cos(t),
RADI * Math.sin(t),
3 * t
);
let endVector = new THREE.Vector3(
RADI * Math.cos(t + 10),
RADI * Math.sin(t + 10),
3 * t
);
let linePoints = [];
linePoints.Push(startVector, endVector);
// Create Tube Geometry
var tubeGeometry = new THREE.TubeGeometry(
new THREE.CatmullRomCurve3(linePoints),
512,// path segments
0.5,// THICKNESS
8, //Roundness of Tube
false //closed
);
//add buffer geometry
let tubeBufferGeomtry = new THREE.BufferGeometry().fromGeometry(
tubeGeometry
);
let line = new THREE.Line(tubeGeometry, lineMaterial);
scene.add(line);