提示コードの///コメント内部のコードですがキー入力の受付は実装出来たのですがそれに合わせて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
回答1件
あなたの回答
tips
プレビュー