2026年3月23日月曜日

🎡Three.js上でdivタグを動かすCSS2DObjectとフォンシェーディング(鏡面光沢)

 前回字を描くためにSVG使ったが一部文字が欠けてしまったので、別のサンプルを見つけた。DIVタグを3D上で動かすものがあった。

地球と月はSphereBufferGeometryで形を作る。

画像2
glTFのチートシートでは黄色くしてあるところ辺がジオメトリ
				const earthGeometry = new THREE.SphereBufferGeometry( EARTH_RADIUS, 16, 16 );
				const earthMaterial = new THREE.MeshPhongMaterial( {
					specular: 0x333333,
					shininess: 5,
					map: textureLoader.load( 'https://threejs.org/examples/textures/planets/earth_atmos_2048.jpg' ),
					specularMap: textureLoader.load( 'https://threejs.org/examples/textures/planets/earth_specular_2048.jpg' ),
					normalMap: textureLoader.load( 'https://threejs.org/examples/textures/planets/earth_normal_2048.jpg' ),
					normalScale: new THREE.Vector2( 0.85, 0.85 )
				} );
				const earth = new THREE.Mesh( earthGeometry, earthMaterial );

MeshPhongMaterialで鏡面効果

MeshPhongMaterial:このマテリアルは、反射率を計算するために物理的ではないBlinn-Phongモデルを使用しています。MeshLambertMaterialで使用されているLambertianモデルとは異なり、鏡面ハイライトを持つ光沢のあるサーフェス(ニスを塗った木材など)をシミュレートすることができます。

フォンシェーディング(英: Phong shading)は、3次元コンピュータグラフィックスにおける陰影計算の補間技法である。フォン補間と呼ばれることもある。ラスタライズされたポリゴン群をまたいだ法線ベクトルの補間によってピクセルの色を推測する技法であり、「ピクセル単位照明」(per-pixel lighting) を実現するための補間技法として利用される。グーローシェーディングやフラットシェーディングなどの他の補間技法との対比で、これを「フォンシェーディング」と呼ぶ。

画像3
右側がホンさんが考えたシェーディング方法で、まるこくて輝いてみえる。

DIVを3D空間に

				const earthDiv = document.createElement( 'div' );
				earthDiv.className = 'label';
				earthDiv.textContent = 'Earth';
				earthDiv.style.marginTop = '-1em';
				const earthLabel = new CSS2DObject( earthDiv );
				earthLabel.position.set( 0, EARTH_RADIUS, 0 );
				earth.add( earthLabel );

CSS2DObjectするとメッシュにDIVタグを足せるようになる。

CSS2DRendererは、CSS3DRendererの簡易版です。サポートされているのは変換のみです。このレンダラーは、HTML ベースのラベルと 3D オブジェクトを組み合わせたい場合に非常に便利です。ここでも、それぞれの DOM 要素は CSS2DObject のインスタンスにラップされ、シーングラフに追加されます。

画像4
Div要素をinitの外に出して宣言して、animateでレンダリングする前に現在時刻をとってみたが普通に更新した。これは便利だ。


				renderer = new THREE.WebGLRenderer();
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
				document.body.appendChild( renderer.domElement );
				labelRenderer = new CSS2DRenderer();
				labelRenderer.setSize( window.innerWidth, window.innerHeight );
				labelRenderer.domElement.style.position = 'absolute';
				labelRenderer.domElement.style.top = '0px';
				document.body.appendChild( labelRenderer.domElement );

残りのポイントはレンダラーが二つあって


				renderer.render( scene, camera );
				labelRenderer.render( scene, camera );

レンダリングも二度するということ。

おまけ、照明処理

DirectionalLight:特定の方向に放射される光。この光は、あたかも太陽が無限に遠くにあり、そこから発せられる光線はすべて平行であるかのように振る舞います。太陽は、その位置が無限であると考えられるほど遠くにあり、そこからの光線はすべて平行です。この光は影を落とすことができます - 詳細は DirectionalLightShadow のページを参照してください。

🐆SheetJS ブラウザ上JSでExcel処理 VBAも使える

 

SheetJSコミュニティ版は、ほぼすべての複雑なスプレッドシートから有用なデータを抽出し、レガシーソフトウェアでも最新ソフトウェアでも同様に動作する新しいスプレッドシートを生成するための、実戦テスト済みのオープンソースソリューションを提供します。

SheetJS Proは、データ処理を超えたソリューションを提供します: 複雑なテンプレートを簡単に編集したり、スタイリングであなたの内なるピカソを引き出したり、画像/グラフ/ピボットテーブルでカスタムシートを作成したり、数式を評価し、計算をWebアプリケーションに移植したり、一般的なスプレッドシートタスクを自動化したり、その他多くのことができます!


画像
https://editor.p5js.org/setapolo/sketches/PyFayyGl0

WebブラウザからExcelファイルを生成してダウンロードさせる機能が可能になるのは、主に以下のような技術的背景と進歩があるからです:

  1. JavaScriptの進化: ウェブアプリケーションのフロントエンドで動作するJavaScriptは、時間とともに大きく進化しました。特にES6(ECMAScript 2015)以降の仕様では、プロミス(非同期処理)、アロー関数、テンプレートリテラルなどの強力な機能が追加され、より複雑な処理をシンプルに記述できるようになりました。これにより、ブラウザ上で高度なファイル処理やデータ操作が可能になっています。

  2. HTML5とWeb APIの拡張: HTML5の導入とともに、ファイルAPIやBlob(Binary Large Object)APIなど、ブラウザで直接ファイルを扱うためのAPIが拡充されました。これらのAPIを使用することで、ブラウザ上でファイルを生成し、ユーザーにダウンロードさせることができるようになります。特に、Blobオブジェクトを使ってバイナリデータを扱い、URL.createObjectURL()メソッドでそのデータへのリンクを生成し、<a>タグのhref属性に設定することでダウンロードリンクを作成できます。

  3. 外部ライブラリの開発: SheetJSやExcelJSのような外部ライブラリが開発されたことで、開発者はこれらのライブラリを利用することにより、Excelファイルの読み書きを簡単に実装できるようになりました。これらのライブラリは、Excelファイルの構造を理解し、JavaScriptオブジェクトとして扱うことを可能にします。さらに、これらのライブラリはCDNを通じて簡単に利用でき、迅速に機能を実装できる利点があります。

  4. ブラウザの性能向上: 近年のブラウザは大幅に性能が向上しており、以前はサーバーサイドでしか可能ではなかった処理もクライアントサイドで実行できるようになりました。この性能向上により、複雑なデータ処理やファイル操作もブラウザ内でスムーズに行えるようになりました。

Visual Basic for Applications(VBA)は、Excelに組み込まれたスクリプト・プラットフォームである。ユーザーは、スプレッドシート内にユーザー定義関数やマクロコードを含めることができます。
SheetJSワークブックオブジェクトのvbarawプロパティは、VBAマクロやその他のメタデータを含むエンコードされたデータブロブです。
SheetJSのreadメソッドとreadFileメソッドは、デフォルトではVBAメタデータを取り込みません。bookVBAオプションがtrueに設定されると、vbarawブロブが作成されます。

https://docs.sheetjs.com/docs/csf/features/vba

2026年3月22日日曜日

🌐FlatBuffersとProtocol Buffersの違い Protobufはデコードして読む。FlatBuffersはゼロコピー参照で高速だが生成が癖。

 

プロトコルバッファはFlatBuffersと比較的似ていますが、

FlatBuffersではデータにアクセスする前に2次表現へのパース/アンパックのステップが不要で、しばしばオブジェクトごとのメモリ割り当てと結合される点が主に異なっています。コードも一桁大きくなっています。Protocol Buffersにはオプションでテキストのインポート/エクスポートはありません。

JSONとの比較

JSONは非常に読みやすく(だから私たちはオプションのテキスト形式としてJSONを使用しています)、動的型付け言語(JavaScriptなど)と一緒に使用すると非常に便利です。しかし、静的型付け言語からデータをシリアライズする場合、JSONは実行時の効率が悪いという明らかな欠点があるだけでなく、動的型付けシリアライズシステムのために、データにアクセスするために(直感に反して)多くのコードを書かなければならなくなるのです。
TensorFlow Liteは、ネットワークモデルのデータシリアライズ形式としてFlatBuffersを採用しており、標準的なTensorFlowモデルで採用されているProtocol Buffers形式は採用していない。

FlatBuffersは、Protocol Buffers、Thrift、Apache Avro、SBE、Cap'n Protoに似たシリアル化フォーマットを実装したフリーソフトウェアライブラリで、主にWouter van Oortmerssen氏によって開発され、Googleによってオープンソース化されています。

Cap'n ProtoやSBEと同様に「ゼロコピー」デシリアライゼーションをサポートしており、シリアル化されたデータにアクセスする際に、最初にメモリの別の部分にコピーする必要がありません。このため、これらのフォーマットのデータへのアクセスは、JSONやCSV、そして多くの場合プロトコルバッファのような、より広範な処理を必要とするフォーマットのデータよりもはるかに高速です。

シリアル化されたフォーマットにより、すべてのデータを解析することなく、特定のデータ要素(例えば、個々の文字列や整数のプロパティ)にランダムにアクセスすることができます。可変長の整数を使用するプロトコルバッファとは異なり、FlatBuffersでは整数をネイティブサイズでエンコードするため、パフォーマンスに有利ですが、エンコードされた表現が長くなります。

スキーマは名前空間宣言から始まります。これは生成されるコードに対応するパッケージ/名前空間を決定するものです。この例では、MyGame ネームスペースの中に Sample ネームスペースがあります。

FlatBuffersとProtocol Buffers(Protobuf)は、両方ともGoogleが開発したデータのシリアライズ(直列化)形式で、ネットワーク経由でのデータの送受信やファイルへのデータの保存などで使用されます。しかし、その特性と利用場面にはいくつか違いがあります。

  1. Protocol Buffers (Protobuf): Protocol Buffersは、効率的で拡張可能なメカニズムを提供し、構造化データを簡単にシリアライズ(直列化)できるように設計されています。それはバイナリ形式であり、シリアライズとデシリアライズの過程で一部のCPUリソースを消費しますが、生成されるデータは通常小さく、またネットワーク経由で送信する際の帯域幅も少なくて済みます。また、異なるデータ構造間で互換性を保つための機能も提供しています。

  2. FlatBuffers: FlatBuffersもまた、Protocol Buffersと同様にデータをシリアライズするためのものですが、その主な特徴は「ゼロコピー」のデシリアライズです。FlatBuffersが生成するデータはメモリに直接マッピングされ、そのデータを解析するためにはデータのコピーを作成する必要がありません。これにより、デシリアライズの過程でのCPUリソースの使用を削減し、パフォーマンスを向上させることができます。また、生成されるデータは通常Protobufよりも大きいですが、高速なアクセスが必要なゲーム開発やリアルタイムシステムなどでは、その性能の利点が活かされます。

  1. インストール: まず、FlatBuffersコンパイラとランタイムライブラリをインストールします。GitHubのFlatBuffersリポジトリからソースコードをダウンロードしてビルドするか、パッケージマネージャー(例: apt-getbrewvcpkg など)を使ってインストールできます。

  2. スキーマ定義: データ構造を定義するためのスキーマファイル(.fbsファイル)を作成します。このファイルには、シリアル化/デシリアル化するためのテーブル、構造体、および他のデータタイプが定義されます。

namespace MyGame.Sample;

table Monster {
  pos:Vec3;
  mana:int;
  hp:int;
  name:string;
  friendly:bool;
  inventory:[ubyte];
}

root_type Monster;

コード生成: FlatBuffersコンパイラ(flatc)を使って、スキーマファイルからターゲット言語のコードを生成します。

FILEはスキーマ(末尾は.fbsでなければならない)、バイナリー・スキーマ(末尾は.bfbsでなければならない)、JSONファイル(直前のスキーマに準拠)である。の後のBINARY_FILEは、バイナリー・フラットバッファー形式のファイルでなければなりません。
出力ファイルは入力のベース・ファイル名を使って命名され、カレント・ディレクトリか-oで与えられたパスに書き出される。

https://www.mankier.com/1/flatc

--binary,  -b
任意のデータ定義に対してワイヤーフォーマットのバイナリーを生成する。

--json, -t
データ定義に対してテキスト出力を生成する。

--cpp, -c
テーブル/構造体の C++ ヘッダーを生成する。

--go, -g
テーブル/構造体のGoファイルを生成する。

--java, -j
テーブル/構造体用のJavaクラスを生成する。

--dart, -d
テーブル/構造体に Dart クラスを生成する。

--ts, -T
テーブル/構造体にTypeScriptコードを生成する。

--csharp, -n
テーブル/構造体用の C# クラスを生成する。

--python, -p
テーブル/構造体用の Python ファイルを生成する。

--lobster
テーブル/構造体用の Lobster ファイルを生成する。

--lua, -l
テーブル/構造体用のLuaファイルを生成する。

--rust, -r
テーブル/構造体に Rust ファイルを生成する。

--php
テーブル/構造体用の PHP ファイルを生成する。

--kotlin
テーブル/構造体にKotlinクラスを生成する。

--jsonschema
Json スキーマを生成する。

--swift
テーブル/構造体用の Swift ファイルを生成する。

--nim
テーブル/構造体のNimファイルを生成する。

-o PATH
生成されるファイルの先頭に PATH を付ける。

-I PATH
指定したパスでインクルードを検索する。

-M
生成されるファイルに make(1) のルールを表示する。