[編集:ライブの例と付随するコードについては、この jsfiddle を参照してください]
three.js を使用して、顕著な特徴を持ついくつかの天体をレンダリングしようとしています。
残念ながら、threejs で球状の高さマップを適用する方法の例は提供されていませんが、高さマップが平面に適用される例はあります。
上記の例を使用して、 a のSphereGeometry();
代わりに aを使用するように変更しましたPlaneGeometry();
明らかに、球のジオメトリは平面のジオメトリとは大きく異なり、結果をレンダリングすると、球はテクスチャの平らな部分として表示されます。
平面の高さマップ コード:
var plane = new THREE.PlaneGeometry( 2000, 2000, quality - 1, quality - 1 );
plane.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
for ( var i = 0, l = plane.vertices.length; i < l; i ++ ) {
var x = i % quality, y = ~~ ( i / quality );
plane.vertices[ i ].y = data[ ( x * step ) + ( y * step ) * 1024 ] * 2 - 128;
}
今、解決策は比較的単純だと思います。for ループで平面の 2 次元座標にマッピングする代わりに、3 次元空間で球の表面座標を見つける必要があります。残念ながら、私は 3D 数学の専門家ではないので、この時点でかなり行き詰っています。
球に適用された高さマップの例とすべてのコードは、この jsfiddleにまとめられています。更新されたjsfiddleは変更された球体を示していますが、高さマップ データの代わりにランダム データを使用しています。
球の 3D ポイントを歪めてこれらの表面の詳細を生成できることは事実ですが、高さマップを使用して行いたいと思います。この JSFiddle は私が得た限りです。ポイントをランダムに変更して球体に岩のような外観を与えますが、明らかにあまり自然に見えません。
編集: 以下は、高さマップ データを球体にマップするために実装したい必要なロジックです。
データを球にマッピングするには、単純な球座標系 (経度 φ、緯度 θ、半径 r) からデカルト座標 (x、y、z) に座標をマッピングする必要があります。通常の高さマッピングで (x, y) のデータ値が z にマッピングされるように、(φ, θ) の値を r にマッピングします。この変換は次のようになります。
x = r × cos φ × sin θ
y = r × sin φ × sin θ
z = r × cos θ
r = Rdefault + Rscale × d(φ, θ)
パラメータ Rdefault と Rscale を使用して、球のサイズとその高さマップを制御できます。