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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Three.js

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

JavaScript

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

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

解決済

1回答

3993閲覧

Three.jsの三角形によるオブジェクトの描画方法

neko_ramen

総合スコア7

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Three.js

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

JavaScript

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

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

0クリップ

投稿2017/09/24 02:58

Three.js(WebGL)の三角形の描画と形状の作成についてです。
三角形をもちいてオリジナルな形状を作ろうと思うのですが、上手くいきません。
三角形で球を作る場合を考えてみました。

geometry = new THREE.Geometry(); //球の頂点座標を取得 sphere = new THREE.SphereGeometry(200, 10, 10); //球の頂点座標をgeometryに割り当てていく for (var n = 0; n < sphere.vertices.length; n++) { var x = sphere.vertices[n].x; var y = sphere.vertices[n].y; var z = sphere.vertices[n].z; geometry.vertices.push(new THREE.Vector3(x, y, z)); } //三角形を形成 for (var i = 0; i < sphere.vertices.length; i++) { geometry.faces.push(new THREE.Face3( i, i+1, i+2)); } material = new THREE.MeshPhongMaterial({color: 0xff0000}); mesh = new THREE.Mesh(geometry, material); scene.add(mesh);

new THREE.SphereGeometry(200, 10, 10);で縦横10分割して0から順番に座標をgeometryに割り当てていったのですが、やはり分割の仕方が悪く隣り合う点同士を結んでしまい、正三角形が密集したようなきれいな球になりません。

球に限らず、ある形状の頂点を取り、表面を三角形で覆うように配置するにはどのように考えるべきなのでしょうか。

目標としては下記サイトのような動きを視野に入れております。
https://garden-eight.com/
ばらばらの三角形が集合し、様々なオブジェクトを形成しています。このためには予め用意されているオブジェクトの頂点ではなく個別に三角形を複数用意し、各三角形の頂点の相対位置が変わらないようグループを作り動かす必要がありそうです。そして、3つの頂点の内2つずつを結んで形状を作成していくように思います(見当違いかもしれません)

実際のコードではなく、考え方でも構いませんのでご意見をお聞かせください。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

頂点を球から抜き出し、 geometry.faces に追加する、という、Three.jsでの面生成までの流れは、それで完璧ですね。

頂点情報を球(SphereGeometry)から流用して作成したように、faceもSphereGeometryから有用して作成する必要があります。

//三角形を形成 for (var i = 0; i < sphere.faces.length; i++) { geometry.faces.push(new THREE.Face3(sphere.faces[i].a, sphere.faces[i].b, sphere.faces[i].c)); }

ただ、例として提示していただいたサイトのような動きを作りたいのであれば、さらにもう一工夫必要です。というのも、お察しの通り、移動するのが「頂点基準」ではなく「面基準」で考える必要があるためです。

頂点基準:頂点を動かす だけ
面基準:面の中央となるような場所を動かす→その面に関連づけられている頂点を動かす

そのため、面数*3の頂点を作成し、それに対して新たに面情報を定義する、という流れが必要になります
自分がやってみたのは、こんな感じです。

scene = new THREE.Scene(); geometry = new THREE.Geometry(); //球の頂点座標を取得 sphere = new THREE.SphereGeometry(100, 10, 10); //球の面情報を基準に、頂点を複製していく。 // ループ回数は、面数となる for (var i = 0; i < sphere.faces.length; i++) { // 面に割り当てられている頂点を複製。全く同じ位置の頂点も複製されるけど、必要になるので気にしない geometry.vertices.push(new THREE.Vector3().copy(sphere.vertices[sphere.faces[i].a])); geometry.vertices.push(new THREE.Vector3().copy(sphere.vertices[sphere.faces[i].b])); geometry.vertices.push(new THREE.Vector3().copy(sphere.vertices[sphere.faces[i].c])); //面を作成 geometry.faces.push(new THREE.Face3(i * 3, i * 3 + 1, i * 3 + 2)); } material = new THREE.MeshPhongMaterial({ color: 0xff0000 }); mesh = new THREE.Mesh(geometry, material); scene.add(mesh); // 「面」を移動したいのであれば、以下のような動かし方になる var moveFaceTarget = 100; geometry.vertices[geometry.faces[moveFaceTarget].a].x = geometry.vertices[geometry.faces[moveFaceTarget].a].x + 100; geometry.vertices[geometry.faces[moveFaceTarget].b].x = geometry.vertices[geometry.faces[moveFaceTarget].b].x + 100; geometry.vertices[geometry.faces[moveFaceTarget].c].x = geometry.vertices[geometry.faces[moveFaceTarget].c].x + 100;

動いてる状態はこんな感じです。
http://adrs2002.com/sandbox/movefacevertex.html

思考・考慮の足しになったら幸いです。

投稿2017/09/24 07:26

adrs2002

総合スコア203

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

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

neko_ramen

2017/09/24 23:54

非常に分かりやすくご回答いただき、すぐに導入することが出来ました。 また実装サイトをご提示いただき、感謝のあまり言葉もございません。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問