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

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

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

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

JavaScript

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

Q&A

解決済

1回答

2949閲覧

Three.jsで作成した3Dオブジェクトから縦横高さの寸法を得たい

Hifumi

総合スコア11

Three.js

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

JavaScript

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

0グッド

1クリップ

投稿2019/07/09 08:00

前提・実現したいこと

Three.jsを使って3Dモデルの描画をし、その図形データをXMLファイルに出力しようとしています。
(Three.jsが動くローカル環境のブラウザでファイルをダウンロードする仕掛け自体はできています)
その過程で、描画している直方体の3Dオブジェクトからwidth、height、depthを得たいのですが、
可能でしょうか?

発生している問題・エラーメッセージ

オブジェクトの情報自体を取得可能なのは、以下の式でオブジェクトの座標(中心の座標)を取得できたことから確認できています。
ObjctName.position.x

同様に
ObjctName.width
みたいに取得できないかと試してみましたが出力ファイルには"undefined"と記述されました。

エラーメッセージ

該当のソースコード

Javascript

1寸法を取得したい直方体オブジェクトは以下のような関数で作成しています。 2Hogehoge = function(w,h,d){ 3 this.id = HOGEHOGE_ID++; 4 var geometry = new THREE.BoxGeometry( w, h,d ); 5   var material = new THREE.MeshBasicMaterial( {color: 0x004400} ); 6 THREE.Mesh.call(this, geometry, material ); 7 this.translateOnAxis(new THREE.Vector3(0,1,0),h/2); 8 this.translateOnAxis(new THREE.Vector3(0,0,1),d/2); 9} 10

試したこと

参考書(「three.jsによるHTML53Dグラフィックス[改訂版]上」)によると、Meshクラス
はコンストラクタの引数として指定されたGeometryクラスをプロパティgeometryとして有し、
オブジェクト作成時に使用したBoxGeometryクラスにはコンストラクタで指定したパラメータを
保持するparametersというプロパティがあるそうです。
そこで
ObjctName.geometry.parameters.width
で取得を試みましたが、
Ugougo.html:960 Uncaught TypeError: Cannot read property 'parameters' of undefined
というエラーが表示されました。おそらくオブジェクトのプロパティgeometry取得の時点で
失敗しているのだと思いますが……

補足情報(FW/ツールのバージョンなど)

環境として使用しているブラウザはGoogle Chrome 75.0です。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の公式サイト

https://threejs.org/docs/#api/en/geometries/BoxGeometry

を見ると

var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( {color: 0x00ff00} ); var cube = new THREE.Mesh( geometry, material );

とあった場合
cube.geometry.parameters.width;でwidthが取得できると書いてあります。

ここで質問者様の
THREE.Mesh.call(this, geometry, material );
というのが気になります。
ここをnewで初期化し、そのオブジェクトに対して.geometry.parameters.width;とすることで解決できるのではないでしょうか?

投稿2019/07/10 12:50

hood

総合スコア351

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

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

Hifumi

2019/07/16 02:16

hood様、回答ありがとうございます。 cube.geometry.parameters.width; でwidthが取得できることを確認しました。 (その時点でTHREE.Mesh.call(...)はそのままでした。ちなみにこの記述ですが、作成しているツールが 他の人の作成したツールを叩き台にしている関係で、その時点で使用されていた記述を踏襲しています) その上で再度もとの動作を調べてみたら、Meshだけ入力するはずのところに (フィルタリングの記述を間違えて)Groupオブジェクトが来ていて、そちらで 記載したエラーを起こしていたことがわかりました(お恥ずかしい)。 それでもhood様の回答をいただいてgeometry.parameters.widthでいいはずだ、 というスタンスで再度確認したために解決しましたので、大変助かりました。 どうもありがとうございました。
hood

2019/07/16 02:21

そうですか。直接の回答ではなかったようですが、間接的には役に立てたようでよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問