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

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

新規登録して質問してみよう
ただいま回答率
85.35%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

JavaScript

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

WebGL

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

Q&A

解決済

1回答

769閲覧

webGLでキー入力に応じてオブジェクトを移動させる方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

JavaScript

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

WebGL

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

0グッド

0クリップ

投稿2021/04/25 07:24

編集2021/04/25 08:37

提示コードの///コメント内部のコードですがキー入力の受付は実装出来たのですがそれに合わせてmode.Translate.xという値をプラス、マイナスさせることによって移動させたいのですが何故か移動してくれません。直接値をいじると移動できるので設定している値は問題ないのですがが
どうすれば移動できるのでしょうか?

js

1//////////////////////////////////////////////////////////////////////////////////// 2//モデルの情報 3let model = 4{ 5 Translate: 6 { 7 x: 0, 8 y: 0, 9 z: -4, 10 }, 11 12 Rotate: 13 { 14 x: 0, 15 y: 0, 16 z: 0, 17 }, 18 19 Scale: 20 { 21 x: 1, 22 y: 1, 23 z: 1, 24 }, 25}; 26/////////////////////////////////////////////////////////////////////////////////// 27 28 29 30// 31// エントリーポイント 32// 33function main() { 34 const canvas = document.querySelector('#glcanvas'); 35 const gl = canvas.getContext('webgl'); 36 37 38 //webGLコンテキストの作成に失敗した時 39 if (!gl) { 40 alert("webGLコンテキストの作成失敗"); 41 return; 42 } 43 44 // 頂点シェーダーコード 45 const vsSource = ` 46 attribute vec4 aVertexPosition; 47 48 uniform mat4 uModelViewMatrix; 49 uniform mat4 uProjectionMatrix; 50 51 void main() { 52 gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition; 53 } 54 `; 55 56 // フラグメントシェーダー 57 const fsSource = ` 58 void main() { 59 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); 60 } 61 `; 62 63 //シェーダープログラムを作成 64 const shaderProgram = initShaderProgram(gl, vsSource, fsSource); 65 66 67 const programInfo = { 68 program: shaderProgram, 69 attribLocations: { 70 vertexPosition: gl.getAttribLocation(shaderProgram, 'aVertexPosition'), 71 }, 72 73 uniformLocations: { 74 projectionMatrix: gl.getUniformLocation(shaderProgram, 'uProjectionMatrix'), 75 modelViewMatrix: gl.getUniformLocation(shaderProgram, 'uModelViewMatrix'), 76 }, 77 }; 78 79 //描画するオブジェクト 80 const buffers = initBuffers(gl); 81 82 83 //キー入力 84 InputKey(); 85 86 87 88 //描画 89 drawScene(gl, programInfo, buffers); 90} 91 92 93//キー入力 94function InputKey() 95{ 96 97////////////////////////////////////////////////////////////////////////////////////////////// 98//ここのコードです。 キー入力部 99////////////////////////////////////////////////////////////////////////////////////////////// 100 document.body.addEventListener("keydown",event => { 101 102 //スペースキー 103 if(event.key == " ") 104 { 105 //alert("キーが押されました。"); 106 console.log("Space"); 107 } 108 else if(event.key == "ArrowLeft") 109 { 110 //alert("キーが押されました。"); 111 console.log("Left"); 112 model.Translate.x += 1; 113 } 114 else if(event.key == "ArrowRight") 115 { 116 //alert("キーが押されました。"); 117 console.log("Right"); 118 model.Translate.x += -1; 119 120 } 121 else if(event.key == "ArrowUp") 122 { 123 //alert("キーが押されました。"); 124 console.log("Up"); 125 } 126 else if(event.key == "ArrowDown") 127 { 128 //alert("キーが押されました。"); 129 console.log("Down"); 130 } 131 132////////////////////////////////////////////////////////////////////////////////////////////// 133 134 135 136 137}); 138 139} 140 141 142 143//バッファを初期化 144function initBuffers(gl) 145{ 146 147 // 正方形の位置用のバッファを作成します。 148 const positionBuffer = gl.createBuffer(); 149 150 //バッファを適用 151 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); 152 153 //正方形の頂点の配列 154 const positions = [ 155 1.0, 1.0, 156 -1.0, 1.0, 157 1.0, -1.0, 158 -1.0, -1.0, 159 ]; 160 161 //バッファーオブジェクトのデータストアを初期化 162 gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW); 163 164 return { 165 position: positionBuffer, 166 }; 167} 168 169 170//シーンを描画 171function drawScene(gl, programInfo, buffers) 172{ 173 gl.clearColor(0.0, 0.0, 0.0, 1.0); // カラーバッファを初期化 174 gl.clearDepth(1.0); // 深度バッファを初期化 175 gl.enable(gl.DEPTH_TEST); // 深度テスト 176 gl.depthFunc(gl.LEQUAL); // 深度比較する値を設定 177 178 //キャンバスに描画を開始する前に、キャンバスをクリア 179 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 180 181 182 //パースペクティブマトリックスを作成します 183 const fieldOfView = 45 * Math.PI / 180; // in radians 184 const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight; 185 const zNear = 0.1; 186 const zFar = 100.0; 187 188 //射形行列 189 const projectionMatrix = mat4.create(); 190 mat4.perspective(projectionMatrix,fieldOfView,aspect,zNear,zFar); 191///////////////////////////////////////////////////////////////////////////////////////////////////////// 192 //ビュー行列 193 194 //平行移動 195 let translate = new mat4.create(); 196 mat4.translate(translate,translate,[model.Translate.x,model.Translate.y,model.Translate.z]); 197 198 //回転 199 let rotation = new mat4.create(); 200 mat4.rotate(rotation,rotation,0,[model.Rotate.x,model.Rotate.y,model.Rotate.z]); 201 202 //拡大縮小 203 let scale = new mat4.create(); 204 mat4.scale(scale,scale,[model.Scale.x,model.Scale.y,model.Scale.z]); 205///////////////////////////////////////////////////////////////////////////////////////////////////////// 206 207// translate * rotate * scale 208 let modelViewMatrix = new mat4.create(); 209 let rs = new mat4.create(); 210 let trs = new mat4.create(); 211 mat4.multiply(rs,rotation,scale); 212 mat4.multiply(trs,translate,rs); 213 modelViewMatrix = trs; 214 215 216 217 gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position); //バッファーを適用 218 gl.vertexAttribPointer(programInfo.attribLocations.vertexPosition,2,gl.FLOAT,false,0,0); //バッファーの頂点属性を統合 219 gl.enableVertexAttribArray(programInfo.attribLocations.vertexPosition); //バッファーの頂点属性を有効化 220 221 //シェーダーを使う 222 gl.useProgram(programInfo.program); 223 224 // uniform 変数を設定 225 gl.uniformMatrix4fv(programInfo.uniformLocations.projectionMatrix,false,projectionMatrix); 226 gl.uniformMatrix4fv(programInfo.uniformLocations.modelViewMatrix,false,modelViewMatrix); 227 228 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); //描画 229 230 231 232} 233 234//シェーダーを作成 235function initShaderProgram(gl, vsSource, fsSource) 236{ 237 const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource); 238 const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource); 239 240 //シェーダープログラムを作成 241 const shaderProgram = gl.createProgram(); 242 gl.attachShader(shaderProgram, vertexShader); 243 gl.attachShader(shaderProgram, fragmentShader); 244 gl.linkProgram(shaderProgram); 245 246 // もしシェーダープログラムの作成に失敗したら 247 if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { 248 alert('シェーダープログラム作成に失敗: ' + gl.getProgramInfoLog(shaderProgram)); 249 return null; 250 } 251 252 return shaderProgram; 253} 254 255//シェーダーをロード 256function loadShader(gl, type, source) 257{ 258 const shader = gl.createShader(type); 259 260 // ソースをシェーダーオブジェクトに送信します 261 gl.shaderSource(shader, source); 262 263 // コンパイルシェーダー 264 gl.compileShader(shader); 265 266 // コンパイルが成功したかどうか? 267 if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { 268 alert('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader)); 269 gl.deleteShader(shader); 270 return null; 271 } 272 273 return shader; 274} 275 276 window.onload = main; //実行 277

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

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

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

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

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

1T2R3M4

2021/04/25 08:34 編集

//コメント内部のコード コメント内部にコードは見当たりませんが。 ところで、 この質問も削除するのですか。
退会済みユーザー

退会済みユーザー

2021/04/25 08:37

マイナス評価がたくさんついて迷惑だと思ったら削除する予定です。
m.ts10806

2021/04/26 00:40 編集

どちらの観点ですか? 「うわぁ低評価いっぱいついちゃったよ。邪魔しやがって。消しちゃえ!」 か 「こんな低評価つくような質問をして申し訳ない。削除してやり直そう」 か。 前者なら自身の意識を改めない限りまともなアドバイスが得られるはずがなく、後者なら低評価や指摘にあわせて修正すべきです。
退会済みユーザー

退会済みユーザー

2021/04/26 00:40

自分としては丸投げしているつもりはないのですが最近の質問では何が原因なのでしょうか?教えてくれますか?
m.ts10806

2021/04/26 00:46

観点自身ではなく回答者にしたら良いですよ。 そうしなくても、「質問するときのヒント」「推奨していない質問」のページと照らし合わせれば明白かと思いますが。
退会済みユーザー

退会済みユーザー

2021/04/26 00:47

そうなのですか。毎回自分で何を行ったかを書くようにして丸投げにならないよう努力しているのですがそう見えるものなのですね。
K_3578

2021/04/26 01:48 編集

因みに貴方の質問が丸投げと評されているのは貴方がいつまで経っても基礎を学ばずに応用をしようと し続けているからです。 アカウントを削除して作り直しても質問の仕方で誰かと言うことはすぐにわかります。 中には貴方の質問が挙がったら中身を見ずに低評価している人も居るかもしれませんね。 (大体投稿されてすぐに低評価いくつか付いてますし) まず入門してからにしてください。貴方のやっていることはバットの振り方も知らずに プロ野球選手にしてくれと言っているようなものです。
退会済みユーザー

退会済みユーザー

2021/04/26 01:50

何が入門なのでしょうか?ちゃんと自分のコードを読んでいるのですが?
m.ts10806

2021/04/26 02:07

自分がどう思うかじゃなく、見る人がどう思うかでしょ。 よく子供なんかは親に注意されて「やるよ!やってるよ!」って返すけど、そもそもやってないから注意されるわけです。 観点が自分しかないからわからないだけ。客観的な観点なら既にサイトのヘルプに明文化されている。
K_3578

2021/04/26 03:31

500件以上質問しておいてやってることが回答者から得たコードをちょっと書き換えた→動かなくなった→質問→低評価→質問削除しかやってない人が信用されていると思いますか? 普通に学ぶ意欲と姿勢があれば500件も質問なんかしませんよ。異常です。
退会済みユーザー

退会済みユーザー

2021/04/26 08:28 編集

> 自分としては丸投げしているつもりはないのですが最近の質問では何が原因なのでしょうか?教えてくれますか? 下記ページに書いてある事を全て実践すれば、少なくとも丸投げとは判断されないと思いますよ。まあ、既に過去何度も指摘されているでしょうけど。(そもそも実践していたら、質問するまでもなく解決してそうな質問が殆どですが) [質問するときのヒント] https://teratail.com/help/question-tips とりあえず、質問する前にもう少し自分で考えたり、調べる努力をしましょう。開発者の能力は、そういう所から身に付いていき成長に繋がっていくので、それをサボって人に頼ってばかりでは、本当に何も出来ないまま時間だけ過ぎていきますよ。それで何も危機感を覚えないなら、別にそれでいいですけど。考える・調べるという作業自体が嫌いなら、根本的に開発者に向いていないと思います。
退会済みユーザー

退会済みユーザー

2021/04/26 08:32

専門学校に通っていたのですがが卒業してしまったのでここに行きついてしまいました。
K_3578

2021/04/26 08:36

なぜ専門学校に通っていて就職していないのか・・・。 こんなこと暇があったら職の一つでも探したらどうですか。
退会済みユーザー

退会済みユーザー

2021/04/26 08:45

手帳持ちなので上手くいきませんでした。経済的な問題でまた学校に通う定期券も買えないためここに行きつきました。
m.ts10806

2021/04/26 09:46

ほら、指摘をまたスルーする。 低評価欲しくてわざとやってるの?って思われてもおかしくない。
guest

回答1

0

ベストアンサー

window.requestAnimationFrame();関数を使って指定した関数を呼び出して次の再描画の前にアニメーションを更新することで実現しました。

リファレンス: https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame

js

1window.requestAnimationFrame(Update);

投稿2021/04/26 08:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問