質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2730閲覧

球状にオブジェクトを配置する数式について

itouri

総合スコア18

Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

3クリップ

投稿2016/11/24 11:19

css3d_periodictable
上記のサンプルのソースコードを参考に球状にオブジェクトを配置するソースコードを書いているのですが,一行理解できないコードがありました.
303行目の var theta = Math.sqrt( l * Math.PI ) * phi; が何を意味しているのかわかりません.
表示したいオブジェクトの数とπのルートをとっているようですが,この式は何かの公式なのでしょうか.

どなたかご教授願います.

球状にオブジェクトを表示する部分のソースコードを貼っておきます.
実際の動作は上記サイトで sphere を押せば確認できます.

js

1// sphere 2 var vector = new THREE.Vector3(); 3 4 for ( var i = 0, l = objects.length; i < l; i ++ ) { 5 6 var phi = Math.acos( -1 + ( 2 * i ) / l ); 7 var theta = Math.sqrt( l * Math.PI ) * phi; 8 9 var object = new THREE.Object3D(); 10 11 object.position.x = 800 * Math.cos( theta ) * Math.sin( phi ); 12 object.position.y = 800 * Math.sin( theta ) * Math.sin( phi ); 13 object.position.z = 800 * Math.cos( phi ); 14 15 vector.copy( object.position ).multiplyScalar( 2 ); 16 17 object.lookAt( vector ); 18 19 targets.sphere.push( object ); 20 21 }
kjml, milktea👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

thetaとphiについては一般的な天頂角(θ)と方位角(φ)で、今回の場合は球体に毛糸をぐるぐる巻きつけるようにして、元素を配置していくような処理になっています。
ご質問されているMath.sqrt( l * Math.PI )については、調べてみても見つかりませんでした。
ただMath.sqrt( l * Math.PI )は今の例えで言うと、「毛糸をどれだけ往復させるか」というパラメータになるので、何かの公式というよりは、元素数に応じて最適な数値を返してくれるような何か、ということでしょう。
きっと簡単に証明できるんだろうなと思いますが、自分ではパッと思いつきませんでした。

投稿2016/11/26 06:01

milktea

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

球面上の位置を出すために角度を算出しているようですね。
ご質問のその前の行

var phi = Math.acos( -1 + ( 2 * i ) / l );

でXY平面上の位置を表すための角度Φ(phi)を計算し、
次の

var theta = Math.sqrt( l * Math.PI ) * phi;

でZ軸方向に対する角度θ(theta)を計算しています。

「球座標系」で検索するとわかりやすい図が見られると思います。

投稿2016/11/25 23:58

編集2016/11/26 00:01
kjml

総合スコア219

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問