teratail header banner
teratail header banner
質問するログイン新規登録
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回答

1238閲覧

【three.js】スクロール検知で関数発火→カメラを目的地までゆっくり動かしたい

aaachi

総合スコア69

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クリップ

投稿2018/11/13 08:17

0

0

###実装したい事
three.jsで、canvas上でスクロールという挙動があったときに、カメラを目的地までゆっくり移動させるというものです。

###試したこと・考えたこと
・rendererで、常に動いているように見せることは可能ですが、
"ある挙動があった場合に"という条件で、カメラが目的地にたどり着くまでずっと関数を発動させ続けるには?
という部分が、分からずにいます。

・JavaScriptでそういった関数が作れないか調べてみたところ、
mousewheeleventでスクロールを検知させることはできました。
ただ、これでは、スクロールをやめた途端に、カメラが止まってしまうので、目的地までなめらかに移動させることができません。

何か良い方法はありませんでしょうか。
すみませんが、ご教示お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

mousewheelevent を、「カメラを移動させるための関数」とするのではなく、「カメラの移動状態を開始する」関数ととらえれば、できそうですね。

javascript

1 2window.camMoving = false; 3window.camMoviingTime = 0; 4 5window.CamFirst = new THREE.Vector3(0,0,0); //開始位置 6window.CamEnd = new THREE.Vector3(0,0,100); //終了位置 7 8 9function mousewheeleventSample(){ 10 // カメラが移動状態でなければ、カメラ移動状態にする 11 if(!window.camMoving){ 12 window.camMoving = true; 13 window.camMoviingTime = 0; 14 } 15} 16 17 18renderer() { 19 if(window.camMoving){ 20 21 //すごく単純に、50フレーム(1秒弱)でカメラが移動しきる感じにしてあります。 22   if(window.camMoviingTime < 50){ 23 window.camMoviingTime++; //経過フレーム数 24 25 //中間地点の入れ物を作ります。 26 const movingCam = window.CamFirst.lerp(window.CamEnd , window.camMoviingTime * 0.02 ) 27 28 camera.position.copy(movingCam); 29 30 } 31 } 32 33 renderer.render(); 34} 35 36

Vector3.lerp( 目標地点, 目標地点までの係数)  で、開始位置と終了位置の中間の位置を求めることができます。係数は 0で初期位置、1.0で目標位置 となります。  window.camMoviingTimeに0.02をかけているのは、50のときに1.0になるようにするため、です。

投稿2018/11/13 13:51

adrs2002

総合スコア203

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問