やったこと
three.jsを使って、pdbファイルのカーボンナノチューブを表示した。
カーボンナノチューブのpdbファイルは、vmdというソフトを使って書き出した。
参考図書に、「はじめてのThree.js」を使ったけれど、pdb_loaderがうまく動かなかった。
githubのサンプル通りに、書いたのに(もちろん一部改変しなければいThree.jsのアドレスとかの所は改変した)表示されなかった。
どうも、この部分、https://github.com/josdirksen/learning-threejs/blob/85f85aeb137f0b01ba96c8b1bfd7019134e596ef/chapter-08/12-load-pdb.html#L88-L111
が動いてくれていない。
コードの中で、geometry.vertices.forEachとか書いてあるけど、「geometry以下にverticesがない」様な事を示唆するエラーが出てくる。(undefinedがどうとか)
ググったら
(https://threejs.org/docs/#examples/en/loaders/PDBLoader)
が関係ありそうだったので見た。
公式refereceではコールバック関数が一つ。
対する「はじめてのThree.js」では二つ。
書籍だから、たぶん情報が古い。昔はこれで動いたんだろう。
コールバック関数を一つにして再度チャレンジ。
この関数から、
- コールバック関数名.geometryAtoms
- コールバック関数名.geometryBonds
- コールバック関数名.json
という感じの3つのデータが取り出せる。
しかし、jsonに原子と結合手のデータが全部入っていたので、そっちを使った。
変更前
- 原子を元素名ごとに色分けしてsphereで表示してた
- 結合手をsylinderで表示してた
変更後
- 原子はすべて単色、
- 結合手は、lineで書く。
var loader = new THREE.PDBLoader();
var group = new THREE.Object3D();
var json=loader.load("http://adoresu-wo-ireru.sakura.ne.jp/sblo_files/anatano-no-saito-no-namae/tekitouna_foruda_demo_tukure/nanotube.pdb", function (geometry) {
var json = geometry.json;
for (var j = 0; j < json.atoms.length; j += 1) {
var sphere = new THREE.SphereGeometry(0.1,8,8);
var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
var mesh = new THREE.Mesh(sphere, material);
mesh.position.set(json.atoms[j][0], json.atoms[j][1], json.atoms[j][2]);
group.add(mesh);
};
for (var j = 0; j < json.bonds.length; j += 1) {
var material2 = new THREE.MeshBasicMaterial( {color: 0x0000ff} );
eval("var ln" + j + "= new THREE.Geometry();");
// console.log(json.bonds.length)
ii=0;
json.bonds[j].forEach(function(element) {
if (ii != 2) {
var aaa = element
eval("ln" + j + ".vertices.push(new THREE.Vector3(json.atoms[aaa][0], json.atoms[aaa][1], json.atoms[aaa][2]));");
// console.log(aaa);
ii+=1;
};
var material4 = new THREE.LineBasicMaterial({color: 0x0000ff});
eval("var line" + j + "= new THREE.Line(ln" + j + ", material4 );");
eval("group.add( line" + j + " );");
});
};
scene.add(group);
});
上の画面の様なCNTがクルクル回るのが、自分のインターネットブラウザの環境からは見える。
ネット上で3Dが動かせている。その内インタラクティブにもできるようになるだろう。
最終目標は、あくまでも「web、地震シミュ、VR」インタラクティブは、視点の移動位でいいかも。
https://wakelet.com/wake/Byo2laLjk0gtq4bQ7jTWy
https://wakelet.com/wake/Sc1WkZ0D8hRqMpg4XsmzR
https://wakelet.com/wake/qJ_XeQsMGNhPtSy-Jo7Lr
https://wakelet.com/wake/q3gvLy4-3EF5j-9p0vDXH
https://wakelet.com/wake/5yjbDnIFt5MeeLAoWjRlK
https://wakelet.com/wake/iS9otuW6Q_bSIIjBl1nMw
https://wakelet.com/wake/Pjyh_wH_QnSL2q-v3mK1f
https://wakelet.com/wake/2fthCYiX8kbLMStVbsZsw
https://wakelet.com/wake/ZbGVmihV7WRFYDlIFcw6n
https://wakelet.com/wake/yn_ryUjlbKdZRN7n7d1lf
https://wakelet.com/wake/XEYU67D_k2d0EA9kVI1yV
https://wakelet.com/wake/Gj6EZIxCYM4luedV13FMY
https://wakelet.com/wake/Fvh2dfhILS-zdC6ij_Lpc
https://wakelet.com/wake/jA7MNSMLkp8j0PKp64HQh
https://wakelet.com/wake/9SX5ugMUZNY6uKHPFlMSp
https://wakelet.com/wake/GYAz3sBfOKe-MfHd-IFAa
https://wakelet.com/wake/Y62E1oIYpoZZIhkEPln7V
https://wakelet.com/wake/mTVFqEiWeY5B6PfeCOD5n
https://wakelet.com/wake/TO_HxVsElMO9cHDIBSzZB
https://wakelet.com/wake/MLB8od4bI6Z7uK3-1vfeh
https://wakelet.com/wake/hM6aeXB4ITTpxx9v8DHo8
https://wakelet.com/wake/1F0khOBKJLSHknkgL7JD3
https://wakelet.com/wake/ZaVSoEl0zsj7FmwgMulOW